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

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

Добавлено: 2009-04-02 22:07:42
mike345
К частому вопросу о двух подключениях и резервному каналу.
Использую такой скрипт из 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
Как можно решить этот вопрос?

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

Добавлено: 2009-04-02 22:10:53
paradox
там помоему опция -S была

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

Добавлено: 2009-04-02 23:08:28
mike345
-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

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

Добавлено: 2009-04-02 23:19:07
paradox
если у вас адсл это модем
то на модеме поставте бридж
а pppoe заведите на бсд
и тогда по ап даун скриптам будете уже знать куда крутить роут

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

Добавлено: 2009-04-02 23:39:18
mike345
Основной канал по витой паре, а дополнительный ADSL, который как раз почти и не используется.
И частенько бывает так, что шлюз и DNS основного канала доступны, а интернета на этом канале нет.
Думаю в этом случае, особого смысла делать бридж на модеме нет, тк главным критерием переключения является доступность интернет по витой паре, а не по ADSL. Или я неправильно понимаю?

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

Добавлено: 2009-04-02 23:57:01
paradox
хм
что шлюз и DNS основного канала доступны, а интернета на этом канале нет.
так а почему не получаеться сделать пинг -S
относительно интрефейса основного канала на какойто апишник меил ру к примеру?

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

Добавлено: 2009-04-03 0:21:50
mike345

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

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...

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

Добавлено: 2009-04-03 0:47:07
paradox
мм
а если временно вставлять роут до меил ру через другой шлюз?
на время пинга -S
и проверять
а потом удалять роту на меил ру

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

Добавлено: 2009-04-03 2:04:05
mike345
Мда, интересная идея спасибо.
При двух сменах шлюза и правил фаервола с натом закачка с рапиды восстановилась...
Сейчас еще проверю ssh и rdp разорвется или нет...

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

Добавлено: 2009-04-03 2:15:22
mike345
RDP и SSH соединения тоже восстановились. :Yahoo!:
Еще раз спасибо.
Буду дальше ковырять...
Интересно нет ли каких подводных камней...

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

Добавлено: 2009-04-14 10:28:39
schizoid
я как-то так проверяю

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

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.х.х - шлюз модема(который в режиме роутера)

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

Добавлено: 2009-04-14 12:39:06
mike345
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 выполняется только когда в скрипте абсолютные пути указаны. Так и должно быть?

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

Добавлено: 2009-04-14 12:48:13
zingel
cron это программа, а не юзер он не имеет своего _постоянного_ env отсюда лучше юзать полные пути

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

Добавлено: 2009-04-14 12:48:48
paradox
крон выполняеться от /

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

Добавлено: 2009-04-14 12:52:18
zingel
я согласен, но если у пользователя свой крон, или кривой PATH