LINUX.ORG.RU
решено ФорумAdmin

Скрипт проверки тырнета

 , ,


2

4

Здравствуйте Уважаемые! Есть вот такой вот скриптик:

#!/bin/sh
HOST="8.8.8.8"

# Файл-флаг. Появляется при переключении на резервный канал
LOCKFILE="/tmp/check_internet.lock"

# Файл журнала
LOGFILE="/var/log/check_internet.log"

#Добавляем маршрут до 8.8.8.8 через 1прова
ip route add 8.8.8.8 via 119.228.242.13 dev eth0

while :
do

# Пингуем проверочный хост через основной канал
ping -I 95.79.221.8 -c 8 -n -q ${HOST} > /dev/null

# Если возникла ошибка (хост не доступен)
if [ $? -ne "0" ]; then
        # Если нет файла-флага
        if [ ! -f ${LOCKFILE} ]; then
                #удаляем маршрут по умолчанию через 1прова
                ip route del default
                #добавляем маршрут по умолчанию через РТК
                ip route add default via 203.208.106.37 dev ppp100
                # Создаём файл флаг
                touch ${LOCKFILE}
                # Делаем запись в файл журнала
                echo `date +'%Y/%m/%d %H:%M:%S'` 1st inet connection lost >> ${LOGFILE}
        fi
# Если же всё хорошо
else
        # Если есть файл-флаг
        if [ -f ${LOCKFILE} ]; then
                #удаляем маршрут по умолчанию через РТК
                ip route del default via 203.208.106.37 dev ppp100
                #добавляем маршрут по умолчанию через 1прова
                ip route add default via 119.228.242.13 dev eth0
                # Удаляем файл-флаг
                rm -f ${LOCKFILE}
                # Записываем событие в файл журнала
                echo `date +'%Y/%m/%d %H:%M:%S'` 1st connetction UP >> ${LOGFILE}
        fi
fi
done

Скрипт отрабатывает на ура, в случаях падения линка, либо недоступности 8.8.8.8, но есть небольшая трабла. Когда на 1м провайдере заканчиваются деньги, скрипт этого не видит и считает что все ок, т.к данный пров в случае задолженности не блокирует ICMP, а взаместо любых веб страниц отдает свою заглушку «пополните баланс». Telnet и другие протоколы не проверял, да и снаружи по SSH сервер не отвечает, только на пинг отвечает.
Пробовал
curl -Is http://${HOST} |head -n 1
, если все ок то отдает страницу, если баланс отрицательный - возвращает страницу залушку. Т.е ответ всё такой же HTTP/1.1 200 OK.
Есть идеи как еще простецким способом проверять доступность интернет-соединения?


Смотреть, что в выводе нету строки типа «пополните баланс»?

! wget -O - google.com |& grep --silent 'пополните баланс'

xaizek ★★★★★ ()

а что он с https делает?

LiBer ★★★ ()

google уже много лет делает редирект на главной, можно использовать почти с гарантией.

stanislav@4unit:~$ printf "HEAD / HTTP/1.1\r\n\r\n" | nc  google.com 80
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: http://www.google.nl/?gfe_rd=cr&dcr=0&ei=moO-WaH8KsrFsAGhwLawAw
Content-Length: 268
Date: Sun, 17 Sep 2017 14:15:54 GMT
HTTP/1.1 302 Found
Location: http://www.google
используй наличие этих строк для проверки, сомневаюсь, что провайдер будет подделывать их ради выдачи в итоге заглушки.

system-root ★★★★★ ()
Ответ на: комментарий от system-root

Только лучше HTTP/1.0, тогда скрипт сразу завершится.

vodz ★★★★★ ()

Костылестроение, но навеяло 8.8.8.8. :)
У вас пров заворачивает все обращения на 53-й порт к своему днс?
Если да, то я бы за такое по голове настучал и послал бы такого прова.
Если нет, то что-то типа host host-name ip-dns тоже как вариант.
Это конечно костыли но они проще чем парсить выхлоп.

anc ★★★★★ ()
Ответ на: комментарий от anc

пров не трогает DNS ) он просто ICMP не блочит. Т.е 8.8.8.8 на пинг ответит, а вот на nslookup уже по бороде отправит.

CeMKa ()

Всем спасибо за варианты! В ближайшее время попробую - отпишусь.

CeMKa ()

4.2.2.2 и 2600::

Насколько я помню, заводские прошивки многих роутеров проверяют ICMP до IPv4 4.2.2.2 и IPv6 2600::, и когда я искал информацию что же правильно пинговать, то выяснил что именно эти два адреса.

Но сейчас, когда у большинства провайдеров РФ стоит DPI, наверно имеет смысл использовать не ICMP, а HTTPS. В этом случае я бы использовал https://google.com для проверки наличия доступа в Интернет.

LeNiN ()

пров в случае задолженности не блокирует ICMP

Так поставь iodine и продолжай пользоваться своим тырнетом xD

anonymous ()
Ответ на: комментарий от system-root

Не прокатило, что в нормальном, что в заблокированном состоянии выдает:

root@debian:/tmp# printf "HEAD / HTTP/1.0\r\n\r\n" | nc  google.com 80
HTTP/1.0 405 Method Not Allowed
Date: Mon, 18 Sep 2017 16:29:25 GMT
Content-Type: text/html; charset=UTF-8
Server: HTTP server (unknown)
Content-Length: 1589
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

root@debian:/tmp# printf "HEAD / HTTP/1.1\r\n\r\n" | nc  google.com 80
HTTP/1.1 405 Method Not Allowed
Date: Mon, 18 Sep 2017 16:29:54 GMT
Content-Type: text/html; charset=UTF-8
Server: HTTP server (unknown)
Content-Length: 1589
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

CeMKa ()
Ответ на: комментарий от xaizek

Воспользовался вашим вариантом, немного подредактировав - все заработало как требовалось.

wget -O - www.ru --bind-address 95.79.221.8 |& grep --silent "RU-CENTER" > /dev/null
Если проверять гугл, то он через какое-то время начинает требовать капчу, что добавляет счетчик недобросовестности к моему ip.

Всем большое спасибо за напутствие!
Вопрос закрыт.

CeMKa ()
Ответ на: комментарий от CeMKa

Ну странице конечно уже много лет, а вдруг поменяют? Я бы все-таки на чем-то по проще остановился чем парсинг чужой страницы.

anc ★★★★★ ()
Ответ на: 4.2.2.2 и 2600:: от LeNiN

А можно линк где это написано, ибо мои поиски пока что не привели к успеху.

lone_wolf ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.