Очень часто в различных организациях возникает необходимость резервирования интернет-канала на случай каких-либо сбоев. Крупные организации могут позволить себе купить блок 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 (#)