Страница 1 из 1

Шлюз c PF на два канала или небольшой failover

Добавлено: 2013-07-29 10:57:32
mr. brightside
Добрый день, уважаемые!

Настроил шлюз на PF (ОС FreeBSD), все прекрасно работает.

У меня 2 канала, хочу между ними переключаться, при этом сохраняя параметры, заданные в PF, для двух различных каналов.

Под "переключаться" я имею ввиду, что если более скоростной (CHNL1) падает, то пакеты начинают лететь через второй канал (CHNL2), при этом шлюз постоянно проверяет, не поднялся ли первый канал и, если поднялся, то переводит передачу пакетов обратно на основной канал.

Сделал два файла, скопировав один в другой и изменив необходимые настройки внутри файлов:

- pf.CHNL1.conf
- pf.CHNL2.conf

После этого нашел такой вот скриптик:

Код: Выделить всё

#Variables
CHNL1=11.11.11.11
CHNL2=22.22.22.22

if  [[ `/sbin/ping -c 3 ${CHNL1} | /usr/bin/grep "64 bytes"` ]]
then
    if [[ `/usr/bin/netstat -rn | /usr/bin/grep default | /usr/bin/grep ${CHNL1}` ]]
    then
        echo "`date '+%d-%m-%Y-%H:%M:%S'`: Default gateway is ${CHNL1}" >>/var/log/channel.log
    else
    {
    #Switch chanel to CHNL1 gateway
    /sbin/route delete default
    /sbin/route add default ${CHNL1}
    /sbin/pfctl -f /etc/pf.CHNL1.conf
    echo "`date '+%d-%m-%Y-%H:%M:%S'`: Switch channel to CHNL1 gateway" >>/var/log/channel.log
    }
    fi
else
    {
    #Switch chanel to CHNL2
    /sbin/route delete default
    /sbin/route add default ${CHNL2}
    /sbin/pfctl -f /etc/pf.CHNL2.conf
    echo "`date '+%d-%m-%Y-%H:%M:%S'`: Switch channel to CHNL2 gateway" >>/var/log/channel.log
    }
fi
Проблема: при падении основного канала всё переводится на резервный. С этим всё хорошо. Но, скрипт не выполняет переключение обратно, если основной канал поднялся. Приходится заходить и выполнять руками. Где ошибка? подскажите пожалуйста.

Задание выполняю через крон с интервалом в 1 минуту:

Код: Выделить всё

# Channel checks
*/1    *       *       *       *       root    /usr/local/bin/channel_check.sh

Re: Шлюз c PF на два канала или небольшой failover

Добавлено: 2013-07-29 12:40:26
skeletor
Во-первый неясно, какая оболочка выполняет этот скрипт: sh, bash, tcsh ...
Во-вторых, нужно дебажить, какая команда у вас не срабатывает, при "оживлении" первого канала.
В третьих, можно использовать команду route change, вместо 2-х delete, add.
В четвёртых, можно настроить на одновременную доступность по 2-м каналам и не перегружать каждый раз правила, а только менять шлюз.

Re: Шлюз c PF на два канала или небольшой failover

Добавлено: 2013-07-29 13:16:36
mr. brightside
skeletor писал(а):Во-первый неясно, какая оболочка выполняет этот скрипт: sh, bash, tcsh ...
Во-вторых, нужно дебажить, какая команда у вас не срабатывает, при "оживлении" первого канала.
В третьих, можно использовать команду route change, вместо 2-х delete, add.
В четвёртых, можно настроить на одновременную доступность по 2-м каналам и не перегружать каждый раз правила, а только менять шлюз.
- скрипт выполняет bash. Скрипт взят с другой машинки с FreeBSD. Только там она 6.1, а у меня тут 9.0. Как собирался PF, я думаю, в данном случае неважно.
- дебажить, я полагаю, exec'ом?
- насчет route change - согласен, исправляю

странно, но "прямо" скрипт работает. Т.е. при падении основного канала. А "обратно" не работает. Хотя команды то идентичны

Re: Шлюз c PF на два канала или небольшой failover

Добавлено: 2013-07-29 13:21:37
skeletor
Дебажить - это вставлять в скрипт echo ... и смотреть, что вы там сравниваете в if'e. Ну, что б понимать, что выводит результат команды.
Кстати, а откуда понятно, что это bash скрипт? cron, например, об это знает?

Re: Шлюз c PF на два канала или небольшой failover

Добавлено: 2013-07-30 0:52:10
mr. brightside
skeletor писал(а):Дебажить - это вставлять в скрипт echo ... и смотреть, что вы там сравниваете в if'e. Ну, что б понимать, что выводит результат команды.
Кстати, а откуда понятно, что это bash скрипт? cron, например, об это знает?
ну:

#!/usr/loca/bin/bash

соответственно, крон и должен понять, какой интерпретатор запускать, нет?

Re: Шлюз c PF на два канала или небольшой failover

Добавлено: 2013-07-31 13:24:24
skeletor
Должен. Но почему бы не привести это было в первом посте, а пришлось вытягивать клещами. Если это не опечатка loca вместо local, то остаётся только дебажить скрипт.

Re: Шлюз c PF на два канала или небольшой failover

Добавлено: 2013-07-31 13:27:58
mr. brightside
skeletor писал(а):Должен. Но почему бы не привести это было в первом посте, а пришлось вытягивать клещами. Если это не опечатка loca вместо local, то остаётся только дебажить скрипт.
опечатка =)

Что ж, буду дебажить.

Еще тут дали вот такой вот скриптец:

Код: Выделить всё

#! /usr/local/bin/bash

gate1=1.1.1.1
gate2=2.2.2.2

 # Получаем текущий роутер по умолчанию.
CURRENT=$(netstat -rn | grep default | awk '{ print $2}')
 # Проверяем, пингуется ли основной роутер.
 if ping -c4 ya.ru > /dev/null 2>&1; then
    # Если пингуется, проверяем, является ли он
   # сейчас роутером по умолчанию.
   if [ $gate1 = $CURRENT ]; then
      # Если да, то просто выходим
#       echo "gate1 current. Exit"
      exit 0
   else
      # Если нет, то меняем маршрут на основной  роуер.
#       echo "gate1 not Current, switch yo gate2"
    /sbin/route change default ${gate1}
    /sbin/pfctl -f /etc/pf.conf
      echo "Default chanel switched to gate2_Provider: $gate1" | mail -s "Intern  et chanel switched to gate1_Provider" user@local.ru
      logger "Default chanel switched to gate2_Provider: $gate1"
      exit 0
   fi
 else
 echo "gate1 not working"
   # Если gate1 не является маршрутом по умолчанию
   # Проверяем, является ли gate2 маршрутом по умолчанию.
   if [ $gate2 = $CURRENT ]; then
      # Если является, то ничего не далаем.
      # echo "gate2 = Current. Exit"
      exit 0
   else
      # Если не является, то меняем маршрут
      # на вспомогательный роутер/
       echo "gate1 not Current. switch to gate1"
#    /sbin/route delete default
#    /sbin/route add default ${gate1}
    /sbin/route change default ${gate2}
    /sbin/pfctl -f /etc/pf.megafon.conf

 echo "Default chanel switched to gate1_Provider: $gate1"| mail -s "Internet cha nel switched to gate1_Provider" user@local.ru
                logger "Default chanel switched to gate1_Provider: $gate2"

                exit 0
  fi
 fi 
Судя по алгоритму, работает он также. Если что, опробую его.