Приветствую, Уважаемые!
Пишу (переделываю) скрипт на переключение между провайдерами (одновременный доступ). Все примеры в инете идут с проверкой на доступность шлюзов провайдеров, а если инет лежит у самого провайдера, то мне совсем такой провайдер не нужен в multipath-маршруте (через nexthop). Значит нужно проверить доступность адресов интернета. Сначала думал пинг на ya.ru, потом решил, что наверное лучше обойтись без DNS и решил делать пинги на DNS-сервера гугла 8.8.8.8 и 8.8.4.4 (можно и другие предложения рассмотреть - это, то что в голову пришло, больше ничего не пришло)
Замечательно, но если уже лежит первый провайдер (eth1) и default gateway сделан через второго (eth4), то
ping -I eth1 8.8.8.8 - не знает куда слать пакет - или знает? И это я ничего не понимаю? При этом ping -I 192.168.20.2 8.8.8.8 - работает но пакеты идут через eth4.
Я и правда не всё понимаю, т.к. не всё разжёвано в «Linux Advanced Routing & Traffic Control HOWTO».
Короче вот скрипт:
#!/bin/bash
GW1="192.168.20.1"
GW2="192.168.30.1"
IPADDR1="8.8.8.8" # DNS google
IPADDR2="8.8.4.4" # DNS google
IF1="eth1"
IF2="eth4"
PROV1="/home/ssv/scripts/rc.prov1.sh"
PROV2="/home/ssv/scripts/rc.prov2.sh"
ROUTING2GW="/home/ssv/scripts/rc.routing.sh"
check_real_gates()
{
if ping -I $IF1 -c5 -l5 -W2 $GW1 2>&1 | grep "100% packet loss" > /dev/null && ping -I $IF2 -c5 -l5 -W2 $GW2 2>&1 | grep "100% packet loss" > /dev/null ; # Если оба провайдера лежат
then echo WARNING TWO GATEWAYS Is DOWN!!! ; logger WARNING TWO GATEWAYS Is DOWN!!!;
elif ping -I $IF1 -c5 -l5 -W2 $GW1 2>&1 | grep "100% packet loss" > /dev/null ; # иначе если лежит первый
then $PROV2 ; # запускаем скрипт на второго провайдера
elif ping -I $IF2 -c5 -l5 -W2 $GW2 2>&1 | grep "100% packet loss" > /dev/null ; # иначе если жив первый
then $PROV1 ; # то запускаем скрипт на первого провайдера
else $ROUTING2GW ;
fi
}
change_GW1_GW2()
{
if ping -I $IF1 -c5 -l5 -W2 $IPADDR1 2>&1 | grep "64 bytes from" > /dev/null || ping -I $IF2 -c5 -l5 -W2 $IPADDR1 2>&1 | grep "64 bytes from" > /dev/null ;
then GW1=$IPADDR1 ; GW2=$IPADDR1 ;
elif ping -I $IF1 -c5 -l5 -W2 $IPADDR2 2>&1 | grep "64 bytes from" > /dev/null || ping -I $IF2 -c5 -l5 -W2 $IPADDR2 2>&1 | grep "64 bytes from" > /dev/null ;
then GW1=$IPADDR1 ; GW2=$IPADDR1 ;
else : ; # т.е. google не пингуется, тогда ничего не меняем, пингуем шлюзы провайдеров.
fi
}
while : ; do
change_GW1_GW2
check_real_gates
sleep 3
done
#!/bin/bash
# Определим некоторые переменные. Пусть $IF1 будет именем первого интерфейса (if1 на рисунке), а $IF2 -- именем второго.
# Тогда $IP1 будет IP адресом $IF1 , а $IP2 -- IP адресом $IF2 .
# Далее, $GW1 это IP-адрес шлюза провайдера 1, а GW2 -- IP адрес шлюза провайдера 2.
# Наконец, $GW1_NET это IP сеть, к которой принадлежит $GW1 , а GW2_NET -- сеть, к которой принадлежит GW2 .
IF0="eth0"
IF1="eth1"
IF2="eth4"
#IP0= "192.168.0.26"
IP1="192.168.20.2"
IP2="192.168.30.2"
GW1="192.168.20.1"
GW2="192.168.30.1"
GW1_NET="192.168.20.0/24"
GW2_NET="192.168.30.0/24"
LAN_NET="192.168.0.0/24"
ip route flush table T1 #обнуляем первую таблицу маршрутов
ip route flush table T2 #обнуляем вторую таблицу маршрутов
ip route add $GW1_NET dev $IF1 src $IP1 table T1 #закидываем в первую таблицу инфу о сети первого провайдера
ip route add default via $GW1 table T1 #закидываем в первую таблицу дефолтный гейт на первого провайдера
ip route add $GW2_NET dev $IF2 src $IP2 table T2 #закидываем во вторую таблицу инфу о сети второго провайдера
ip route add default via $GW2 table T2 #закидываем во вторую таблицу дефолтный гейт на второго провайдера
ip route add $GW1_NET dev $IF1 src $IP1 &> /dev/null #заполняем основную таблицу адресов. сеть на первого провайдера
ip route add $GW2_NET dev $IF2 src $IP2 &> /dev/null #заполняем основную таблицу адресов. сеть на второго провайдера
ip rule add from $IP1 table T1 #все пакеты с нашего IP-адреса первого провайдера маршрутизировать по таблице T1
ip rule add from $IP2 table T2 #все пакеты с нашего IP-адреса второго провайдера маршрутизировать по таблице T2
ip route add $LAN_NET dev $IF0 table T1 #закидываем в первую таблицу инфу о том, что у нас существует локальная сеть
ip route add $GW2_NET dev $IF2 table T1 #закидываем в первую таблицу инфу о том, что у нас существует еще одна сеть
ip route add 127.0.0.0/8 dev lo table T1 #закидываем в первую таблицу инфу о существовании лупбека
ip route add $LAN_NET dev $IF0 table T2 #закидываем во вторую таблицу инфу о том, что у нас существует локальная с
ip route add $GW1_NET dev $IF1 table T2 #закидываем во вторую таблицу инфу о том, что у нас существует еще одна се
ip route add 127.0.0.0/8 dev lo table T2 #закидываем во вторую таблицу инфу о существовании лупбека.
ip route del default
ip route add default scope global nexthop via $GW1 dev $IF1 weight 1 nexthop via $GW2 dev $IF2 weight 1
ip route flush cache #сбросить кеш маршрутизации
rc.prov2
#!/bin/bash
IF0="eth0"
IF1="eth1"
IF2="eth4"
#IP0= "192.168.0.26"
IP1="192.168.20.2"
IP2="192.168.30.2"
GW1="192.168.20.1"
GW2="192.168.30.1"
GW1_NET="192.168.20.0/24"
GW2_NET="192.168.30.0/24"
LAN_NET="192.168.0.0/24"
ip route flush table T1 #обнуляем первую таблицу маршрутов
ip route flush table T2 #обнуляем вторую таблицу маршрутов
ip route del default
ip route add default via $GW2 &> /dev/null #заполняем основную таблицу адресов. дефолтный гейт.
ip route flush cache #сбросить кеш маршрутизации