Скрипт переключения между двумя интернет-каналами

Автор gardarea51, 22 января 2014, 22:12:52

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

gardarea51

Всем привет!
По представленному образцу (спасибо автору): http://wiki.sys-adm.org.ua/net/routing сваял небольшой скрипт, который планирую вызывать через cron для "переключения" потока интернет-трафика между двумя PPPoE-интерфейсами. IP-адреса старался не трогать, использовал имена интерфейсов, потому что 1 адрес статический, а другой динамический. Вот, может кому-то моя небольшая переделка пригодится:

#!/bin/bash
logfile="/var/log/connect_replace.log"
dtime=`date +"%d.%m.%Y %T"`

#Указание допустимых и доступных устройств для default gw dev, $dev_gw1 - желаемый выбор
dev_gw1="ppp0" ; dev_gw2="ppp1"
#Определяем текущий шлюз по-умолчанию, если он отсутствует - задаем переменной dev_gw значение "none"
dev_gw="$(ip r l | grep 'default' | awk '{print $3}')"
if [ -z $dev_gw ] ; then dev_gw="none" ; fi
#задание переменных статуса каналов
gw1_status=0 ; gw2_status=0

#Получение текущего статуса для каждого канала и сохранение статуса в переменной
#с3 - послать 3 пакета и ждать ответ в течение w5, l3 - послать их сразу, w5 - работать 5 секунд
if ping -c3 -l3 -w5 -n -q -I$dev_gw1 8.8.8.8 > /dev/null 2>&1 ; then gw1_status=1 ; else gw1_status=0 ; fi
if ping -c3 -l3 -w5 -n -q -I$dev_gw2 8.8.8.8 > /dev/null 2>&1 ; then gw2_status=1 ; else gw2_status=0 ; fi

#echo "---------------------------------------------------------------------------------------"
if [ $gw1_status -eq 1 ]
   then echo "$dtime Connection '$dev_gw1' status: [ OK ]"
   else echo "$dtime Connection '$dev_gw1' status: [FAIL]"
fi
if [ $gw2_status -eq 1 ]
   then echo "$dtime Connection '$dev_gw2' status: [ OK ]"
   else echo "$dtime Connection '$dev_gw2' status: [FAIL]"
fi
echo "$dtime Default gateway dev: '$dev_gw'"

#Изменение default gw в зависимости от статуса и текущего состояния каналов
#1) Текущее соединение $dev_gw1 и оно вполне работоспособно - ничего не делаем
if [ $dev_gw == $dev_gw1 -a $gw1_status -eq 1 ] ; then
   echo "$dtime Good: Connection '$dev_gw1' is up and default gw dev '$dev_gw1'"

#2) Текущее соединение не $dev_gw1, но работает и $dev_gw1 - меняем шлюз на $dev_gw1
elif [ $dev_gw != $dev_gw1 -a $gw1_status -eq 1 ] ; then
   echo "$dtime Replace: Setup default gw to '$dev_gw1'"
   if [ $dev_gw != "none" ] ; then ip route del default ; fi ; ip route add default dev $dev_gw1

#3) Текущее соединение не $dev_gw2, но работоспособно только $dev_gw2 - меняем шлюз на $dev_gw2
elif [ $dev_gw != $dev_gw2 -a $gw1_status -eq 0 -a $gw2_status -eq 1 ] ; then
   echo "$dtime Replace: Setup default gw to '$dev_gw2'"
   if [ $dev_gw != "none" ] ; then ip route del default ; fi ; ip route add default dev $dev_gw2

#4) Текущее соединение $dev_gw2, соединение $dev_gw1 не работает - ничего не делаем
elif [ $dev_gw == $dev_gw2 -a $gw1_status -eq 0 -a $gw2_status -eq 1 ] ; then
   echo "$dtime Connected: Connection '$dev_gw1' is down, current default gw dev '$dev_gw2'"

#5) Оба соединения не работоспособны
elif [ $gw1_status -eq 0 -a $gw2_status -eq 0 ] ; then
   echo "$dtime Problem: Connections '$dev_gw1', '$dev_gw2' is down, replace default gw to '$dev_crp'"

else exit 0;
fi

echo "---------------------------------------------------------------------------------------"



ps: если будете также использовать его для ppp-соединений, то у менее приоритетного соединения с файла описания пира уберите опцию defaultroute. В более приоритетном пире наоборот оставьте эту опцию и поставьте бесконечный дозвон.

Плюс ко всему можете файл в /etc/ppp/ip-down.d/peer, в котором опишите, что при падении приоритетного соединения нужно сменить дефолтный роут так, чтобы трафик пошел по менее приоритетному соединению. Но в этом случае нужно выполнить проверку: активно ли второе соединение. А можно ничего не делать, скрипт переключения каналов, если к примеру он выполняется раз в 1 минуту все равно перекинет деволтный маршрут на активное соединение максимум через минуту после падения основного канала.