А теперь ищем эту самую внешнюю сеть :)

Решал задачу доступа извне к домашнему компьютеру и через две недели наслаждения результатами труда на меня напала новая напасть - роутер теряет внешнюю сеть. "Лечится" только перезагрузкой роутера. Роутер сам по себе вполне приличный - Zyxel Keenetic Giga с самой последней прошивкой. И подключен к электрической сети через стабилизатор напряжения. Грешу все-таки на своего интернет-провайдера - "Киевстар" - , но "система" должна ведь работать! Логи роутера не читал - можно долго и нудно бодаться с провайдером, но независимо от этого надо проверять работоспособность исходящего канала и, в случае проблем, перезагружать роутер.

Самый простой вариант - в самом роутере поставить в crontab задачу для пинга какого-то внешнего сервера и в случае отсутствия ответа отправлять его в перезагрузку. Но в данном роутере по умолчанию нет SSH, хоть он и работает на Linux. Shell можно добавить "внешним приложением" с постоянно включенной в него флешки, но такой вариант предусмотрен только в V.1 прошивки, а у меня V.2... Значит надо эту проверку проводить с другого устройства внутри моей домашней сети и потом давать команду роутеру на перезагрузку. Выбор был из двух устройств - HTPC под Windows 7, из-за которого это все затевалось, и простаивающий без дела после неудачных экспериментов с построением станции видеонаблюдения Raspberry Pi под управлением клона Debian. Выбор пал на Raspberry - в таком формате он может спокойно годами работать без перезагрузки и стоит прямо рядом с роутером, запитанный через тот же самый стабилизатор напряжения. Вот что было сделано:

  • Так как в роутере нет SSH, а управление может осуществляться только через telnet или web-интерфейс с написанной на JAVA кнопкой перезагрузки, я написал shell-скрипт для перезагрузки роутера с использованием приложения expect, имеющегося на серверах официального релиза Raspbian:

    скрипт zyxel_keenetic_reboot.sh

    (основанный на этом образце):

    Цитата:
    #!/usr/bin/expect -f

    #отключаем вывод протокола диалога send-expect на экран
    log_user 0
    #выполняем telnet к устройству
    spawn telnet 192.168.1.1
    #ждем приглашение "Login:" и просим expect набрать admin и нажать ввод - \r
    expect "Login:" {send "admin\r"}
    #тоже только вводим пароль
    expect "Password:" {send "my_password\r"}
    #уже авторизовались, поэтому ждем приглашения (config) и вводим команду reboot-a
    expect "(config)" {send "system reboot\r"}
    #включаем вывод протокола диалога send-expect на экран, чтобы посмотреть чем закончился скрипт
    log_user 1
    #выходим из устройства
    send "quit\r"
    #завершаем работы expect
    expect eof

    Скрипт этот лучше всего положить в папку /bin с правами доступа 750 или 700, что бы спрятать его от "посторонних глаз". Для проверки его можно "подергать" вручную, набрав команду с правами суперпользователя:

    Цитата:
    # zyxel_keenetic_reboot.sh

    и он должен исправно делать "софтовую" перезагрузку роутера.

  • Теперь скрипт, который будет проверять доступность внешней сети и, в случае необходимости, запускать скрипт zyxel_keenetic_reboot.sh:

    скрипт zyxel_keenetic_ping_test.sh

    Цитата:
    @! /bin/bash

    if ping -c 1 8.8.8.8 >> /dev/null
    then
    echo "ping is Ok"
    else
    zyxel_keenetic_reboot.sh
    fi

    Долго думал какой внешний сервер проверять - остановился на DNS-сервере компании Google (8.8.8.8 ). Вы можете подставить любой свой сервер.

  • В crontab теперь надо повесить задачу от имени суперпользователя, которая будет регулярно запускать скрипт zyxel_keenetic_ping_test.sh на проверку:
    Цитата:
    $ sudo crontab -e

    В открывшемся окне редактора добавить вот такую строку, запускающую скрипт на проверку каждые 5 минут:
    Цитата:
    */5 * * * * zyxel_keenetic_ping_test.sh

PS
А вот какой скрипт на VBS мне предложили в российской службе поддержки Zyxel, который можно запускать из диспетчера задач Windows:

Цитата:
set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.run "telnet.exe"

WScript.Sleep 5000
WshShell.SendKeys"o 192.168.1.1" & chr(13)

WScript.Sleep 5000
WshShell.SendKeys"admin" & chr(13) -> Ваш логин

WScript.Sleep 5000
WshShell.SendKeys"1234" & chr(13) ->ваш пароль

WScript.Sleep 5000
WshShell.SendKeys"system reboot" & chr(13)

WScript.Sleep 3500
ProcessClose("cmd.exe")
ProcessClose("telnet.exe")
Function ProcessClose(sProcName)
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & sProcName & "'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
End Function


Re: А теперь ищем эту самую внешнюю сеть :)

Цитата:
...
Долго думал какой внешний сервер проверять - остановился на DNS-сервере компании Google (8.8.8.8 ). Вы можете подставить любой свой сервер.
...

К сожалению достаточно часто этот сервер дает слишком большую задержку ответа :( От одного сисадмина поступило предложение использовать для проверки сервер 8.4.4.4 - он, вроде как, работает намного стабильней.

Отправить новый комментарий

Содержимое этого поля хранится скрыто и не будет показываться публично.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can use BBCode tags in the text.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.

Больше информации о возможностях форматирования

CAPTCHA
Этот вопрос задается для проверки того, не является ли обратная сторона программой-роботом (для предотвращения попыток автоматической регистрации).