Adsl reset
Статья посвящается владельцам глючных ADSL модемов DLink, в частности модели 2500U, которая зависает с периодичностью около одного раза в сутки, перекрывая жертве и ее близким родственникам жизненно важный доступ к Интернету. Причиной зависания может быть включённый UPnP, старая прошивка, переполнение таблиц маршрутизации или таблиц NAT, перегрев и т.д. Отключение UPnP, настройка автоматического завершения и возобновления сессии PPPoE соединения и прошивка модема последней версией firmware, конечно, снижают частоту зависаний, но не снимают проблему полностью. Этот пост предлагает стройное решение не только для "мягких" зависаний, когда модем просто теряет коннект к интернету, но и для "жестких" случаев, при которых модем даже не отвечает по web-интерфейсу. Решение задачи состоит в том, чтобы при помощи управляемой розетки перезагружать модем по питанию в зависимости от результатов периодически выполняемого скрипта проверки интернет-соединения. Приборы и материалы: компьютер, который будет контролировать соединение модема с интернетом и при пропадании последнего перезагружать модем по питанию. ОС Windows или Linux. Необходимо наличие LPT порта. консоль - cmd в Windows, Terminal в Ubuntu. LPT управляемая розетка Любимый напиток DLink 2500U Программная перезагрузка модема и ее недостатки Ради справедливости отмечу, что опытный системный администратор ОС Linux вполне может обойтись написанием скрипта или простой программы для подсоединения к модему при потере соединения с Интернетом по протоколу telnet и перезагрузки командой reboot примерно так (возможно, некоторые ожидаемые командой expect строки придется поправить руками - модем может отвечать на telnet запросы несколько иначе):
#!/bin/sh WATCHED_IP="www.ru" MODEM_IP="192.168.1.1" USERNAME="admin" PASSWORD="" # watch for remote host ping -q -c 1 "$WATCHED_IP" > /dev/null && exit # exit if modem is down ping -q -c 1 "$MODEM_IP" > /dev/null || exit expect - << EOF set send_slow {1 .1} spawn /usr/bin/telnet "$MODEM_IP" expect -exact "ADSL Router" expect -exact "Login: " send -s -- "$USERNAME\r" expect -exact "Password:" send -s -- "$PASSWORD\r" expect -exact "> " send -s "reboot\r" expect -exact "The system shell is being reset. Please wait..." exit EOF
Не забудьте заменить IP адрес модема, имя пользователя и пароль в скрипте на параметры, соответствующие реальности. Этот скрипт сохраняется в файл и ставится при помощи cron на исполнение каждые 3 минуты. Вариант для Windows - поставленный с помощью планировщика заданий на выполнение каждые 3 минуты командный *.bat файл с таким содержанием:
@Echo Off SetLocal EnableExtensions EnableDelayedExpansion ping www.ru If !ErrorLevel! == 0 ( Echo Internet Online ) Else ( Echo Internet Offline Echo rebooting modem.. rundll32 url.dll,FileProtocolHandler http://192.168.1.1/rebootinfo.cgi )
Но этот способ оставляет проблему нерешенной, если модем завис так, что даже не отвечает по web-интерфейсу. А также такой вариант привязывает нас к конкретному типу устройства, заставляя изучать мануалы и тестировать скрипт перезагрузки модема с помощью специфичных для него команд. В этих двух скриптах мы использовали страничку модема rebootinfo.cgi , которая позволяет перезагрузить модем без прохождения процедуры авторизации, а также использовали знание специфичных для этой модели сообщений, которыми модем отвечает при управлении через telnet. При необходимости надежного решения задачи контроля интернет-соединения независимо от типа модема остается только перезагрузка по питанию с помощью управляемой розетки. Подключив розетку к питанию 220В и порту LPT, приступаем к главной части, которая включает создание командных скриптов и расписания для их автоматического выполнения. Аппаратная перезагрузка модема в ОС Windows Скрипт для операционной системы Windows использует консольную программу для переключения состояния розеток LPTConsoleControl. Напишем командный *.bat файл со следующим содержанием:
@Echo Off SetLocal EnableExtensions EnableDelayedExpansion ping www.ru If !ErrorLevel! == 0 ( Echo Internet Online ) Else ( Echo Internet Offline Echo Switching modem on LPT pin#0 power line off.. start LPTConsoleControl /pin=0 /status=0 Echo pinging localhost for pause ping 127.0.0.1 Echo Switching modem on LPT pin#0 power line on.. start LPTConsoleControl /pin=0 /status=1 )
Cкрипт для Windows можно скачать в виде командного *.bat файла. Этот скрипт включен в дистрибутив программы LPTConsoleControl, которая используется для переключения состояния управляемой розетки. Обратите внимание на параметр pin в скрипте - он должен соответствовать реальному номеру LPT канала, к которому подключена управляемая розетка. Для управляемых розеток в исполнении LPT-watchdog номер LPT канала всегда равен 0. Далее с помощью планировщика заданий (Пуск - Стандартные - Служебные - Планировщик задач) создаем задачу на выполнение созданного командного файла или файла modem-watchdog-script.bat из дистрибутива LPTConsoleControl с требуемой периодичностью от имени SYSTEM. Трех минут обычно бывает достаточно для периодичности выполнения скрипта, меньше ставить нежелательно, так как модем должен успевать включиться и выйти в интернет до следующей проверки, в ином случае будет бесконечный цикл перезагрузок. Аппаратная перезагрузка модема в ОС Linux Скрипт для Linux использует штатные средства ОС для работы с LPT портом (модуль pyparallel). Создаем скрипт как в варианте с перезагрузкой через интерфейс, но заменяем инструкции telnet на команды управления LPT:
#!/bin/sh WATCHED_IP="www.ru" # watch for remote host ping -q -c 1 "$WATCHED_IP" > /dev/null && exit rmmod lp modprobe ppdev python import parallel, time p = parallel.Parallel() # open LPT1 p.setData(0x00) time.sleep(3) p.setData(0x01) quit() EOF
Для работы этого скрипта нужен Python и pyparallel. В Ubuntu можно поставить их через apt-get install или через Synaptic. Купить управляемую розетку в исполнении "LPT-watchdog" можно в действующем на сайте интернет-магазине. Безлимитного и безотказного интернета и до встречи в последующих статьях!