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

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
mr. brightside
сержант
Сообщения: 260
Зарегистрирован: 2010-04-17 17:32:39
Откуда: Saint-Petersburg

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

Непрочитанное сообщение mr. brightside » 2013-07-29 10:57:32

Добрый день, уважаемые!

Настроил шлюз на 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
Последний раз редактировалось f_andrey 2013-07-29 11:03:37, всего редактировалось 1 раз.
Причина: Автору. пожалуйста, выбирайте соответствующий раздел форума.
Только FreeBSD, только хардкор

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
skeletor
майор
Сообщения: 2508
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

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

Непрочитанное сообщение skeletor » 2013-07-29 12:40:26

Во-первый неясно, какая оболочка выполняет этот скрипт: sh, bash, tcsh ...
Во-вторых, нужно дебажить, какая команда у вас не срабатывает, при "оживлении" первого канала.
В третьих, можно использовать команду route change, вместо 2-х delete, add.
В четвёртых, можно настроить на одновременную доступность по 2-м каналам и не перегружать каждый раз правила, а только менять шлюз.
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

Аватара пользователя
mr. brightside
сержант
Сообщения: 260
Зарегистрирован: 2010-04-17 17:32:39
Откуда: Saint-Petersburg

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

Непрочитанное сообщение mr. brightside » 2013-07-29 13:16:36

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

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

Аватара пользователя
skeletor
майор
Сообщения: 2508
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

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

Непрочитанное сообщение skeletor » 2013-07-29 13:21:37

Дебажить - это вставлять в скрипт echo ... и смотреть, что вы там сравниваете в if'e. Ну, что б понимать, что выводит результат команды.
Кстати, а откуда понятно, что это bash скрипт? cron, например, об это знает?
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

Аватара пользователя
mr. brightside
сержант
Сообщения: 260
Зарегистрирован: 2010-04-17 17:32:39
Откуда: Saint-Petersburg

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

Непрочитанное сообщение mr. brightside » 2013-07-30 0:52:10

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

#!/usr/loca/bin/bash

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

Аватара пользователя
skeletor
майор
Сообщения: 2508
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

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

Непрочитанное сообщение skeletor » 2013-07-31 13:24:24

Должен. Но почему бы не привести это было в первом посте, а пришлось вытягивать клещами. Если это не опечатка loca вместо local, то остаётся только дебажить скрипт.
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

Аватара пользователя
mr. brightside
сержант
Сообщения: 260
Зарегистрирован: 2010-04-17 17:32:39
Откуда: Saint-Petersburg

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

Непрочитанное сообщение mr. brightside » 2013-07-31 13:27:58

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 
Судя по алгоритму, работает он также. Если что, опробую его.
Только FreeBSD, только хардкор