Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Eugene Grosbein                      2:5006/1       05 Dec 2006  00:18:22
 To : Alexey Markov
 Subject : Re: Скрипт для переключения между двумя каналами
 -------------------------------------------------------------------------------- 
 
 04 дек 2006, понедельник, в 17:47 KRAST, Alexey Markov написал(а):
 
  AM> В общем, обычная ситуация: два канала, FreeBSD 6.2-RC1 в качестве
  AM> рутера/файрвола, и острое желание клиента, чтобы при падении одного
  AM> канала клиенты продолжали работать через второй.
  AM> В общих чертах реализация ясна: два natd + ipfw fwd в нужном месте,
  AM> но наверняка подобная схема у кого-то уже работает. В общем, если
  AM> кто-нибудь поделится примером подобного скрипта - буду вам безмерно
  AM> благодарен.
 
 Если оба канала от одного провайдера, надо попросить его динамически
 анонсировать маршрут в оба канала, это самое прямое решение.
 Если от разных, тоже стоит попросить - вдруг дадут? Это тоже лучший
 вариант.
 
 Hо если оба канала от разных и каждый дает свои адреса
 и динамики не дают, то можно сделать так:
 
 1. Пока отложить переключение и настроить просто корректно сеть:
 - трансляция на выходе во внешний мир
 - ipfw fwd gw1 ip from ip_prov1 to any и ipfw fwd gw2 ip from ip_prov2 to any
 
 Это просто минимальная правильная настройка, чтобы пакеты
 через шлюз первого провайдера gw1 шли только в том случае,
 когда у них (по любой причине) в source IP получился адрес из блока
 первого провайдера, и аналогично со вторым. В частности, это гарантирует
 отсутствие проблем с антиспуфингом у провайдеров даже тогда,
 когда работают оба канала. Hапример, первый провайдер - приоритетный
 канал, но через канал второго пришел TCP-пакет на выделенный вторым
 провайдером адрес и ответ на него должен уходить не в default route
 через первый канал, а во второй через policy routing.
 
 2. Теперь, когда пакеты у нас при любом раскладе уйдет верно,
 мы можем просто переставлять default route на того провайдера,
 который сейчас жив. В моём случае один из каналов - приоритетный,
 и если он валялся и поднялся, маршрут на него должен переключиться
 все равно. Вот скрипт, если проверка пачкой пингов раз в минуту устраивает,
 можно запускать из крона.
 
 #!/bin/sh
 
 PATH=/bin:/sbin:/usr/bin:/usr/sbin
 
 probe() {
   # если еще не тестировали, добавить в список протестированных
   # и протестировать, а если уже тестировали - вернуть истину
 
   [ "$1" = "$gw2" ] && l=prov2
   [ "$1" = "$gw1" ] && l=prov1
   if eval [ -z \"\$$l\" ]; then
     ping -q -c 10 -i 0.3 -t 3 $1 >/dev/null 2>&1
     eval $l=$?
   fi
   eval return \"\$$l\"
 }
 switch_d() {
   # сменить маршрут и отрапортовать
   route -q delete default
   route -q add default $1
   echo $0: default route changed to $1
 }
 
 # в /etc/rc.conf описаны переменные:
 # defaultrouter - IP адрес роутера приоритетного канала
 # backupdefault - IP адрес роутера резервного канала
 # gw1 и gw2 - адреса роутеров провайдеров, один равен defaultrouter,
 # второй равен backupdefault, но мы не экономим переменные :-)
 # тем более что defaultrouter и backupdefault определены в /etc/rc.conf
 # через gw1 и gw2
 
 . /etc/rc.conf || exit 1
 gw=`route -n get default | awk '/gateway:/ { print $2}'
 
 if [ "$gw" = '' ]; then
   gw=$defaultrouter
   route add default $gw
   echo $0: no default route, using $gw
 fi
 
 if probe $defaultrouter; then
   # defaultrouter жив - если текущий шлюз другой, переключиться на default
   [ $gw = $defaultrouter ] || switch_d $defaultrouter
 else
   # defaultroute недоступен - если текущий шлюз это defaultrouter,
   # и другой жив, то переключиться на другой,
   # иначе нету смысла трепыхаться
   [ $gw = $defaultrouter ] && probe $backupdefault && switch_d $backupdefault
 fi
 
 # дальше тут идет переконфигурация демонов (типа squid)
 # если надо, но это уже у каждого свое.
 
 Eugene
 -- 
 Тестоголовые кислое свое брожение приняли за душу, распарывание чрев
 своих - за историю, средства, оттягивающие разложение - за цивилизацию...
 --- slrn/0.9.8.0 (FreeBSD)
  * Origin: Svyaz Service JSC (2:5006/1@fidonet)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: Скрипт для переключения между двумя каналами   Eugene Grosbein   05 Dec 2006 00:18:22 
Архивное /ru.unix.bsd/260935a5502ac.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional