Hilik - FreeBSD
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.16
Я спеціально вказав включений 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" $ flush $ add 100 divert natd ip from 192.168.1.0/24 для того, щоб отримати xmit fxp1 $ add 110 divert natd ip від 152.16. recv fxp1 $ add 120 divert 8669 ip from 192.168.1.0/24 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 хвилин і на цьому взагалі все. Скрипт досить простий і у мене працює нормально. Єдине за великих втрат на основному каналі він іноді починає перемикати туди і назад. Тому стежити за його роботою таки доводиться.