Определение доступности интернет на определенном интерфейсе

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение mike345 » 2009-04-02 22:07:42

К частому вопросу о двух подключениях и резервному каналу.
Использую такой скрипт из cron

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

#!/bin/sh
 
#Шлюз основного канала
GW1="80.xxx.xxx.177"

#Шлюз резервного канала
GW2="192.168.1.1"
 
/sbin/ping -q -c 1 $GW1 > /dev/null 2>&1
#/sbin/ping -q -c 2 -I 80.xxx.xxx.177 93.158.134.11 > /dev/null 2>&1
 if [ $? != 0 ]; then
 /sbin/ping -q -c 1 $GW2 > /dev/null 2>&1
        if [ $? = 0 ]; then
                if [ ! -f /tmp/gw.changed ]; then
                        /sbin/route change default $GW2 && touch /tmp/gw.changed
                        /etc/rc.ipfw.adsl > /dev/null 2>&1
                fi
        fi
else
        if [ -f /tmp/gw.changed ]; then
        /sbin/route change default $GW1 && rm /tmp/gw.changed
        /etc/rc.ipfw > /dev/null 2>&1
        fi
fi
Все работает, но есть одно но:
Пингуя шлюз 80.xxx.xxx.177 нельзя быть уверенным что интернет есть. Даже при наличии ответа от него все равно интернета может не быть.
А если пинговать yandex, к примеру, то как можно сделать чтобы запрос и ответ посылался через именно этот канал, если маршрут по умолчанию в этот момент другой?

Пробовал использовать ключ -I, но

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

ping -q -c 2 -I 80.xxx.xxx.177 93.158.134.11
говорит

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

-I, -L, -T flags cannot be used with unicast destination
а,

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

ping -q -c 2 -I vr0 93.158.134.11

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

invalig multicast interface
Как можно решить этот вопрос?

Хостинговая компания 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/


Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение mike345 » 2009-04-02 23:08:28

-S, как я понял работает только с адресами интерфейсов физическими присутствующими на машине (80.xxx.xxx.179), а надо чтобы пакет прошел через другой шлюз (80.xxx.xxx.177) и проверил доступность адреса 93.158.134.11.
Тоесть конструкция

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

ping -q -c 1 -S 80.xxx.xxx.179 80.xxx.xxx.177
Срабатывает, но это не показывает доступность интернета, а только доступность шлюза.
(80.xxx.xxx.177 Шлюз провайдера, 80.xxx.xxx.179 IP интерфейса)

А вот это, с нужным адресом и при включенном другом шлюзе по умолчанию (192.168.1.1):

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

ping -q -c 1 -S 80.xxx.xxx.177 93.158.134.11
100% packet loss :(

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

ping -q -c 1 -S 80.xxx.xxx.179 93.158.134.11
ping: bind: cat'n assign reguested address

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение paradox » 2009-04-02 23:19:07

если у вас адсл это модем
то на модеме поставте бридж
а pppoe заведите на бсд
и тогда по ап даун скриптам будете уже знать куда крутить роут

Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение mike345 » 2009-04-02 23:39:18

Основной канал по витой паре, а дополнительный ADSL, который как раз почти и не используется.
И частенько бывает так, что шлюз и DNS основного канала доступны, а интернета на этом канале нет.
Думаю в этом случае, особого смысла делать бридж на модеме нет, тк главным критерием переключения является доступность интернет по витой паре, а не по ADSL. Или я неправильно понимаю?

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение paradox » 2009-04-02 23:57:01

хм
что шлюз и DNS основного канала доступны, а интернета на этом канале нет.
так а почему не получаеться сделать пинг -S
относительно интрефейса основного канала на какойто апишник меил ру к примеру?

Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение mike345 » 2009-04-03 0:21:50

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

ping -S 80.xxx.xxx.179 93.158.134.11
Пинг проходит если шлюз по умолчанию 80.x.x.177
Пинг не проходит если шлюз по умолчанию 192.168.1.1
те после переключения на запасной канал (шлюз 192.168.1.1), к основному (шлюз 80.x.x.177) уже не переключиться, потому что следующая строка

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

ping -S 80.xxx.xxx.179 93.158.134.11
всегда выдает packet lost...

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение paradox » 2009-04-03 0:47:07

мм
а если временно вставлять роут до меил ру через другой шлюз?
на время пинга -S
и проверять
а потом удалять роту на меил ру

Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение mike345 » 2009-04-03 2:04:05

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

Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение mike345 » 2009-04-03 2:15:22

RDP и SSH соединения тоже восстановились. :Yahoo!:
Еще раз спасибо.
Буду дальше ковырять...
Интересно нет ли каких подводных камней...

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение schizoid » 2009-04-14 10:28:39

я как-то так проверяю

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

ping -S 192.168.30.2 -c 3 195.5.х.х >> /dev/null
if [ $? = 0 ]; then
#echo "Dynamic good!"
else
echo "Dynamic is down!"
fi
где 192.168.30.2 - ИП на интерефейсе, а 195.5.х.х - шлюз модема(который в режиме роутера)
ядерный взрыв...смертельно красиво...жаль, что не вечно...

Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение mike345 » 2009-04-14 12:39:06

schizoid писал(а):195.5.х.х - шлюз модема(который в режиме роутера)
Я также примерно организовал... Вот только шлюз модема, это еще не интернет. У меня бывает что шлюз и DNS доступен, а вот интернет нет...
В общем сделал так:

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

#!/bin/sh

GW1="80.x.x.x"
GW2="192.168.1.1"
IP1="93.158.134.11"
IP2="194.67.57.26"
IP3="213.x.x.x"
site1=0; site2=0; site3=0; tping1=0; site4=0; site5=0; site6=0; tping2=0
raw=`netstat -rn | grep default`
raw1=${raw#default }
raw2=${raw1%%[a-zA-Z]*}
GW=${raw2% *}

# Авторизация у провайдера
/sbin/route add 77.x.x.x $GW1 > /dev/null 2>&1
/usr/local/bin/curl -u user:pass -k -s https://77.x.x.x/webauth/gcauth.php?action=tick > /var/log/gcauth_last
sleep 1

/sbin/route add 10.20.6.254 $GW1 > /dev/null 2>&1
/sbin/route add $IP1 $GW1 > /dev/null 2>&1
/sbin/route add $IP2 $GW1 > /dev/null 2>&1
/sbin/route add $IP3 $GW1 > /dev/null 2>&1
/sbin/ping -q -c 1 $IP1  > /dev/null 2>&1
 if [ $? != 0 ]; then site1=1
/sbin/ping -q -c 1 $IP2  > /dev/null 2>&1
 if [ $? != 0 ]; then site2=1
/sbin/ping -q -c 1  $IP3  > /dev/null 2>&1
 if [ $? != 0 ]; then site3=1; fi; fi; fi
/sbin/route delete $IP1 $GW1 > /dev/null 2>&1
/sbin/route delete $IP2 $GW1 > /dev/null 2>&1
/sbin/route delete $IP3 $GW1 > /dev/null 2>&1

/sbin/route add $IP1 $GW2 > /dev/null 2>&1
/sbin/route add $IP2 $GW2 > /dev/null 2>&1
/sbin/route add $IP3 $GW2 > /dev/null 2>&1
/sbin/ping -q -c 1 $IP1  > /dev/null 2>&1
 if [ $? != 0 ]; then site4=1
/sbin/ping -q -c 1 $IP2  > /dev/null 2>&1
 if [ $? != 0 ]; then site5=1
/sbin/ping -q -c 1  $IP3  > /dev/null 2>&1
 if [ $? != 0 ]; then site6=1; fi; fi; fi
/sbin/route delete $IP1 $GW2 > /dev/null 2>&1
/sbin/route delete $IP2 $GW2 > /dev/null 2>&1
/sbin/route delete $IP3 $GW2 > /dev/null 2>&1

 if [ ${site1} = 1 ]; then
    if [ ${site2} = 1 ]; then
	 if [ ${site3} = 1 ]; then
	    tping1=1
 fi; fi; fi

 if [ ${site4} = 1 ]; then
    if [ ${site5} = 1 ]; then
	 if [ ${site6} = 1 ]; then
	    tping2=1
fi;  fi; fi


 if [ $GW = $GW1 ]; then
        if [ $tping1 = 1 ]; then
	    if [ $tping2 = 0 ]; then
	    /sbin/route change default $GW2
	    /etc/rc.ipfw.adsl
fi; fi; fi

if [ $GW = $GW2 ]; then
    if [ $tping1 = 0 ]; then		
	    /sbin/route change default $GW1; 
	    /etc/rc.ipfw
	fi; fi
if [ $tping1 = 1 ]; then echo "BASE CHANNEL IS BAD";
echo site1 $site1 site2 $site2 site3 $site3 tping1 $tping1 GW $GW
echo site4 $site4 site5 $site5 site6 $site6 tping2 $tping2 GW $GW
fi
if [ $tping2 = 1 ]; then echo "REZERV CHANNEL IS BAD";
echo site1 $site1 site2 $site2 site3 $site3 tping1 $tping1 GW $GW
echo site4 $site4 site5 $site5 site6 $site6 tping2 $tping2 GW $GW

# Запуск скрипта перезагрузки модема по telnet (подвисает он иногда)
/usr/local/etc/script/modem_reset && echo "ADSL MODEM REBOOTING..." || echo "Rebooting modem ERROR!"
fi

Наверно можно как-то проще сделать, но вроде работает...
Вот один вопрос остался, какие выбрать хосты, чтобы постоянное переключение gateway не мешало (сейчас там яндекс, что-то еще часто используемое и мой удаленный сервак)?
Кстати заметил, что из cron выполняется только когда в скрипте абсолютные пути указаны. Так и должно быть?

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение zingel » 2009-04-14 12:48:13

cron это программа, а не юзер он не имеет своего _постоянного_ env отсюда лучше юзать полные пути
Z301171463546 - можно пожертвовать мне денег


Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: Определение доступности интернет на определенном интерфейсе

Непрочитанное сообщение zingel » 2009-04-14 12:52:18

я согласен, но если у пользователя свой крон, или кривой PATH
Z301171463546 - можно пожертвовать мне денег