Исходные данные.

  • Linux роутер с минимум 3-мя сетевыми картами.
  • Два подключения к разным провайдерам.
  • Один канал основной, второй резервный.

Задача.

В случае отключения основного канала, переключиться на резервный. Если основной канал восстанавливается, переключиться обратно.

Решение.

Решение достаточно простое. Необходимо написать необльшой скрипт, контролирующий доступность соединения с провайдером и запустить его по 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 на какой нибудь хост в Интернет, который будет гарантировано работать все время :)

Артур Крюков