Очень часто в различных организациях возникает необходимость резервирования интернет-канала на случай каких-либо сбоев. Крупные организации могут позволить себе купить блок IP-адресов и AS и затем уже покупая каналы у нескольких интернет-провайдеров настроить BGP.
Для небольших компаний такая схема это непозволительная роскошь и обычно небольшие компании просто покупают интернет-каналы у нескольких провайдеров. И имея на каждом из каналов свои независимые адреса и прочие настройки каким-то образом (временами даже в ручную!) настраивают переключение каналов. Далее будет показан один из возможных способов организации автоматического переключения на резервный канал в случае сбоя основного и возврат обратно после восстановления связи.
Внесём немного ясности:
- Шлюз работает под управлением Debian или Ubuntu Linux;
- Основной интернет-канал на интерфейсе eth0 с адресом 1.1.1.2/24 и шлюзом 1.1.1.1 (у автора этих строк это ADSL от Таттелекома);
- Резервный интернет-канал на интерфейсе ppp999 с адресом 2.2.2.2 (у автора этих строк это DOCSIS от ТВТ)
Для начала уточним (на всякий случай) как именно привязать ppp-соединение к ppp-интерфейсу с конкретным номером. Для этого нужно в соответствующий файле в "/etc/ppp/peers&quto; добавить строку:
unit 999
Далее добавим ещё один параметр в тот же файл: метку соединения:
ipparam tbt
Кроме того этот интерфейс не должен при подъёме трогать маршрут по умолчанию. Это достигается примерно вот так:
# Следующие строки закомментированы чтобы не трогать маршрут по умолчанию #defaultroute #replacedefaultroute
Это нам пригодиться чуть позже. Сейчас нам нужно описать две дополнительные таблицы роутинга (по одной для каждого провайдера). Для этого в файл "/etc/iproute2/rt_tables" добавим следующие строки:
190 net_tbt 195 net_tattelecom
Теперь нам надо явно указать с какого интерфейса через какую таблицу роутинга искать маршруты. Для этого нужно выполнить вот такие команды (и заодно добавить в "/etc/rc.local" чтобы выполнялись при загрузке):
/sbin/ip rule add from 1.1.1.2 lookup net_tattelecom pref 20000 /sbin/ip rule add from 2.2.2.2 lookup net_tbt pref 20000
Разумеется надо чтобы в нужных таблицах были и нужные маршруты (как минимум маршрут по умолчанию). Для резервного канала это достигается созданием скрипта "/etc/ppp/ip-up.d/tbt" примерно такого содержания:
#!/bin/sh
# Если это подключение к ТВТ (вот тут пригождается ipparam!)
if [ ${PPP_IPPARAM} = "tbt" ]; then
# Заворачиваем трафик через этот интерфейс для соответствующей таблицы
/sbin/ip route add default dev ${PPP_IFACE} table net_tbt
fi
Для eth0 всё ещё проще: открываем файл "/etc/network/interfaces" и приводим конфигурацию eth0 к такому виду:
auto eth0
iface eth0 inet static
address 1.1.1.2
netmask 255.255.255.0
gateway 1.1.1.1
dns-nameservers 127.0.0.1
metric 100
post-up /sbin/ip route add default via 1.1.1.1 table net_tattelecom
Теперь нужно перезагрузить сервер и после этого сервер будет по умолчанию идти в интернет через eth0, но при этом снаружи будет доступен по обоим каналам. Теперь создадим скрипт "/usr/local/scripts/check_internet.sh" следующего содержания:
#!/bin/sh
# Доступность этого хоста будет означать корректную работу оснвного канала
# 8.8.8.8 это DNS от Google. За его доступность можно не беспокоиться
# А значит вероятность ложного срабатывания минимальна
HOST="8.8.8.8"
# Файл-флаг. Появляется при переключении на резервный канал
LOCKFILE="/tmp/check_internet.lock"
# Файл журнала
LOGFILE="/var/log/check_internet.log"
# Пингуем проверочный хост через основной канал
ping -I 1.1.1.2 -c 3 -n -q ${HOST} > /dev/null
# Если возникла ошибка (хост не доступен)
if [ $? -ne "0" ]; then
# Если нет файла-флага
if [ ! -f ${LOCKFILE} ]; then
# Меняем маршрут по умолчанию в основной таблице роутинга
ip route del default
ip route add default dev ppp999 metric 100
# Создаём файл флаг
touch ${LOCKFILE}
# Делаем запись в файл журнала
echo `date +'%Y/%m/%d %H:%M:%S'` Internet connection changet to TBT >> ${LOGFILE}
fi
# Если же всё хорошо
else
# Если есть файл-флаг
if [ -f ${LOCKFILE} ]; then
# Меняем маршрут по умолчанию в основой таблице роутинга
ip route del default
ip route add default via 1.1.1.1 metric 100
# Удаляем файл-флаг
rm -f ${LOCKFILE}
# Записываем событие в файл журнала
echo `date +'%Y/%m/%d %H:%M:%S'` Internet connetction changed to TatTeleCom >> ${LOGFILE}
fi
fi
Этот скрипт нужно запускать каждую минуту. Для этого в "/etc/crontab" нужно добавить строку:
* * * * * root /usr/local/scripts/check_internet.sh
Далее ещё нужно включить пересылку пакетов (forwarding) и поднять NAT для локальной сети на обоих интерфейсах. Примеры можно найти например тут и тут.
На этом всё. Приятной работы!

Anonymous 2012-01-08 11:50:53 (#)