Содержание |
В случае отключения основного канала, переключиться на резервный. Если основной канал восстанавливается, переключиться обратно.
Решение достаточно простое. Необходимо написать необльшой скрипт, контролирующий доступность соединения с провайдером и запустить его по Cron. Успешный ping роутера провайдера будем считать достаточным для принятия решения о том работает канал или нет.
Текст скрипта switchroute.sh
#! /bin/bash
MAIN=192.168.100.1
SECOND=192.168.100.100
# Получаем текущий роутер по умолчанию.
CURRENT=$(route -n | tail -1 | awk '{ print $2}')
#echo $CURRENT
# Проверяем, пингуется ли основной роутер.
if ping -c4 $MAIN > /dev/null 2>&1; then
# echo "MAIN working"
# Если пингуется, проверяем, является ли он
# сейчас роутером по умолчанию.
if [ $MAIN = $CURRENT ]; then
# Если да, то просто выходим
# echo "MAIN current. Exit"
exit 0
else
# Если нет, то меняем маршрут на основной роуер.
# echo "MAIN not Current, switch yo MAIN"
route del default 2> /dev/null
route add default gw $MAIN
logger "Default route switch to MAIN: $MAIN"
# echo "Default route switched to MAIN: $MAIN"
exit 0
fi
else
# echo "MAIN not working"
# Если MAIN не является маршрутом по умолчанию
# Проверяем, является ли SECOND маршрутом по умолчанию.
if [ $SECOND = $CURRENT ]; then
# Если является, то ничего не далаем.
# echo "Second = Current. Exit"
exit 0
else
# Если не является, то меняем маршрут
# на вспомогательный роутер/
# echo "Second not Current. switch to Second"
route del default 2> /dev/null
route add default gw $SECOND
logger "Default route switch to SECOND: $SECOND"
# echo "Default route switched to SECOND: $SECOND"
exit 0
fi
fi
Переменная MAIN должна содержать ip адрес роутера провайдера на основном канале.
Переменная SECOND должна содержать ip адрес роутера провайдера на дополнительном канале.
ВАЖНО! В файерволе NAT должен быть на обеих выходных интерфейсах. Например, если выходные интерфейсы eth0 и eth1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Вместо MASQUERADE можно использовать SNAT.
Также следует проверить разрешения IP форвардинга
# cat /proc/sys/net/ipv4/ip_forward 1
Сам скрипт необходимо добавить в виде задания в Cron. Скрипт должен выполняться с правми пользователя root. Например для проверки раз в пять минут, в список заданий root добавтье следующую строку:
*/5 * * * * /usr/local/sbin/switchroute.sh
При переключении с основного на резерный каналы и наоборот, в систему журнальной регистрации будут отправляться сообщения.
Основной недостаток скрипта -- контроль только ближайшего роутера провайдера. Если роутер работает, а у провайдера проблемы на других узлах в сети, переключения на резервный канал не будет.
Это можно решить, добавив в качестве условия принятия решения о переключение ping на какой нибудь хост в Интернет, который будет гарантировано работать все время :) .