На сервере 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
Придумал простой способ: пускать регулярно один пинг с соурс-адресом каждого из обоих интерфейсов наружу, например на гугл-днс и по результату прохождения пинга принимать решение работает канал или нет. Чтобы схема работала нужно чтобы был на сервере настроен соурс-роутинг, то есть в зависимости от соурс-адреса пакет уходит на соответствующий шлюз (то есть в соответствующий маршрут).
Скрипт пускает пинг с разными соурс-адресами на днс-сервера гугла, и, если результат команді пинг успешный, то переменной задается значение 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
Комментариев нет:
Отправить комментарий