Дек 17 2009

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 минут и на этом вобщем то все.
Скрипт достаточно простой и у меня работает нормально. Единственное при больших потерях на основном канале он иногда начинает переключать туда и обратно. Поэтому следить за его работой все таки приходится.

Добавить в закладки:

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
  • 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

    прописать ей другой дефолт

Other Links to this Post


Украинская Баннерная Сеть