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

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

Добавлено: 09 ноя 2009 10:20
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
Но не заработал толком он.

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

Добавлено: 09 ноя 2009 10:47
michael
А в чём неработоспособность заключается?

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

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

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

Добавлено: 09 ноя 2009 12:29
Лимон
DNS?

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

Добавлено: 09 ноя 2009 12:47
VerstaK
Поставил и настроил bind. Так что в этом вроде проблемы не должно быть

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

Добавлено: 09 ноя 2009 13:10
Лимон
твой bind у кого берет адреса?

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

Добавлено: 09 ноя 2009 13:19
Лимон
VerstaK писал(а):Выдернул шнут из сетевой карты всторого провайдера - вроде заработало. Воткнул - снова затуп
сокеты привязываются к адресу второго провайдера, а пакеты посылаются через первого - косяк, у тебя не та сеть, что б так делать.
включи NAT на обоих провайдеров.

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

Добавлено: 10 ноя 2009 12:03
VerstaK
подскажите - как сделать НАТ одновременно на двух провайдеров?

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

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

у меня на прошлой работе был такой скрипт, как раз между данными провайдерами, настраивал в филиале в уссурийске, писал прямо на месте, к сожалению, вроде вытащить забыл, когда увольнялся :(

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

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

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

Добавлено: 16 ноя 2009 22:55
hatred
сделать переключение намного проще объединения :)

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

достаточно простого скрипта, руководства по BASH и команд ifconfig, ping, ip route show/add/del
можно добавить второй хоп - пинг общего внешнего ресурса, для переключения когда у провайдера аплинк в дауне, но это уже после прикручивается.

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

Добавлено: 18 ноя 2009 13:47
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.

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

Добавлено: 18 ноя 2009 17:36
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


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

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

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

Добавлено: 19 ноя 2009 12:43
hatred
если у тебя правила завязаны на интерфейсы, то нужно менять, но тут уже ты ссзб - разбирайся.
в общем случае нужно перебросить нат и дефолтный роутинг. работу скрипта не проверял, возможны баги.