В связи с введением резервного канала потребовалось ввести автоматическое переключение между ISP.  Упрощенная схема сети показана на картинке

ISP schemeСуть скрипта — проверка на доступность общественных серверов.

# cat check_gate

#!/bin/bash
CheckHost=»8.8.8.8″     # Контрольный адрес через основного провайдера, который должен быть доступен при его нормальной работе.
GW1=»192.168.145.101″         # Основной шлюз основного провайдера
NC1=»eth0″            # Имя сетевого адаптера основного провайдера
GW2=»192.168.145.202″        # Основной шлюз резервного провайдера
NC2=»eth0″            # Имя сетевого адаптера резервного провайдера
# Наибольший процент потерь до контрольного адреса через шлюз основного провайдера
MaxLoss=»50″
# Путь к log-файлу
log=»/var/log/routing.log»
# echo `date +»%d.%m.%Y %T %:z»`. «- Запуск проверки доступности каналов» >> ${log}
###### Контроль и переключение #######
# Запоминаем текущий адаптер на котором прописан маршрут по умолчанию
EthDo=`/sbin/route -n | grep -iv Kernel| /usr/bin/awk ‘{print $(NF-7) » »  $(NF-6)}’ | /bin/grep «192.168.146.[101|202]» | /usr/bin/awk ‘{print $(NF-0)}’`
#EthDo=`/sbin/route -n | grep -iv Kernel| /usr/bin/awk ‘{print $(NF-7) » » $(NF-0)}’ | /bin/grep 0.0.0.0 | /usr/bin/awk ‘{print $(NF-0)}’`

# Добавляем временный точный маршрут до контрольного адреса через основного провайдера
/sbin/route add -host ${CheckHost}/32 gw ${GW1}

# Проверяме контрольный адрес и запоминаем процент потерь
pgw=`/bin/ping -c 20 -q -W 3 ${CheckHost} | /bin/grep loss | /usr/bin/awk ‘{print $(NF-4)}’ | /usr/bin/cut -d»%» -f1`

# Пишем в лог, если потери больше нуля
if [ 0 = «${pgw}» ]
then
echo `date +»%d.%m.%Y %T %:z»`. «- Потери для контрольного адреса ${CheckHost} составили ${pgw}%» >> ${log}
:
else
echo `date +»%d.%m.%Y %T %:z»`. «- Потери пакетов до контрольного адреса ${CheckHost} составили ${pgw}%» >> ${log}
fi
# Удаляем временный маршрут
/sbin/route del ${CheckHost}/32 gateway ${GW1}
# Проверяем, что процент потерь и если он больше допустимого значения, переключаем шлюз по умолчанию на резервный интерфейс
if [ «${MaxLoss}» -le «${pgw}» ]
then
if [ «${EthDo}» = «${GW1}» ]
then
echo `date +»%d.%m.%Y %T %:z»`. «- Переход на резервный канал — шлюз ${GW2}. Причина — потери пакетов на интерфесе ${NC1} до контрольного хоста ${CheckHost} составили ${pgw}% при пороге не более ${MaxLoss}%» >> ${log}
tail ${log} |grep «192.168.145.[101|202]» > /tmp/gate
mail -s «Change_gate» admin@it-volga.org < /tmp/gate

/sbin/route del default
/sbin/route add default gw $GW2
fi
fi

# Проверяем не востановилась ли связь по основному интерфейсу и, если да,  возвращаемся на него
if [ «${EthDo}» = «${GW2}» ]
then
if [ «${pgw}» -le «${MaxLoss}» ]
then
echo `date +»%d.%m.%Y %T %:z»`. «- Переход на основной канал — шлюз ${GW1}»  >> ${log}
/sbin/route del default
/sbin/route add default gw $GW1
fi
fi

Теперь надо добавить в crontab строку…

7-57/10 * * * * root /etc/scripts/check_gate # каждые 10 минут, но это всё зависит от степени отказоустойчивости

и разрешить на маршутизаторах ISP1 и ISP2 icmp-трафик от server’a к контрольному адресу.

Данный скрипт работает уже не первый месяц без замечаний. Время выполнения скрипта примерно 25-30 секунд.

P.S. Требуется следить за кавычками при копировании скрипта.

Исходные данные почерпнул из forum.ubuntu.ru и применил к своей инфраструктуре.