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 минут и на этом вобщем то все.

Скрипт достаточно простой и у меня работает нормально. Единственное при больших потерях на основном канале он иногда начинает переключать туда и обратно. Поэтому следить за его работой все таки приходится.

http://www.hilik.org.ua/freebsd-организовываем-резервный-канал/

Обновлено: 12.03.2015