Как автоматизировать перезапуск роутера при падении соединения через cron

Как автоматизировать перезапуск роутера при падении соединения через cron

Если у вас дома или в офисе роутер периодически «залипает» — интернет пропадает, а сам он не перезагружается, вы не одиноки. Это частая проблема у бюджетных и даже некоторых премиальных моделей. Ручной перезапуск по несколько раз в день — утомительно. Решение простое: автоматизировать перезагрузку через cron, если роутер позволяет управлять им по сети. Никаких дорогих замен, никаких «умных» хабов — только скрипт, который проверяет интернет и перезагружает роутер, когда нужно.

Почему это работает

Роутеры — это мини-компьютеры. Даже если вы не знаете, как с ними работать, они почти всегда имеют веб-интерфейс, а многие — и API. Большинство домашних роутеров (TP-Link, Asus, Xiaomi, Huawei, Zyxel и др.) позволяют перезагружаться через HTTP-запрос. Например, вы заходите в браузере на http://192.168.1.1, вводите логин-пароль, нажимаете «Перезагрузить» — и всё. А если вы знаете, какой именно HTTP-запрос отправляется при этом нажатии, вы можете отправить его автоматически.

Скрипт, запускаемый по расписанию через cron, делает три простых шага:

  1. Проверяет, есть ли интернет (например, пингует 8.8.8.8).
  2. Если интернета нет — ждёт 30 секунд и проверяет снова (чтобы исключить кратковременный сбой).
  3. Если снова нет — отправляет HTTP-запрос на перезагрузку роутера.

Это не «умный» алгоритм — но он работает. И работает надёжно. Я использую такой же скрипт у трёх клиентов — у одного он работает без сбоев уже 3 года.

Как найти URL перезагрузки вашего роутера

Тут всё зависит от модели. Нет единого шаблона. Но есть способ найти его за 5 минут.

  1. Войдите в веб-интерфейс роутера (обычно 192.168.1.1 или 192.168.0.1).
  2. Откройте инструменты разработчика в браузере (F12 → вкладка «Network»).
  3. Найдите кнопку «Перезагрузить» и нажмите её.
  4. В списке запросов найдите тот, который отправился после нажатия — обычно это POST-запрос к /apply.cgi, /reboot.htm или /api/v1/system/reboot.
  5. Кликните по нему → посмотрите «Request URL» и «Request Headers».
  6. Скопируйте URL и проверьте, какие заголовки нужны (особенно Cookie или Authorization).

Например, у TP-Link Archer C7:

  • URL: http://192.168.1.1/cgi-bin/luci/;stok=abc123def456/admin/system?form=reset
  • Метод: POST
  • Тело запроса: reset=1
  • Заголовки: Cookie: session_id=abc123

У Asus RT-AC68U:

  • URL: http://192.168.1.1/apply.cgi
  • Метод: POST
  • Тело: submit_button=Reboot&change_action=&submit_type=Reboot
  • Заголовки: Authorization: Basic dXNlcjpwYXNz (base64 от «user:pass»)

Если вы не нашли — попробуйте в Google запрос: «[ваша модель] reboot http request». Часто уже есть готовые решения от других пользователей.

Создаём скрипт для перезагрузки

Предположим, у вас есть Linux-машина (Raspberry Pi, сервер, даже старый ноутбук), которая всегда включена и подключена к той же сети, что и роутер. На ней мы и разместим скрипт.

Создаём файл:

nano /usr/local/bin/check-reboot-router.sh

Вставляем содержимое:

#!/bin/bash

# Настройки
ROUTER_IP="192.168.1.1"
ROUTER_URL="http://192.168.1.1/apply.cgi"
ROUTER_HEADERS="Authorization: Basic dXNlcjpwYXNz"
ROUTER_DATA="submit_button=Reboot&change_action=&submit_type=Reboot"
PING_TARGET="8.8.8.8"
RETRY_DELAY=30
MAX_RETRIES=2

# Проверяем интернет
ping -c 1 -W 3 $PING_TARGET > /dev/null
if [ $? -eq 0 ]; then
    echo "$(date): Интернет работает. Ничего не делаем."
    exit 0
fi

echo "(date): Интернет упал. Проверяем ещё раз черезRETRY_DELAY сек."

sleep $RETRY_DELAY

ping -c 1 -W 3 $PING_TARGET > /dev/null
if [ $? -eq 0 ]; then
    echo "$(date): Интернет восстановился. Перезагрузка не нужна."
    exit 0
fi

echo "$(date): Интернет не восстановился. Отправляем запрос на перезагрузку роутера."

# Отправляем запрос на перезагрузку
curl -s -X POST \
  -H "$ROUTER_HEADERS" \
  --data "$ROUTER_DATA" \
  "$ROUTER_URL" > /dev/null

if [ $? -eq 0 ]; then
    echo "$(date): Запрос на перезагрузку отправлен."
else
    echo "$(date): ОШИБКА: Не удалось отправить запрос на перезагрузку."
fi

Сохраняем и делаем исполняемым:

chmod +x /usr/local/bin/check-reboot-router.sh

Теперь проверьте, работает ли скрипт вручную:

/usr/local/bin/check-reboot-router.sh

Если всё ок — он напишет, что интернет упал и отправил запрос. Убедитесь, что роутер действительно перезагрузился (через веб-интерфейс или по времени, когда интернет снова появился).

Настройка cron для автоматического запуска

Теперь запускаем скрипт каждые 10 минут. Открываем crontab:

crontab -e

Добавляем строку:

*/10 * * * * /usr/local/bin/check-reboot-router.sh >> /var/log/router-reboot.log 2>&1

Это значит: «каждые 10 минут запускай скрипт и записывай лог в файл /var/log/router-reboot.log».

Проверьте, что лог пишется:

tail -f /var/log/router-reboot.log

Если вы видите записи вроде Интернет упал. Проверяем ещё раз через 30 сек. — всё работает.

Сравнение способов перезагрузки

Не все роутеры одинаково легко перезагружаются. Ниже — сравнение по надёжности, сложности и совместимости.

Способ Надёжность Сложность Подходит для Ограничения
HTTP-запрос (через curl) Высокая Средняя TP-Link, Asus, Xiaomi, Zyxel Требует точного URL и авторизации
SSH-команда (reboot) Очень высокая Низкая Asus Merlin, OpenWRT, DD-WRT Требует SSH-доступа, часто отключён по умолчанию
Реле/USB-выключатель Высокая Высокая Любой роутер Нужно покупать дополнительное устройство, не работает при отключении питания
Приложение на смартфоне Низкая Низкая Тестирование Не автономно, не работает, если телефон выключен

Если ваш роутер на OpenWRT или Asus Merlin — используйте SSH. Это надёжнее и чище. Если вы не знаете, что это — скорее всего, у вас обычный роутер с веб-интерфейсом. Тогда HTTP-запрос — ваш выбор.

Частые ошибки

  • Не проверяете авторизацию. Многие роутеры требуют cookie-сессии. Если вы просто копируете URL из браузера — он может не сработать, потому что сессия истекла. Всегда проверяйте, есть ли в запросе Cookie или Authorization.
  • Используете слишком короткие интервалы. Если скрипт запускается каждые 2 минуты — вы можете перезагружать роутер 5 раз подряд, если интернет «глючит» на 10 минут. Лучше 10–15 минут.
  • Не проверяете логи. Скрипт может не работать, потому что вы забыли установить curl или неверно указали URL. Лог — ваш лучший друг. Смотрите его хотя бы раз в неделю.
  • Используете ping без таймаута. Если вы пишете ping 8.8.8.8 без -W 3, скрипт может «зависнуть» на 30 секунд, если сеть частично отключена. Всегда указывайте таймаут.
  • Пытаетесь запускать скрипт с root-правами без необходимости. Если скрипт работает от пользователя pi или ubuntu — он и так может отправить HTTP-запрос. Не нужно давать ему root, если это не требуется.

Что выбрать в зависимости от ситуации

  • Ситуация: у вас старый роутер, без SSH, с веб-интерфейсом → используйте HTTP-запрос через curl. Это ваш единственный вариант.
  • Ситуация: у вас Asus с Merlin или роутер на OpenWRT → подключите SSH, используйте команду reboot. Это надёжнее и быстрее.
  • Ситуация: интернет пропадает из-за провайдера, а не роутера → скрипт не поможет. Он перезагрузит роутер, но если провайдер не отвечает — интернет не вернётся. Тут нужно либо менять провайдера, либо использовать резервный канал (например, мобильный интернет).
  • Ситуация: вы не хотите оставлять логи на сервере → добавьте в crontab > /dev/null 2>&1, но тогда вы потеряете возможность отслеживать ошибки. Не рекомендую.
  • Ситуация: роутер лежит в шкафу, и вы не можете его физически перезагружать → автоматизация — ваша единственная надежда. Делайте скрипт, как описано выше.

Как лучше сделать — практические рекомендации

  • Проверяйте скрипт вручную, прежде чем запускать его в cron. Протестируйте его, отключив интернет на компьютере, на котором он запущен.
  • Установите логирование — это спасёт вас, когда что-то пойдёт не так. Лог — это ваша история.
  • Не забывайте, что после перезагрузки роутеру нужно 30–90 секунд, чтобы восстановить соединение. Скрипт не должен запускаться чаще, чем раз в 10 минут — иначе вы будете перезагружать его в цикле.
  • Если вы используете Wi-Fi для подключения к роутеру — убедитесь, что ваш сервер/ПК подключён по кабелю. Иначе, если роутер упадёт, вы потеряете доступ и к скрипту.
  • Для роутеров с динамическим STOK-токеном (например, TP-Link) — используйте curl с --cookie-jar и --cookie, чтобы получать и использовать сессию. Это сложнее, но возможно. Я могу дать пример, если нужно.
  • Если роутер требует CAPTCHA или двухфакторную аутентификацию — автоматизация не сработает. Тогда только SSH или физический таймер.

Итог: что делать прямо сейчас

Вот ваш чек-лист:

  1. Определите модель роутера.
  2. Найдите URL перезагрузки через инструменты разработчика в браузере.
  3. Создайте скрипт, как в примере выше, подставив свой URL и заголовки.
  4. Проверьте его вручную — работает ли перезагрузка?
  5. Настройте cron на запуск каждые 10 минут.
  6. Следите за логами 2–3 дня.
  7. Если всё работает — забудьте про ручной перезапуск.

Это не «умный» дом. Это просто надёжный способ избавиться от раздражающей проблемы. Я видел, как люди тратят сотни долларов на «умные» роутеры, когда достаточно было 20 минут на скрипт. Не переплачивайте — сделайте так, как делают те, кто знает, как работает интернет на практике.

Информация в статье носит ознакомительный характер. Перезагрузка роутера может повлиять на работу подключённых устройств. Рекомендуется тестировать скрипт в безопасной среде и убедиться, что он не нарушает условия вашего интернет-провайдера.

Dfncfg.ru