FreeBSD. Организовываем резервный канал.
Все больше офисов в своей работе ориентированны на интернет. Пусть даже офис небольшой, но все равно нужен доступ к электронной почте, к VoIP и т.д. и т.п. Организовать второе подключение к другому провайдеру не сложно, но возникает вопрос, как реализовать работу, так что бы переключение происходило с минимальными действиями со строны админа. Для реализации резервного канала нам понадобится сервер с 3-мя сетевыми картами.
Назначение у этих сетевых карт такое:
fxp0 – первая сетевая карта – к ней подключается офис(является шлюзом для локальной сети) – адрес 192.168.1.1/24
fxp1 – первое подключение – основной внешний канал – адрес 192.168.5.2/30 – шлюз 192.168.5.1
fxp2 – второе подключение – резервный внешний канал – адрес 192.168.6.2/30 – шлюз 192.168.6.1
При нормальной работе шлюз по умолдчанию(defaultrouter) смотрит в 192.168.5.1 и трафик идет через карту fxp1, при аварии на основном канале шлюз должен переключится на 192.168.6.1 и трафик, соответсвенно, переключится на fxp2.
В /etc/rc.conf внесем все настройки:
ifconfig_fxp0="inet 192.168.1.1/24" ifconfig_fxp1="inet 192.168.5.2/30" ifconfig_fxp2="inet 192.168.6.2/30" defaultrouter="192.168.5.1" named_enable="YES"
Я специально указал включенный named, кеширующий DNS, при переключениях важно, что бы приходилось менять настройки минимально, и то, чо мы не будем использовать ДНС провайдера упрощает переключение.
Следующим этапом нужно настроить nat, нам теперь понадобится 2 запущенных процесса natd, под каждый интерфейс. Для этого я применяю такой скрипт(/usr/local/etc/rc.d/natd):
#!/bin/sh case $1 in start) `/sbin/natd -u -a 192.168.5.2` `/sbin/natd -u -p 8669 -a 192.168.6.2` ;; stop) `killall -9 natd` ;; *) ;; esac
Далее настройки файерволла:
#!/bin/sh ipfw="/sbin/ipfw -q" ${ipfw} flush ${ipfw} add 100 divert natd ip from 192.168.1.0/24 to not me out xmit fxp1 ${ipfw} add 110 divert natd ip from not me to 192.168.5.2 in recv fxp1 ${ipfw} add 120 divert 8669 ip from 192.168.1.0/24 to not me out xmit fxp2 ${ipfw} add 130 divert 8669 ip from not me to 192.168.6.2 in recv fxp2
В принципе на этом этапе резервный канал уже можно использовать. С ручным приводом. То есть, при потере основного внешнего канала выполнять такую команду:
route change default 192.168.6.1
и все побежит по резервному каналу.
При восстановлении основного канала переуключение опять таки в ручную:
route change default 192.168.5.1
Но ручное переключение это не совсем то, чего хотелось, а для того, что бы как хотелось, переключалось все автоматом, я использую такой вот скрипт:
#!/bin/sh FPING="/usr/local/sbin/fping" WRKDIR=`/bin/pwd` DATE=`/bin/date` MAIN='192.168.5.1' BACKUP='192.168.6.1' main_status_old=`/bin/cat $WRKDIR/status/main | /usr/bin/awk '{ print $1 }'` main_try=`/bin/cat $WRKDIR/status/main | /usr/bin/awk '{ print $2 }'` router=`/bin/cat $WRKDIR/status/router` main_status_new=`$FPING $MAIN | /usr/bin/awk '{ print $3 }'` back_status=`$FPING $BACKUP | /usr/bin/awk '{ print $3 }'` if [ $main_status_new != 'alive' ] #Главный роутер в дауне then { if [ $router = 'main' ] then { if [ $back_status = 'alive' ] then { if [ $main_try != 0 ] then { echo 'Change route' /sbin/route change default $BACKUP echo 'backup' > $WRKDIR/status/router } else { main_try=`expr $main_try + 1` echo "$main_status_new $main_try" > $WRKDIR/status/main } fi } fi } fi } #Главный канал вернулся else { if [ $router = 'backup' ] then { echo 'Change route' /sbin/route change default $MAIN echo 'main' > $WRKDIR/status/router echo "$main_status_new 0" > $WRKDIR/status/main } fi } fi
Для работы скрипта его нужно разместить в любой директории, к примеру /root/bin/
Далее создать поддиректоию status и в ней создать 2 файла:
echo 'alive 0' > /root/bin/status/main echo 'main' > /root/bin/status/router
Первый файл – состояние главного роутера(alive) и число проверок(0), число проверок нужно для перепроверки статуса down, то есть, если у нас произошел временный сбой по сети, сразу не переводить канал на запасной, а проверить еще раз, если основной канал лежит, только тогда переводить канал на резерв.
Скрипт нужно поставить на крон с периодом запуска раз в 5 минут и на этом вобщем то все.
Скрипт достаточно простой и у меня работает нормально. Единственное при больших потерях на основном канале он иногда начинает переключать туда и обратно. Поэтому следить за его работой все таки приходится.




By aspid, 19.02.2010 @ 08:51
при выполнении скрипта для автоматического переключения канала выскакивает вот такая ошибка
[: echo: unexpected operator
By SamARa, 02.04.2010 @ 09:47
fping из портов установлен?
By hilik, 05.04.2010 @ 09:09
Да, из портов.
By Marchd, 18.05.2010 @ 02:26
А вот такой вопрос, уже ооочень наболевший, можно ли сделать так что бы одна и машин локалки ходила всегда через 192.168.6.1? и если можно то как?
By Marchd, 18.05.2010 @ 02:28
а можно сделать одну машину в сети чтобы она ходила через 192.168.6.1 всегда? и если можно то как?
By hilik, 19.05.2010 @ 13:56
прописать ей другой дефолт
By eugene, 09.09.2010 @ 10:58
Ничего не понял в скрипте, я новичок в этом деле.. объясните мне пожалуйста каким образом проходит проверка состояния соединения.. по факту линка или все же по факту наличия интернета)) а то вот например линк, то есть а инета нет и как быть в такой ситуации?