Ещё один скрипт автоматического переключения на резервный канал

4 Июн
2012

Об автопереключении на резервный канал много сказано, написано и нарисовано, но, как не парадоксально, нормальных решений не так уж и много, а уж «из коробки» работающих решений и того меньше.
В общем и целом, озадачился я написанием оного скрипта ввиду дикой ненадёжности моего «любимого» провайдера.
Задача простая, есть 2 провайдера, каждый предоставляет интернет по PPPoE.
Если кому интересна реализация — прошу под кат.
Итак, основным критерием была лень и нежелание переписывать правила фаерволов и прочего, даже на уровне «подсовывания файликов».
Ну, обо всём по порядку.
Система:
#uname -a
Linux gate 3.2.9-hyper-v #1 SMP Tue Mar 6 16:53:32 YEKT 2012 x86_64 GNU/Linux

Система представляет собой Debian, установленный на Hyper-V и кастомное ядро, собранное на основе статьи.
В виртуальной машине 3 интерфейса, 2 провайдерских и 1, смотрящий в локальную сеть.
Не мудрствую лукаво настройку PPPoE я отдал но откуп pppoeconf, не зря ведь его придумали.
Как результат — никаких сложностей и лишних телодвижений для получения конфигов.
Конфиги выглядят приблизительно так:
noipdefault
defaultroute
replacedefaultroute
hide-password
#lcp-echo-interval 30
#lcp-echo-failure 4
noauth
persist
mtu 1400
#persist
#maxfail 0
#holdoff 20
plugin rp-pppoe.so eth0
user "provider_user"
usepeerdns
Ну а дальше всё просто, скопировав конфиг основного провайдера я закомментировал строки
#defaultroute
#replacedefaultroute
#usepeerdns
А сделал я это для того, что реализовать «тестовое подключение», через которое мы и будем проверять, а не появился ли интернет на основном канале.
Ну и, собственно, сам скрипт, он неплохо комментирован и я думаю, у людей не составит проблем с ним разобраться
#!/bin/bash
p1='prov1' #имя основного провайдера
p2='prov2' #имя запасного провайдера
p1test='prov1test' #имя подключения для тестирования (prov1 без перезаписи dns и route)
test_host='8.8.8.8' # хост для тестирования
GW='xxx.xxx.xxx.xxx' # статический ip от prov1
COUNT='3' # количество пакетов для отправки
HOST1='ya.ru' #хосты для проверки
HOST2='google.com'
HOST3='wikipedia.org'
W='пингуется'
R1='ok'
R2='false'
log='/var/log/netstatus.log'
if [ -f /tmp/res_inet ]
then
{
        if /bin/ping -c $COUNT $test_host &> /dev/null
        then
        {
        echo `date` Началось переключение на основной канал >> $log
        poff $p2
        poff $p1test
        sleep 15
        pon $p1
        route del -host $test_host gw $GW
        echo `date` Произошло переключение на основной канал >> $log
        rm /tmp/res_inet
        } else
                {
                poff $p2test
                route del -host $test_host gw $GW
                sleep 30
                pon $p2test
                sleep 5
                route add -host $test_host gw $GW
                }
        fi
}
elif /bin/ping -c $COUNT $HOST1 &> /dev/null && echo $HOST1 $W
then echo $R1
elif
{
 echo $HOST1 $R2
/bin/ping -c $COUNT $HOST2 &> /dev/null && echo $HOST2 $W
}
 then echo $R1
elif
{
 echo $HOST2 $R2
 /bin/ping -c $COUNT $HOST3 &> /dev/null && echo $HOST3 $W
}
 then
echo $R1
else
{
echo $HOST3 $R2
echo `date` Началось переключение на резервный канал >> $log
poff $p1
sleep 15
pon $p2
pon $p1test
route add -host $test_host gw $GW
echo `date` Произошло переключение на резервный канал >> $log
echo > /tmp/res_inet
}
fi
По материалам Хабрахабр.



загрузка...

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

Наверх