Страницы

среда, 21 декабря 2016 г.

Linux шлюз. Автоматическое переключение на резервный канал

Скрипт автоматического переключения на резервный канал с приоритезацией необходимого трафика.



Скрипт будет проверять доступность основного шлюза и ещё нескольких узлов для надежности. В случае недоступности основного канала скрипт перепишет дефолтный маршрут и применит политики ограничения скорости.

Приоритет в данном примере расставлен следующим образом:

  1. Network management
  2. VoIP
  3. CRM & ICMP
  4. HTTP & HTTPS
  5. Остальное.

Топология : 


eth2 - смотрит в локальную сеть
ppp100 - резервный 3G модем.

Скрипт переключения



#!/bin/bash
# STGP GW Internet Connection Checker
# 21.12.2016
# Targets to check
TARGET1=10.10.7.30
TARGET2=10.10.15.81
TARGET3=10.10.0.2
# Source IP address
SOURCE=10.10.15.82
#Default GW
GOODGW=10.10.15.81
# Reserv Interface
ifPPP=ppp100
# Flag. Reserv connection in use if exist
LOCKFILE="/tmp/reserv.lock"
# Results default
RESULT1=0
RESULT2=0
RESULT3=0
# Checks
ping $TARGET1 -I $SOURCE -c 1 -W 1
        if [ $? -ne "0" ];
        then RESULT1=1
        else RESULT1=0
        fi
ping $TARGET2 -I $SOURCE -c 1 -W 1
        if [ $? -ne "0" ];
        then RESULT2=1
        else RESULT2=0
        fi
ping $TARGET3 -I $SOURCE -c 1 -W 1
        if [ $? -ne "0" ];
        then RESULT3=1
        else RESULT3=0
        fi
SUMM=$RESULT1$RESULT2$RESULT3
case $SUMM in
000 ) 
        if [ -f ${LOCKFILE} ]
        then
        ip route del default
        ip route add default via $GOODGW
        /bin/bash /root/config/qos/default.qos.sh
        exit 0
        else echo "All Good. Nothing to do" >> /dev/null
        exit 0
        fi
        ;;
111 )
        if [ ! -f ${LOCKFILE} ]
        then
        ip route del default
        ip route add default dev $ifPPP
        /bin/bash /root/config/qos/LANto3G.sh
        /bin/bash /root/config/qos/3GtoLAN.sh
        touch $LOCKFILE
        logger "SUPPORT GW: Alarm! GW Changed default route!"
        exit 0
        else
        echo "Somthing WRONG" >> /dev/null
        exit 0
        fi
        ;;
* )
        echo "You can to create some action" >> /dev/null
        exit 1
        ;;
esac


Скрипты выставления приоритетов.

Скрипт сброса приоритетов - возвращение дефолтного значения.

#!/bin/bash
#/root/config/qos/default.qos.sh
# Default QoS Settings for Gateway
# You can check QoS by command:
# tc -s class show dev $DEV
#
DEV=eth2
tc=/sbin/tc
$tc qdisc del dev $DEV root

Скрипт выставления приоритета на ppp100 подключении 

#!/bin/bash
#/root/config/qos/LANto3G.sh
# QoS Settings for Gateway Reserv Channel
# You can check QoS by command:
# tc -s class show dev $DEV
#
# You must change  X.X.X.X/32 (VoIP) and Y.Y.Y.Y/26(CRM)
CEIL=2
DEV=ppp100
tc=/sbin/tc
iptables=/sbin/iptables
$tc qdisc del dev $DEV root
$tc qdisc del dev $DEV root
$tc qdisc add dev $DEV root handle 1: htb default 15
$tc class add dev $DEV parent 1: classid 1:1 htb rate ${CEIL}mbit ceil ${CEIL}mbit
$tc class add dev $DEV parent 1:1 classid 1:10 htb rate 1 mbit ceil 1mbit prio 0
$tc class add dev $DEV parent 1:1 classid 1:11 htb rate 512kbit ceil ${CEIL}mbit prio 1
$tc class add dev $DEV parent 1:1 classid 1:12 htb rate 512kbit ceil ${CEIL}mbit prio 2
$tc class add dev $DEV parent 1:1 classid 1:13 htb rate 512kbit ceil ${CEIL}mbit prio 3
$tc class add dev $DEV parent 1:1 classid 1:14 htb rate 128kbit ceil ${CEIL}mbit prio 4
$tc class add dev $DEV parent 1:1 classid 1:15 htb rate 64kbit ceil ${CEIL}mbit prio 5
$tc qdisc add dev $DEV parent 1:12 handle 120: sfq perturb 10
$tc qdisc add dev $DEV parent 1:13 handle 130: sfq perturb 10
$tc qdisc add dev $DEV parent 1:14 handle 140: sfq perturb 10
$tc qdisc add dev $DEV parent 1:15 handle 150: sfq perturb 10
$tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
$tc filter add dev $DEV parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
$tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
$tc filter add dev $DEV parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
$tc filter add dev $DEV parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
$tc filter add dev $DEV parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15
$iptables -t mangle -F
$iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 1
$iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j MARK --set-mark 1
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 23 -j MARK --set-mark 1
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 23 -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 53 -j MARK --set-mark 1
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 53 -j RETURN
$iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j MARK --set-mark 1
$iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j RETURN
$iptables -t mangle -A PREROUTING -d X.X.X.X/32 -j MARK --set-mark 2
$iptables -t mangle -A PREROUTING -d X.X.X.X/32-j RETURN
$iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 3
$iptables -t mangle -A PREROUTING -p icmp -j RETURN
$iptables -t mangle -A PREROUTING -d Y.Y.Y.Y/26 -j MARK --set-mark 3
$iptables -t mangle -A PREROUTING -d Y.Y.Y.Y/26 -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 4
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j MARK --set-mark 4
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j MARK --set-mark 4
$iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j RETURN


Скрипт выставления приоритета на eth2 интерфейсе

#!/bin/bash
#/root/config/qos/3GtoLAN.sh 
# QoS Settings for Gateway Reserv Channel
# You can check QoS by command:
# tc -s class show dev $DEV
## You must change  X.X.X.X/32 (VoIP) and Y.Y.Y.Y/26(CRM)
CEIL=2
DEV=eth2
tc=/sbin/tc
iptables=/sbin/iptables
$tc qdisc del dev $DEV root
$tc qdisc del dev $DEV root
$tc qdisc add dev $DEV root handle 1: htb default 15
$tc class add dev $DEV parent 1: classid 1:1 htb rate ${CEIL}mbit ceil ${CEIL}mbit
$tc class add dev $DEV parent 1:1 classid 1:10 htb rate 1 mbit ceil 1mbit prio 0
$tc class add dev $DEV parent 1:1 classid 1:11 htb rate 512kbit ceil ${CEIL}mbit prio 1
$tc class add dev $DEV parent 1:1 classid 1:12 htb rate 512kbit ceil ${CEIL}mbit prio 2
$tc class add dev $DEV parent 1:1 classid 1:13 htb rate 512kbit ceil ${CEIL}mbit prio 3
$tc class add dev $DEV parent 1:1 classid 1:14 htb rate 128kbit ceil ${CEIL}mbit prio 4
$tc class add dev $DEV parent 1:1 classid 1:15 htb rate 64kbit ceil ${CEIL}mbit prio 5
$tc qdisc add dev $DEV parent 1:12 handle 120: sfq perturb 10
$tc qdisc add dev $DEV parent 1:13 handle 130: sfq perturb 10
$tc qdisc add dev $DEV parent 1:14 handle 140: sfq perturb 10
$tc qdisc add dev $DEV parent 1:15 handle 150: sfq perturb 10
$tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
$tc filter add dev $DEV parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
$tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
$tc filter add dev $DEV parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
$tc filter add dev $DEV parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
$tc filter add dev $DEV parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15
$iptables -t mangle -F
$iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 1
$iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 1
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 23 -j MARK --set-mark 1
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 23 -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 53 -j MARK --set-mark 1
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 53 -j RETURN
$iptables -t mangle -A PREROUTING -p udp -m udp --sport 53 -j MARK --set-mark 1
$iptables -t mangle -A PREROUTING -p udp -m udp --sport 53 -j RETURN
$iptables -t mangle -A PREROUTING -s X.X.X.X/32  -j MARK --set-mark 2
$iptables -t mangle -A PREROUTING -s X.X.X.X/32  -j RETURN
$iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 3
$iptables -t mangle -A PREROUTING -p icmp -j RETURN
$iptables -t mangle -A PREROUTING -s Y.Y.Y.Y/26 -j MARK --set-mark 3
$iptables -t mangle -A PREROUTING -s Y.Y.Y.Y/26 -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 4
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j MARK --set-mark 4
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j RETURN
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j MARK --set-mark 4
$iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j RETURN 



Комментариев нет:

Отправить комментарий