понедельник, 14 октября 2013 г.

Как автоматически переключать каналы на сервере?

На сервере FreeBSD (Linux) нужно настроить автоматическое переключение каналов в случае падения основного канала на резервный. Думал-думал. Можно изящно сделать было на базе quagga (bgpd) и двух бгп-сессий. Но, в моем случае надо такое решение тщательно потестировать, а я не мог - в локалке сервера круглосуточно работают пользователи. И в моем случае один из каналов работает на mpd5 - туннель pptp. А второй ethernet.

Придумал простой способ: пускать регулярно один пинг с соурс-адресом каждого из обоих интерфейсов наружу, например на гугл-днс и по результату прохождения пинга принимать решение работает канал или нет. Чтобы схема работала нужно чтобы был на сервере настроен соурс-роутинг, то есть в зависимости от соурс-адреса пакет уходит на соответствующий шлюз (то есть в соответствующий маршрут).

Скрипт пускает пинг с разными соурс-адресами на днс-сервера гугла, и, если результат команді пинг успешный, то переменной задается значение 1. А потом проверяются занчения переменных, и по результатам проверок меняются маршруты. Естественно на обоих каналах организован НАТ.

Скрипт, который я написал для этого вот:

#!/bin/sh

rcpt="admin@example.com"

## PPTP link
ip1="87.k.m.p"
gw1="x.x.x.x"

## ETHERNET link
ip2="91.x.y.z"
gw2="91.x.y.n"

## default:
gw_default="$gw1"

## check what current default gw
current_dgw=`netstat -rn|grep ^default|awk '{print $2}'`;

gw1_good=0
gw2_good=0

## assign new value if ping ok:
ping -S $ip1 -c1 -i5 8.8.8.8 > /dev/null 2>&1 && gw1_good=1
ping -S $ip2 -c1 -i5 8.8.8.8 > /dev/null 2>&1 && gw2_good=1

if [ $gw1_good = 1 ] && [ $gw2_good = 1 ]; then
        if [ $current_dgw != $gw_default ]; then
                echo "Ping probe to both gateways OK. \
                Changed default route to default $gw_default."|\
                mail -s "WARNING: SRV routing changes" $rcpt
        fi
        route change default $gw_default >/dev/null 2>&1
        exit;
fi

if [ $gw1_good = 0 ] && [ $gw2_good = 1 ]; then
        route change default $gw2 >/dev/null 2>&1
        echo "Ping probe via $gw1 failed. \
                Changed default route to $gw2."|\
                mail -s "WARNING: SRV routing changes" $rcpt
        exit
fi

if [ $gw1_good = 1 ] && [ $gw2_good = 0 ]; then
        route change default $gw1 >/dev/null 2>&1
        echo "Ping probe via $gw2 failed. \
                Changed default route to $gw1."|\
                mail -s "WARNING: SRV routing changes" $rcpt
        exit
fi

Комментариев нет:

Отправить комментарий