Резервный канал интернета

Технические обсуждения
VerstaK
Advanced Newbie
Advanced Newbie
Сообщения: 12
Зарегистрирован: 09 ноя 2009 10:14

Резервный канал интернета

Сообщение VerstaK »

Суть пролемы такова:
Стоит Ubuntu 9.04, поднят LAMP, squid, sams.
В сервере три сетевые карты: одна смотрит в локалку, две - на разных провайдеров (Дальсвязь и НТК). Адреса провайдеры выдали статические.
Клиенты ходят в интернет через прокси. Основной канал - НТК.

Задача: огранизовать автоматическое переключение на резервный канал Дальсвязи, если НТК вдруг "падает". И переключение на него, как только связь восстанавливается.

Есть у кого подобный опыт? Может подскажете?

Я пробовал вставить в крон скриптик

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

#!/bin/bash
GW_PRIM='93.88.xx.xxx' #наш главный шлюз
GW_RES='82.162.xxx.xx'  #наш резервный шлюз
test_host='78.109.22.22' #появляется только при переходе на резервный канал
HOST1='ya.ru' #хосты для проверки
HOST2='primorye.ru'
HOST3='mail.ru'
R1='ok'
R2='false'
log='/tmp/gw_change.log'
OK="Всё ок"
BAD="Каналья нет!!! Пробуем что-то делать"
 
if [ -f /tmp/gw_change ]
 
then
{
        if /bin/ping -c 3 $test_host &> /dev/null
        then
        {
        route del default && echo удаляем резервный маршрут
        route add default gw $GW_PRIM && echo добавляем основной маршрут
        rm -f /tmp/gw_change && echo удаляем фаил индикатор
        route del -host $test_host  gw $GW_PRIM && echo удаляем статический маршрут
        : > /tmp/gw_change.log
        }
 
        fi
}
elif /bin/ping -c 3 $HOST1 &> /dev/null && echo $HOST1 $R1
 
then echo $OK
 
elif
{
 echo $HOST1 $R2
/bin/ping -c 3 $HOST2 &> /dev/null && echo $HOST2 $R1
}
 then echo $OK
 
elif
{
 echo $HOST2 $R2
 /bin/ping -c 3 $HOST3 &> /dev/null && echo $HOST3 $R1
}
 then
echo $OK
 
else
{
echo $HOST3 $R2
route del default && echo "удаляем основной маршрут" >> $log
route add default gw $GW_RES && echo "добавляем резервный маршрут" >> $log
route add -host $test_host  gw $GW_PRIM && echo "добавляем статический маршрут" >> $log
echo > /tmp/gw_change
#mailx -s "ВНИМАНИЕ резервный канал на `hostname`" postmaster
echo $BAD $log
cat /tmp/gw_change.log | mailx -s "ВНИМАНИЕ резервный канал на `hostname`" postmaster
}
 
fi


Но не заработал толком он.

michael
Full Member
Full Member
Сообщения: 192
Зарегистрирован: 18 сен 2006 08:09
Контактная информация:

Re: Резервный канал интернета

Сообщение michael »

А в чём неработоспособность заключается?

VerstaK
Advanced Newbie
Advanced Newbie
Сообщения: 12
Зарегистрирован: 09 ноя 2009 10:14

Re: Резервный канал интернета

Сообщение VerstaK »

Вообще все получилось достаточно странно.
Файрвол я настроил через графическую убунтовскую утилитку - разрешил только 25, 110 порты да 80 для сервера. Пользователи должны через порт 3128 ходить. Нат решил не поднимать - не особо он и нужен.
Так вот, при подключении обоих инет-интерфейсов сервер-то ходит в инет, а у клиентов полнейший затуп. Выдернул шнут из сетевой карты всторого провайдера - вроде заработало. Воткнул - снова затуп

Лимон
Full Member
Full Member
Сообщения: 140
Зарегистрирован: 26 июн 2009 15:11
Откуда: Владивосток

Re: Резервный канал интернета

Сообщение Лимон »

DNS?

VerstaK
Advanced Newbie
Advanced Newbie
Сообщения: 12
Зарегистрирован: 09 ноя 2009 10:14

Re: Резервный канал интернета

Сообщение VerstaK »

Поставил и настроил bind. Так что в этом вроде проблемы не должно быть

Лимон
Full Member
Full Member
Сообщения: 140
Зарегистрирован: 26 июн 2009 15:11
Откуда: Владивосток

Re: Резервный канал интернета

Сообщение Лимон »

твой bind у кого берет адреса?

Лимон
Full Member
Full Member
Сообщения: 140
Зарегистрирован: 26 июн 2009 15:11
Откуда: Владивосток

Re: Резервный канал интернета

Сообщение Лимон »

VerstaK писал(а):Выдернул шнут из сетевой карты всторого провайдера - вроде заработало. Воткнул - снова затуп

сокеты привязываются к адресу второго провайдера, а пакеты посылаются через первого - косяк, у тебя не та сеть, что б так делать.
включи NAT на обоих провайдеров.

VerstaK
Advanced Newbie
Advanced Newbie
Сообщения: 12
Зарегистрирован: 09 ноя 2009 10:14

Re: Резервный канал интернета

Сообщение VerstaK »

подскажите - как сделать НАТ одновременно на двух провайдеров?

Аватара пользователя
hatred
Global Moderator
Global Moderator
Сообщения: 1205
Зарегистрирован: 08 июн 2006 00:32
Откуда: Владивосток
Контактная информация:

Re: Резервный канал интернета

Сообщение hatred »

нат можно сделать добавлением/удалением правила, или ставить fwmark и менять маршрут при помощи ip route... вообще подобную проблему решал, кстати, учти, что DNS дальсвязи не принимает запросы не от своих клиентов, а DNS нтк - принимает ;-)

у меня на прошлой работе был такой скрипт, как раз между данными провайдерами, настраивал в филиале в уссурийске, писал прямо на месте, к сожалению, вроде вытащить забыл, когда увольнялся :(
Прошли времена когда на элементарные вопросы можно было отвечать man <что-то там> (с) из сети
Hatred's Log Place | My GitHub repos | My Gitlab repos

VerstaK
Advanced Newbie
Advanced Newbie
Сообщения: 12
Зарегистрирован: 09 ноя 2009 10:14

Re: Резервный канал интернета

Сообщение VerstaK »

Есть у меня пара скриптов, найденных в сетях нета, буду пробовать их использовать. Пока что думаю если не будет получаться сделать чисто резервный канал, буду делать объединение пропускной способности, только на второй канал поставлю вес поменьше, чтобы львиная доля трафика шла через основной канал

Аватара пользователя
hatred
Global Moderator
Global Moderator
Сообщения: 1205
Зарегистрирован: 08 июн 2006 00:32
Откуда: Владивосток
Контактная информация:

Re: Резервный канал интернета

Сообщение hatred »

сделать переключение намного проще объединения :)

алгоритм (логические операции выделил):
1. пингуем шлюз 1(основной провайдер), сохраняем результат
2. пингуем шлюз 2, сохраняем результат
3. проверяем роутинг, запоминаем куда идет
4. если шлюз 1 доступен И роутинг указывает НЕ на него - исправить роутинг на 1, изменить iptables
5. если шлюз 1 НЕ доступен И роутинг указывает на него - исправить роутинг на 2, изменить iptables

достаточно простого скрипта, руководства по BASH и команд ifconfig, ping, ip route show/add/del
можно добавить второй хоп - пинг общего внешнего ресурса, для переключения когда у провайдера аплинк в дауне, но это уже после прикручивается.
Прошли времена когда на элементарные вопросы можно было отвечать man <что-то там> (с) из сети
Hatred's Log Place | My GitHub repos | My Gitlab repos

VerstaK
Advanced Newbie
Advanced Newbie
Сообщения: 12
Зарегистрирован: 09 ноя 2009 10:14

Re: Резервный канал интернета

Сообщение VerstaK »

Вот один скрипт

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

#!/bin/bash
GW_PRIM='93.88.15.103' #наш главный шлюз
GW_RES='82.162.244.33'  #наш резервный шлюз
test_host='78.109.22.22' #появляется только при переходе на резервный канал
HOST1='ya.ru' #хосты для проверки
HOST2='primorye.ru'
HOST3='mail.ru'
R1='ok'
R2='false'
log='/tmp/gw_change.log'
OK="Всё ок"
BAD="Каналья нет!!! Пробуем что-то делать"
 
if [ -f /tmp/gw_change ]
 
then
{
        if /bin/ping -c 3 $test_host &> /dev/null
        then
        {
        route del default && echo удаляем резервный маршрут
        route add default gw $GW_PRIM && echo добавляем основной маршрут
        rm -f /tmp/gw_change && echo удаляем фаил индикатор
        route del -host $test_host  gw $GW_PRIM && echo удаляем статический маршрут
        : > /tmp/gw_change.log
        }
 
        fi
}
elif /bin/ping -c 3 $HOST1 &> /dev/null && echo $HOST1 $R1
 
then echo $OK
 
elif
{
 echo $HOST1 $R2
/bin/ping -c 3 $HOST2 &> /dev/null && echo $HOST2 $R1
}
 then echo $OK
 
elif
{
 echo $HOST2 $R2
 /bin/ping -c 3 $HOST3 &> /dev/null && echo $HOST3 $R1
}
 then
echo $OK
 
else
{
echo $HOST3 $R2
route del default && echo "удаляем основной маршрут" >> $log
route add default gw $GW_RES && echo "добавляем резервный маршрут" >> $log
route add -host $test_host  gw $GW_PRIM && echo "добавляем статический маршрут" >> $log
echo > /tmp/gw_change
#mailx -s "ВНИМАНИЕ резервный канал на `hostname`" postmaster
echo $BAD $log
cat /tmp/gw_change.log | mailx -s "ВНИМАНИЕ резервный канал на `hostname`" postmaster
}
 
fi


Тут, как я вижу, не затрагиваются правила IPTABLES.

Аватара пользователя
hatred
Global Moderator
Global Moderator
Сообщения: 1205
Зарегистрирован: 08 июн 2006 00:32
Откуда: Владивосток
Контактная информация:

Re: Резервный канал интернета

Сообщение hatred »

ну да, NAT то делать тоже нужно.

хз, на коленке получается вот такое, можно ещё вылизывать... и т.д.:

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

#!/bin/bash

prov_main_gw="222.222.222.222"
prov_main_if="eth0"

prov_reserv_gw="222.222.222.223"
prov_reserv_if="eth1"

remote="www.ru"

# Without -A/-I, in single quite!!!
main_nat='POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE'
reserv_nat='POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE'

################################################################################
# Check GW
ping -I $prov_main_if   -c 3 $prov_main_gw   > /dev/null 2>&1; gw1=$?
ping -I $prov_reserv_if -c 3 $prov_reserv_gw > /dev/null 2>&1; gw2=$?

# Check remote addr
ping -I $prov_main_if   -c 3 $remote > /dev/null 2>&1; rem1=$?
ping -I $prov_reserv_if -c 3 $remote > /dev/null 2>&1; rem2=$?

# Check current default route
def_iface=`ip route show | grep ^default | awk -F'dev' '{print $2}' | awk '{print $1}'`


if [ x"$def_iface" = x"$prov_reserv_if" ]; then
    # Currently work on reserv iface, try to switch on main
    if [ $gw1 -eq 0 -a $rem1 -eq 0 ]; then
        # Main channel work
        ip route del default
        ip route add default via $prov_main_gw
       
        iptables -D $reserv_nat
        iptables -A $main_nat
    fi
else
    # we are on main line, check and switch it, if needed
    if [ $gw1 -ne 0 -o $rem1 -ne 0 ]; then
        # try to switch only if reserv channel is work
        if [ $gw2 -eq 0 -a $rem1 -eq 0 ]; then
            ip route del default
            ip route add default via $prov_reserv_gw
       
            iptables -D $main_nat
            iptables -A $reserv_nat           
        fi
    fi
fi

Прошли времена когда на элементарные вопросы можно было отвечать man <что-то там> (с) из сети
Hatred's Log Place | My GitHub repos | My Gitlab repos

VerstaK
Advanced Newbie
Advanced Newbie
Сообщения: 12
Зарегистрирован: 09 ноя 2009 10:14

Re: Резервный канал интернета

Сообщение VerstaK »

А остальные правила IPTABLES остаются нетронутыми? У меня например открыты 25, 110, 5900, 3128 и 80 порты. Делал через ГУИ, так как в Линуксе пока слаб... Они (эти правила) не слетают при переключении на резервный канал?

Аватара пользователя
hatred
Global Moderator
Global Moderator
Сообщения: 1205
Зарегистрирован: 08 июн 2006 00:32
Откуда: Владивосток
Контактная информация:

Re: Резервный канал интернета

Сообщение hatred »

если у тебя правила завязаны на интерфейсы, то нужно менять, но тут уже ты ссзб - разбирайся.
в общем случае нужно перебросить нат и дефолтный роутинг. работу скрипта не проверял, возможны баги.
Прошли времена когда на элементарные вопросы можно было отвечать man <что-то там> (с) из сети
Hatred's Log Place | My GitHub repos | My Gitlab repos

Ответить