Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

FreeBSD. Организовываем резервный канал.


Новые статьи на сайте:

 

Hilik     Настроим все

 http://www.hilik.org.ua/

 

 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/
 


В избранное