Скрипт переключения между каналами

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

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

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
kuhar2007
сержант
Сообщения: 243
Зарегистрирован: 2008-12-22 14:40:35

Скрипт переключения между каналами

Непрочитанное сообщение kuhar2007 » 2012-07-05 10:24:35

Возникла необходимость, реализовать следующее:
Есть два прова идут на сервер, один работает по статике, другой pppoe и один выход на клиентов.
Нужно чтобы по умолчанию работала статика (re1), а при ее отсутствии переключалось на pppoe (tun0), и сервер попрежнему отдавал интернет клиентам по pppoe, а когда на статике появлялся инет, то скрипт обратно переключал с tun0 на re1.
В общем нашел скрипт и сделал под себя:

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

#!/bin/sh
###
ng_ip=`ifconfig re1 | grep inet | awk '{print $2}'`
ng_gw=`ifconfig re1 | grep inet | awk '{print $4}'`
tun_ip=`ifconfig tun0 | grep inet | awk '{print $2}'`
tun_gw=`ifconfig tun0 | grep inet | awk '{print $4}'`
def_gw=`netstat -rn | grep default | awk '{print $2}'`
 
if ping -c 3 -S $ng_ip ya.ru > /dev/null
then
    if [ "$ng_gw" != "$def_gw" ] > /dev/null
    then
       /sbin/route change default $ng_gw
    fi
exit 0
else
    /sbin/route change default $tun_gw
    /usr/local/etc/rc.d/mpd5 restart
    if ping -c 3 -S $tun_ip ya.ru > /dev/null
    then
    exit 0
    else
    /sbin/route change default $ng_gw
    sleep 3
    killall -9 ppp
    sleep 5
    killall ppp
    sleep 7
    killall ppp
    sleep 45
    ppp -ddial fregat
    fi
fi
В конфиг mpd и в resolv.conf добавил днс провайдеров, в pf-е прописла следующее:

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

set limit states 128000
set optimization aggressive
nat pass on re1 from 10.0.0.0/8 to any -> re1
nat pass on re1 from 192.168.1.0/24 to any -> re1
nat pass on tun0 from 10.0.0.0/8 to any -> tun0
nat pass on tun0 from 192.168.1.0/24 to any -> tun0
В ipfw написал следующее:

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

#!/bin/sh -
f='/sbin/ipfw'

ifOut='re0'
ifOut2='tun0'

${f} -f flush

${f} add 50 allow tcp from any to me 23,22,21,20,8088,25,995,5100,5101,10000,1
${f} add 51 allow tcp from me 23,22,21,20,8088,25,995,5100,5101,10000,143,53,9

${f} add 60 allow tcp from any to me 28560-28570

${f} add 70 allow udp from any 53,7723 to any

${f} add 100 deny tcp from any to any 445

${f} add 110 allow ip from any to any via lo0
${f} add 120 skipto 1000 ip from me to any
${f} add 130 deny icmp from any to any in icmptype 5,9,13,14,15,16,17
${f} add 140 deny ip from any to "table(120)"
${f} add 150 deny ip from "table(120)" to any
${f} add 160 skipto 2000 ip from any to me

${f} add 200 skipto 500 ip from any to any { via ${ifOut} or via ${ifOut2} }
#${f} add 201 skipto 500 ip from any to any via ${ifOut2}

${f} add 300 skipto 4500 ip from any to any in

${f} add 400 skipto 450 ip from any to any { recv ${ifOut} or recv ${ifOut2} }
#${f} add 401 skipto 450 ip from any to any recv ${ifOut2}
${f} add 420 divert 1 ip from any to any
${f} add 450 divert 2 ip from any to any
${f} add 490 allow ip from any to any
${f} add 500 skipto 32500 ip from any to any in
${f} add 510 divert 1 ip from any to any
${f} add 540 allow ip from any to any

${f} add 701 allow tcp from any to any 5100
${f} add 701 allow tcp from any to any 5101

${f} add 1010 allow tcp from any to any setup keep-state
${f} add 1020 allow udp from any to any keep-state
${f} add 1100 allow ip from any to any

${f} add 2000 check-state
${f} add 2010 allow icmp from any to any
${f} add 2020 allow tcp from any to any 80,443
${f} add 2050 deny ip from any to any { via ${ifOut} or via ${ifOut2} }
#${f} add 2051 deny ip from any to any via ${ifOut2}
${f} add 2060 allow udp from any to any 53,7723

${f} add 2100 deny ip from any to any

${f} add 32490 deny ip from any to any
В общем завел всю эту байду, в итоге срабатывает по умолчанию не re1, а tun0. Когда отключаю tun0 инет не переподлючается, но когда врубаю кабель то фря бутается...
Может у кого-то есть получше скрипт, или может я что-то не правильно делаю?
PS Фря 9-ая стоит.
Последний раз редактировалось f_andrey 2012-07-05 10:51:39, всего редактировалось 1 раз.
Причина: Автору, выбирайте пожалуйста раздел соответствуюший тематике вашего сообщения.

Хостинговая компания 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
майор
Сообщения: 2486
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

Re: Скрипт переключения между каналами

Непрочитанное сообщение skeletor » 2012-07-05 12:03:23

А зачем 2 файервола? Что в логах при бутании сервака?
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

kuhar2007
сержант
Сообщения: 243
Зарегистрирован: 2008-12-22 14:40:35

Re: Скрипт переключения между каналами

Непрочитанное сообщение kuhar2007 » 2012-07-05 12:22:17

Два интрфейса указано, так как с них должен шепиться трафик на клиентов при переключении канала.
В логах при ребуте ничего нет...
skeletor писал(а):А зачем 2 файервола? Что в логах при бутании сервака?

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

Re: Скрипт переключения между каналами

Непрочитанное сообщение skeletor » 2012-07-05 13:51:19

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

kuhar2007
сержант
Сообщения: 243
Зарегистрирован: 2008-12-22 14:40:35

Re: Скрипт переключения между каналами

Непрочитанное сообщение kuhar2007 » 2012-07-05 14:30:48

Так фаервол и используется один, если вы имеете ввиду pf, то он используется только как нат.
skeletor писал(а):Шейпить, натить, фильтровать трафик можно и одним файерволом. Оставьте один файервол. Возможно при переключении каналов нужно очищать таблицу НАТ

kuhar2007
сержант
Сообщения: 243
Зарегистрирован: 2008-12-22 14:40:35

Re: Скрипт переключения между каналами

Непрочитанное сообщение kuhar2007 » 2012-07-07 9:58:45

В общем то что у меня получилось и осталось самую малость, потому что оно почти работает:)
Добавил скрипт в крон:

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

* * * * *        /etc/rc.d/script.sh
Видоизменил скрипт, убрал у него проверку ipv6 и добавил проверку локфайлов в итоге получилось:

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

#!/bin/sh
###
if [ -e /tmp/ping_checker.lock ]; then

        #echo "Lockfile exist";

        exit 0;



else

touch /tmp/ping_checker.lock

set ng_ip=`ifconfig re0 | grep "inet "| awk '{print $2}'`
set ng_gw=`ifconfig re0 | grep "inet "| awk '{print $4}'`
set tun_ip=`ifconfig tun0 | grep "inet "| awk '{print $2}'`
set tun_gw=`ifconfig tun0 | grep "inet "| awk '{print $4}'`
def_gw=`netstat -rn | grep default | awk '{print $2}'`

    /sbin/route change default $tun_gw
    /usr/local/etc/rc.d/mpd5 restart
    if ping -c 3 -S $tun_ip ya.ru > /dev/null
    then
    exit 0
    else
    /sbin/route change default $ng_gw
    sleep 3
    killall -9 ppp
    sleep 5
    killall ppp
    sleep 7
    killall ppp
    sleep 45
    ppp -ddial fregat
    fi
else
    if ping -c 3 -S $ng_ip ya.ru > /dev/null
    if [ "$ng_gw" != "$def_gw" ] > /dev/null
    then
       /sbin/route change default $ng_gw
    fi
exit 0
fi
rm -f /tmp/ping_checker.lock

fi
pf.conf сделал следующего вида:

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

set limit states 128000
set optimization aggressive
nat pass on re1 from 10.0.0.0/8 to any -> re1
nat pass on re1 from 192.168.1.0/24 to any -> re1
nat pass on tun0 from 10.0.0.0/8 to any -> ip
nat pass on tun0 from 192.168.1.0/24 to any -> ip
Фаервол пока не трогал, поставил там allow from any to any.
После чего наблюдается следующая картина: по умолчанию уже работает статика (и это хорошо), при ее выдергивании канал переключается на второго прова, который работает через pppoe и тут начинается веселье, с клиентской тачки пинг никуда не идет, страницы не открываются, но сцуко скайп та работает.
Помогите плизз с этим справиться.

kuhar2007
сержант
Сообщения: 243
Зарегистрирован: 2008-12-22 14:40:35

Re: Скрипт переключения между каналами

Непрочитанное сообщение kuhar2007 » 2012-07-07 10:04:02

Кстати ведь нельзя юзать два шлюза, может трабл в том что когда работал по статике был один шлюз, при ее вытыкании фря юзает старый шлюз, который уже не пашет и не меняет на новый, что-то мне кажется загвостка тут.
Скорее всего на обробатывается /sbin/route change default $tun_gw скоро похимичу и отпишусь;)

kuhar2007
сержант
Сообщения: 243
Зарегистрирован: 2008-12-22 14:40:35

Re: Скрипт переключения между каналами

Непрочитанное сообщение kuhar2007 » 2012-07-10 11:59:01

В общем вручную меняю шлюз и инет у пользователя заводится, видимо скрипт не меняет роуты.
Кто-нибудь сможет помочь внести корректировки в скрипт?

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

Re: Скрипт переключения между каналами

Непрочитанное сообщение skeletor » 2012-07-10 13:25:01

Честно говоря скрипт какой-то некрасивый (зачем столько killall да и ещё после kill -9 ?), да и без форматирования if'a вообще с трудом читается.
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

Аватара пользователя
Miguel
ефрейтор
Сообщения: 58
Зарегистрирован: 2011-03-28 8:56:22

Re: Скрипт переключения между каналами

Непрочитанное сообщение Miguel » 2012-07-10 15:23:46

Ну скрипт из крона запускается от рута, да?
Логика вашего скрипта не совсем ясна. Сразу - у вас две переменные ng_ip и ng_gw - они же не меняются, ибо статика. Можно прописать их как есть. Нахрена это ифконфиг блаблабла?
Далее - вы пишете, что надо по-умолчанию иметь инет на статике. Ну так и проверяйте сразу есть он или нет на интерфейсе re0. Если есть - выход из цикла.
У вас получается так - сначала дефолтный шлюз устанавливается на адсл прова и потом вы пингуете яндекс. Пинги проходят, условие if ping ... then exit 0 выполняется, и вы остаетесь на адсл. Статика не используется.
Может быть вообще имеет смысл прописать постоянный маршрут (подвесив его до кучи на интерфейс re0) через шлюз провайдера по статике на какой-нибудь ntp.glb.nist.gov и его периодически пинговать? Так вы точно определите что на статике инет отвалился. Тогда стандартно можете поднимать mpd. При этом пингуете ntp.glb.nist.gov, как пинг пошел - пришибаем mpd и прописываем дефолтный шлюз обратно - статический.
Даже стеклотара чья-то аватара.

Аватара пользователя
Miguel
ефрейтор
Сообщения: 58
Зарегистрирован: 2011-03-28 8:56:22

Re: Скрипт переключения между каналами

Непрочитанное сообщение Miguel » 2012-07-10 15:45:04

И вообще, у вас до секции

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

else
    if ping -c 3 -S $ng_ip ya.ru > /dev/null
    if [ "$ng_gw" != "$def_gw" ] > /dev/null
    then
       /sbin/route change default $ng_gw
    fi
exit 0
дело не доходит, имхо

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

    if ping -c 3 -S $ng_ip ya.ru > /dev/null
    if [ "$ng_gw" != "$def_gw" ] > /dev/null
тут заругается на первый if (then где?)

И откуда в указанной секции else? Или я чего не понимаю?
Даже стеклотара чья-то аватара.

styleprint
рядовой
Сообщения: 19
Зарегистрирован: 2012-07-12 21:57:33

Re: Скрипт переключения между каналами

Непрочитанное сообщение styleprint » 2012-07-13 11:09:43

http://habrahabr.ru/post/66851/
почитай может поможет.