Netwatch на MikroTik — мониторинг хостов
Netwatch на MikroTik — мониторинг хостов и автоматическая реакция
Netwatch — встроенный инструмент MikroTik RouterOS для мониторинга доступности хостов. Он периодически проверяет удалённый хост по ICMP (ping), TCP-connect или HTTP-GET и выполняет скрипт при изменении состояния: когда хост становится недоступным (down-script) или восстанавливается (up-script). Это мощный механизм автоматизации: переключение на резервного провайдера при падении основного, уведомления в Telegram о недоступности сервера, перезагрузка LTE-модема при потере связи, условное включение/отключение firewall-правил. В RouterOS 7 Netwatch значительно улучшен: добавлены проверки TCP и HTTP, расширены возможности скриптов.
Руководство актуально для RouterOS 7.20+.
Описание
Что такое Netwatch
Netwatch (/tool/netwatch) — это планировщик проверок доступности с привязкой скриптов к событиям. Для каждого хоста создаётся запись (entry) с параметрами:
- host — IP-адрес или DNS-имя для проверки
- type — тип проверки:
icmp(ping),tcp-connect,http-get,simple - interval — интервал между проверками
- timeout — время ожидания ответа
- up-script — скрипт, выполняемый при переходе хоста из DOWN в UP
- down-script — скрипт, выполняемый при переходе хоста из UP в DOWN
Типы проверок в RouterOS 7
| Тип | Описание | Когда использовать |
|---|---|---|
icmp | Ping (ICMP Echo Request/Reply) | Проверка базовой доступности хоста |
tcp-connect | Установка TCP-соединения на указанный порт | Проверка доступности сервиса (HTTP, SSH, DNS) |
http-get | HTTP GET-запрос с проверкой кода ответа | Проверка веб-приложения (код 200) |
simple | Простая проверка (icmp без дополнительных параметров) | Базовый ping |
ICMP (ping) — самый распространённый тип. Подходит для 90% задач. Но не гарантирует, что сервис работает (хост может отвечать на ping, а веб-сервер — лежать).
TCP-connect — проверяет, что TCP-порт открыт и принимает соединения. Подходит для проверки конкретных сервисов: порт 80/443 (веб), 22 (SSH), 53 (DNS).
HTTP-GET — полноценный HTTP-запрос с проверкой кода ответа. Самый надёжный способ проверки веб-приложения. Можно проверять, что сайт возвращает код 200 (а не 500 или redirect).
Netwatch vs Scripting + Ping
Можно достичь аналогичного результата через /system/scheduler + скрипт с /ping:
[admin@MikroTik] ># Альтернатива Netwatch через скрипт /system/scheduler add name=check-server interval=30s on-event={ :if ([/ping 8.8.8.8 count=3] = 0) do={ :log warning "Server 8.8.8.8 is DOWN" # down-action } else={ # up-action } }
Преимущества Netwatch:
- Встроенное отслеживание состояния (UP/DOWN), скрипт выполняется только при смене статуса
- Поддержка TCP и HTTP (не только ICMP)
- Меньше нагрузка на CPU (оптимизированный код)
- Статус виден в GUI/CLI (
/tool/netwatch/print) - Не нужно писать логику отслеживания состояния вручную
Преимущества скрипта:
- Более гибкая логика (несколько условий, циклы)
- Произвольные действия (не только up/down)
Настройка
Базовая настройка Netwatch
Простейший пример — мониторинг DNS Google:
[admin@MikroTik] >/tool/netwatch add host=8.8.8.8 type=icmp interval=30s timeout=3s \ up-script=":log info \"Google DNS is UP\"" \ down-script=":log warning \"Google DNS is DOWN\"" \ comment="Monitor Google DNS"
Проверка:
[admin@MikroTik] >/tool/netwatch/print # Columns: HOST, TYPE, INTERVAL, STATUS, SINCE # 8.8.8.8 icmp 30s up mar/28/2026 14:30:00
Пример 1: Failover — переключение на резервного провайдера
Самый популярный сценарий использования Netwatch. При падении основного ISP автоматически активируется маршрут через резервного.
Предварительная настройка маршрутов:
[admin@MikroTik] ># Основной провайдер — ether1, gateway 10.0.1.1 /ip/route add dst-address=0.0.0.0/0 gateway=10.0.1.1 distance=1 \ routing-table=main comment="ISP1-primary" # Резервный провайдер — ether2, gateway 10.0.2.1 /ip/route add dst-address=0.0.0.0/0 gateway=10.0.2.1 distance=2 \ routing-table=main comment="ISP2-backup" # Маршруты для проверки (check-gateway через Netwatch, а не built-in) # Статический маршрут к 8.8.8.8 через ISP1 (для проверки) /ip/route add dst-address=8.8.8.8/32 gateway=10.0.1.1 comment="Netwatch check via ISP1"
Netwatch для failover:
[admin@MikroTik] >/tool/netwatch add host=8.8.8.8 type=icmp interval=10s timeout=3s \ up-script={ :log info "ISP1 is UP - switching to primary" /ip/route/set [find comment="ISP1-primary"] disabled=no /ip/route/set [find comment="ISP2-backup"] distance=2 } \ down-script={ :log warning "ISP1 is DOWN - switching to backup" /ip/route/set [find comment="ISP1-primary"] disabled=yes /ip/route/set [find comment="ISP2-backup"] distance=1 } \ comment="ISP1 failover check"
Логика:
- Пока ISP1 работает — маршрут через него активен, backup distance=2 (не используется)
- Когда ISP1 падает — основной маршрут отключается, backup distance меняется на 1
- Когда ISP1 восстанавливается — возвращаемся на основной канал
Более надёжный failover с проверкой нескольких хостов:
[admin@MikroTik] ># Проверяем доступность 8.8.8.8 через ISP1 /tool/netwatch add host=8.8.8.8 type=icmp interval=10s timeout=3s \ down-script={ :global isp1check1 false :if ([:tobool $isp1check2] = false) do={ :log warning "Both checks failed - ISP1 is DOWN" /ip/route/set [find comment="ISP1-primary"] disabled=yes } } \ up-script={ :global isp1check1 true /ip/route/set [find comment="ISP1-primary"] disabled=no } \ comment="ISP1 check 1 (8.8.8.8)" # Проверяем доступность 1.1.1.1 через ISP1 /tool/netwatch add host=1.1.1.1 type=icmp interval=10s timeout=3s \ down-script={ :global isp1check2 false :if ([:tobool $isp1check1] = false) do={ :log warning "Both checks failed - ISP1 is DOWN" /ip/route/set [find comment="ISP1-primary"] disabled=yes } } \ up-script={ :global isp1check2 true /ip/route/set [find comment="ISP1-primary"] disabled=no } \ comment="ISP1 check 2 (1.1.1.1)"
Переключение произойдёт только если оба хоста недоступны — это предотвращает ложные срабатывания.
Пример 2: Telegram-уведомление при падении сервера
[admin@MikroTik] ># Скрипт отправки в Telegram /system/script add name=telegram-notify source={ :local botToken "1234567890:AAHxxxxxxxxxxxxxxxxxxxxxx" :local chatId "-1001234567890" :local identity [/system/identity/get name] :local msg ("<b>$identity</b>%0A" . $message) :do { /tool/fetch url=("https://api.telegram.org/bot" . $botToken . \ "/sendMessage\?chat_id=" . $chatId . "&text=" . $msg . \ "&parse_mode=HTML") mode=https keep-result=no } on-error={ :log error "Telegram send failed" } } # Netwatch с Telegram-уведомлением /tool/netwatch add host=192.168.88.100 type=icmp interval=30s timeout=5s \ down-script={ :local message "Server 192.168.88.100 is DOWN!" /system/script/run telegram-notify } \ up-script={ :local message "Server 192.168.88.100 is UP again" /system/script/run telegram-notify } \ comment="Monitor file server"
Мониторинг нескольких серверов:
[admin@MikroTik] ># Веб-сервер /tool/netwatch add host=192.168.88.101 type=tcp-connect port=443 interval=30s timeout=5s \ down-script={ :local message "Web server HTTPS (192.168.88.101:443) is DOWN!" /system/script/run telegram-notify } \ up-script={ :local message "Web server HTTPS (192.168.88.101:443) is UP" /system/script/run telegram-notify } \ comment="Monitor web server HTTPS" # DNS-сервер /tool/netwatch add host=192.168.88.53 type=tcp-connect port=53 interval=30s timeout=5s \ down-script={ :local message "DNS server (192.168.88.53) is DOWN!" /system/script/run telegram-notify } \ up-script={ :local message "DNS server (192.168.88.53) is UP" /system/script/run telegram-notify } \ comment="Monitor DNS server"
Пример 3: перезагрузка LTE-модема при потере связи
LTE-модемы иногда зависают и требуют перезагрузки. Netwatch может автоматизировать это.
[admin@MikroTik] ># Мониторим интернет через LTE /tool/netwatch add host=8.8.8.8 type=icmp interval=30s timeout=5s \ down-script={ :log warning "Internet via LTE is DOWN - rebooting modem" # Вариант 1: перезагрузка USB-модема через power reset /interface/lte/set lte1 disabled=yes :delay 10s /interface/lte/set lte1 disabled=no # Вариант 2: AT-команда на перезагрузку модема # /interface/lte/at-chat lte1 input="AT+CFUN=1,1" # Вариант 3: PoE reset (если модем питается от PoE) # /interface/ethernet/poe/set ether5 poe-out=off # :delay 10s # /interface/ethernet/poe/set ether5 poe-out=auto-on :delay 30s :log info "LTE modem reboot completed" } \ up-script={ :log info "Internet via LTE is UP" } \ comment="LTE modem watchdog"
Защита от циклической перезагрузки:
[admin@MikroTik] >/tool/netwatch add host=8.8.8.8 type=icmp interval=60s timeout=5s \ down-script={ :global lteRebootCount :if ([:typeof $lteRebootCount] = "nothing") do={ :global lteRebootCount 0 } :if ($lteRebootCount < 3) do={ :global lteRebootCount ($lteRebootCount + 1) :log warning ("LTE DOWN - reboot attempt " . $lteRebootCount . "/3") /interface/lte/set lte1 disabled=yes :delay 10s /interface/lte/set lte1 disabled=no } else={ :log error "LTE DOWN - max reboots reached, manual intervention needed" # Можно отправить Telegram-уведомление } } \ up-script={ :global lteRebootCount 0 :log info "LTE is UP - reboot counter reset" } \ comment="LTE modem watchdog with limit"
Пример 4: условное включение/отключение firewall-правил
Сценарий: когда VPN-сервер доступен — разрешаем трафик к нему, когда недоступен — блокируем и перенаправляем на заглушку.
[admin@MikroTik] ># Создаём firewall-правило (изначально отключено) /ip/firewall/nat add chain=dstnat action=dst-nat to-addresses=192.168.88.200 \ protocol=tcp dst-port=443 dst-address=10.10.10.1 \ comment="Redirect to fallback when VPN down" disabled=yes # Netwatch для условного управления /tool/netwatch add host=10.10.10.1 type=tcp-connect port=443 interval=15s timeout=5s \ down-script={ :log warning "VPN server DOWN - enabling redirect to fallback" /ip/firewall/nat/set [find comment="Redirect to fallback when VPN down"] disabled=no } \ up-script={ :log info "VPN server UP - disabling redirect" /ip/firewall/nat/set [find comment="Redirect to fallback when VPN down"] disabled=yes } \ comment="Monitor VPN server availability"
Другой сценарий — блокировка трафика для определённых хостов при недоступности фильтрующего сервера (прокси, DNS-фильтр):
[admin@MikroTik] ># Правило блокировки (изначально отключено) /ip/firewall/filter add chain=forward action=reject protocol=tcp dst-port=80,443 \ src-address=192.168.88.0/24 \ comment="Block internet when filter is down" disabled=yes # Netwatch /tool/netwatch add host=192.168.88.200 type=tcp-connect port=3128 interval=15s timeout=5s \ down-script={ :log warning "Content filter DOWN - blocking internet" /ip/firewall/filter/set [find comment="Block internet when filter is down"] disabled=no } \ up-script={ :log info "Content filter UP - allowing internet" /ip/firewall/filter/set [find comment="Block internet when filter is down"] disabled=yes } \ comment="Monitor content filter proxy"
Пример 5: HTTP-мониторинг веб-сайта
RouterOS 7 поддерживает проверку HTTP-ответа:
[admin@MikroTik] ># Проверяем, что сайт возвращает HTTP 200 /tool/netwatch add host=www.company.ru type=http-get http-code-min=200 http-code-max=299 \ interval=60s timeout=10s \ down-script={ :log error "Website www.company.ru is not responding with HTTP 200" :local message "Website www.company.ru is DOWN or returning error!" /system/script/run telegram-notify } \ up-script={ :log info "Website www.company.ru is responding normally" } \ comment="Monitor company website HTTP"
Параметры HTTP-проверки:
http-code-minиhttp-code-max— диапазон допустимых HTTP-кодов (200-299 = успех)- Если сайт возвращает 301 (redirect), 500 (server error) или не отвечает — статус DOWN
Пример 6: динамическое управление маршрутизацией
Использование Netwatch для policy-based routing:
[admin@MikroTik] ># Если внешний DNS-сервер доступен — используем его, иначе — локальный /tool/netwatch add host=8.8.8.8 type=tcp-connect port=53 interval=30s timeout=3s \ down-script={ :log warning "External DNS is DOWN - switching to local DNS" /ip/dns/set servers=192.168.88.53 } \ up-script={ :log info "External DNS is UP - switching back" /ip/dns/set servers=8.8.8.8,8.8.4.4 } \ comment="DNS failover"
Мониторинг нескольких хостов — обзорная конфигурация
Типичная конфигурация для офисной сети:
[admin@MikroTik] ># Основной шлюз ISP /tool/netwatch add host=10.0.1.1 type=icmp interval=10s timeout=3s \ down-script={:log error "ISP gateway DOWN"} \ up-script={:log info "ISP gateway UP"} \ comment="ISP Gateway" # Интернет (Google DNS) /tool/netwatch add host=8.8.8.8 type=icmp interval=30s timeout=5s \ down-script={:log error "Internet connectivity LOST"} \ up-script={:log info "Internet connectivity RESTORED"} \ comment="Internet check" # Файловый сервер /tool/netwatch add host=192.168.88.100 type=tcp-connect port=445 interval=30s timeout=5s \ down-script={:log error "File server SMB DOWN"} \ up-script={:log info "File server SMB UP"} \ comment="File Server (SMB)" # Почтовый сервер /tool/netwatch add host=192.168.88.101 type=tcp-connect port=25 interval=60s timeout=5s \ down-script={:log error "Mail server DOWN"} \ up-script={:log info "Mail server UP"} \ comment="Mail Server (SMTP)" # Веб-приложение /tool/netwatch add host=192.168.88.102 type=http-get http-code-min=200 http-code-max=299 \ interval=60s timeout=10s \ down-script={:log error "Web application DOWN"} \ up-script={:log info "Web application UP"} \ comment="Web Application" # IP-телефония /tool/netwatch add host=192.168.88.110 type=tcp-connect port=5060 interval=30s timeout=5s \ down-script={:log error "PBX SIP DOWN"} \ up-script={:log info "PBX SIP UP"} \ comment="PBX (SIP)" # Точка доступа Wi-Fi /tool/netwatch add host=192.168.88.201 type=icmp interval=60s timeout=5s \ down-script={:log warning "Wi-Fi AP is DOWN"} \ up-script={:log info "Wi-Fi AP is UP"} \ comment="Wi-Fi Access Point"
Проверка
Просмотр статуса Netwatch
[admin@MikroTik] ># Все записи Netwatch /tool/netwatch/print # Детальная информация /tool/netwatch/print detail # Только DOWN хосты /tool/netwatch/print where status=down # Статистика /tool/netwatch/print stats
Вывод print detail:
code0 host=8.8.8.8 type=icmp interval=30s timeout=5s up-script=:log info "Google DNS UP" down-script=:log warning "Google DNS DOWN" status=up since=mar/28/2026 14:30:00 comment=Monitor Google DNS
Ключевые поля:
status— текущий статус:up,down,unknown(ещё не проверялся)since— время последнего изменения статуса
Тестирование down-script
Для тестирования без реального сбоя — измените host на несуществующий IP:
[admin@MikroTik] ># Временно меняем host на несуществующий /tool/netwatch/set [find comment="Monitor file server"] host=192.168.88.254 # Через interval+timeout Netwatch покажет DOWN /tool/netwatch/print where comment="Monitor file server" # Проверяем логи /log/print where message~"DOWN" # Возвращаем правильный host /tool/netwatch/set [find comment="Monitor file server"] host=192.168.88.100
Проверка TCP-connect
[admin@MikroTik] ># Ручная проверка TCP-порта (аналог того, что делает Netwatch) /ip/firewall/connection/print where dst-address~"192.168.88.100" dst-port=445 # Или через fetch /tool/fetch url="http://192.168.88.102" mode=http keep-result=no
Проверка HTTP-get
[admin@MikroTik] ># Ручная HTTP-проверка /tool/fetch url="http://www.company.ru" mode=http keep-result=no # Если вернул status=200 — сайт работает
Мониторинг через логи
[admin@MikroTik] ># Все логи от Netwatch-скриптов /log/print where topics~"script" # Или по ключевым словам из скриптов /log/print where message~"DOWN" /log/print where message~"UP"
Типичные ошибки
1. Слишком маленький interval вызывает высокую нагрузку
Симптомы: CPU загрузка растёт, роутер тормозит.
Причина: Interval=1s при 20+ записях Netwatch — роутер выполняет десятки проверок каждую секунду.
Решение: Выбирайте interval в зависимости от критичности:
| Сценарий | Рекомендуемый interval |
|---|---|
| ISP failover | 10-15s |
| Мониторинг серверов | 30-60s |
| Мониторинг веб-сайтов | 60-120s |
| Некритичные устройства | 120-300s |
[admin@MikroTik] ># Проверяем текущие интервалы /tool/netwatch/print proplist=host,interval # Увеличиваем для некритичных /tool/netwatch/set [find comment~"Wi-Fi"] interval=2m
2. Ошибка в скрипте блокирует Netwatch
Симптомы: Скрипт содержит ошибку → Netwatch пишет ошибку в лог → статус хоста не меняется корректно.
Причины:
- Синтаксическая ошибка в скрипте
- Обращение к несуществующему объекту (
findвозвращает пустой результат) :delayслишком большой (блокирует выполнение)
Решение: Всегда оборачивайте критичные команды в :do { } on-error={}:
[admin@MikroTik] >/tool/netwatch add host=8.8.8.8 type=icmp interval=30s timeout=5s \ down-script={ :do { /ip/route/set [find comment="ISP1-primary"] disabled=yes } on-error={ :log error "Netwatch down-script error: route not found" } } \ up-script={ :do { /ip/route/set [find comment="ISP1-primary"] disabled=no } on-error={ :log error "Netwatch up-script error: route not found" } }
Проверьте скрипт отдельно перед добавлением в Netwatch:
[admin@MikroTik] ># Тестируем скрипт в терминале :do { /ip/route/set [find comment="ISP1-primary"] disabled=yes } on-error={ :put "Error!" }
3. Ложные срабатывания (flapping)
Симптомы: Хост постоянно переключается между UP и DOWN.
Причины:
- Нестабильный канал с потерями
- Таймаут слишком маленький
- Один пакет ping — недостаточно для надёжной проверки
Решение:
[admin@MikroTik] ># Увеличьте timeout /tool/netwatch/set [find host=8.8.8.8] timeout=10s # Увеличьте threshold (количество неудачных проверок перед DOWN) # В RouterOS 7.x используйте thr параметр /tool/netwatch/set [find host=8.8.8.8] thr=3 # Или добавьте :delay в down-script для подтверждения /tool/netwatch set [find host=8.8.8.8] down-script={ :delay 30s :if ([/ping 8.8.8.8 count=3] = 0) do={ :log warning "Confirmed: 8.8.8.8 is DOWN" # действие } }
4. Netwatch не работает с DNS-именами
Симптомы: Указали host=www.google.com, но Netwatch показывает unknown или down.
Причины:
- DNS не настроен на MikroTik
- DNS-сервер недоступен
Решение:
[admin@MikroTik] ># Проверяем DNS /ip/dns/print # Должны быть указаны серверы # Проверяем резолвинг :put [:resolve www.google.com] # Если DNS не работает — используйте IP-адрес /tool/netwatch/set [find host=www.google.com] host=142.250.74.36
Рекомендация: в Netwatch лучше использовать IP-адреса, а не DNS-имена. DNS-резолвинг добавляет задержку и зависимость от DNS-сервера.
5. Скрипт не выполняется повторно
Симптомы: Скрипт выполнился один раз при DOWN, но при следующем DOWN не выполняется.
Причина: Netwatch выполняет скрипт только при смене состояния (UP→DOWN или DOWN→UP). Если хост остаётся в DOWN — скрипт не вызывается повторно.
Решение: Если нужно периодическое действие при DOWN — используйте scheduler:
[admin@MikroTik] >/tool/netwatch add host=8.8.8.8 type=icmp interval=30s timeout=5s \ down-script={ :global isDown true :log warning "Host DOWN" } \ up-script={ :global isDown false :log info "Host UP" } # Scheduler для периодических действий при DOWN /system/scheduler add name=periodic-down-action interval=5m on-event={ :global isDown :if ([:tobool $isDown] = true) do={ :log warning "Host still DOWN - taking action" # повторяющееся действие } }
6. HTTP-get не работает с HTTPS
Симптомы: Netwatch с type=http-get на HTTPS-сайте показывает DOWN.
Причина: Для HTTPS нужен корректный SSL. Если сертификат не валидируется — проверка провалится.
Решение:
[admin@MikroTik] ># Импортируйте CA-сертификаты /tool/fetch url="https://curl.se/ca/cacert.pem" dst-path=cacert.pem /certificate/import file-name=cacert.pem passphrase="" # Или используйте tcp-connect на порт 443 (без проверки HTTP-ответа) /tool/netwatch add host=www.company.ru type=tcp-connect port=443 interval=60s timeout=5s \ comment="Check HTTPS port only"
7. Переменные не передаются между up-script и down-script
Причина: Каждый скрипт выполняется в своём контексте. Локальные переменные (:local) не видны между скриптами.
Решение: Используйте глобальные переменные (:global):
[admin@MikroTik] >/tool/netwatch add host=8.8.8.8 type=icmp interval=30s timeout=5s \ down-script={ :global failoverActive true :global failoverTime [/system/clock/get time] :log warning "Failover activated" } \ up-script={ :global failoverActive false :global failoverTime :log info ("Failover deactivated. Was active since: " . $failoverTime) }
8. Netwatch перестаёт работать после обновления RouterOS
Решение: После обновления RouterOS проверьте записи Netwatch:
[admin@MikroTik] ># Проверяем все записи /tool/netwatch/print detail # Если записи disabled — включите /tool/netwatch/set [find disabled=yes] disabled=no # Проверяем логи /log/print where message~"netwatch"
Netwatch — простой и надёжный инструмент для автоматизации реакции на сетевые события. Для базового failover достаточно одной записи с down/up скриптами. Для мониторинга инфраструктуры — создайте записи для каждого критичного хоста с Telegram-уведомлениями. RouterOS 7 добавил поддержку TCP и HTTP проверок, что позволяет мониторить не только доступность хоста, но и работоспособность конкретных сервисов. Главные правила: не используйте слишком маленький interval (10s для failover, 30-60s для мониторинга), оборачивайте скрипты в error handling и используйте глобальные переменные для обмена данными между скриптами.
# Альтернатива Netwatch через скрипт
/system/scheduler add name=check-server interval=30s on-event={
:if ([/ping 8.8.8.8 count=3] = 0) do={
:log warning "Server 8.8.8.8 is DOWN"
# down-action
} else={
# up-action
}
}
/tool/netwatch
add host=8.8.8.8 type=icmp interval=30s timeout=3s \
up-script=":log info \"Google DNS is UP\"" \
down-script=":log warning \"Google DNS is DOWN\"" \
comment="Monitor Google DNS"
/tool/netwatch/print
# Columns: HOST, TYPE, INTERVAL, STATUS, SINCE
# 8.8.8.8 icmp 30s up mar/28/2026 14:30:00
# Основной провайдер — ether1, gateway 10.0.1.1
/ip/route
add dst-address=0.0.0.0/0 gateway=10.0.1.1 distance=1 \
routing-table=main comment="ISP1-primary"
# Резервный провайдер — ether2, gateway 10.0.2.1
/ip/route
add dst-address=0.0.0.0/0 gateway=10.0.2.1 distance=2 \
routing-table=main comment="ISP2-backup"
# Маршруты для проверки (check-gateway через Netwatch, а не built-in)
# Статический маршрут к 8.8.8.8 через ISP1 (для проверки)
/ip/route
add dst-address=8.8.8.8/32 gateway=10.0.1.1 comment="Netwatch check via ISP1"
/tool/netwatch
add host=8.8.8.8 type=icmp interval=10s timeout=3s \
up-script={
:log info "ISP1 is UP - switching to primary"
/ip/route/set [find comment="ISP1-primary"] disabled=no
/ip/route/set [find comment="ISP2-backup"] distance=2
} \
down-script={
:log warning "ISP1 is DOWN - switching to backup"
/ip/route/set [find comment="ISP1-primary"] disabled=yes
/ip/route/set [find comment="ISP2-backup"] distance=1
} \
comment="ISP1 failover check"
# Проверяем доступность 8.8.8.8 через ISP1
/tool/netwatch
add host=8.8.8.8 type=icmp interval=10s timeout=3s \
down-script={
:global isp1check1 false
:if ([:tobool $isp1check2] = false) do={
:log warning "Both checks failed - ISP1 is DOWN"
/ip/route/set [find comment="ISP1-primary"] disabled=yes
}
} \
up-script={
:global isp1check1 true
/ip/route/set [find comment="ISP1-primary"] disabled=no
} \
comment="ISP1 check 1 (8.8.8.8)"
# Проверяем доступность 1.1.1.1 через ISP1
/tool/netwatch
add host=1.1.1.1 type=icmp interval=10s timeout=3s \
down-script={
:global isp1check2 false
:if ([:tobool $isp1check1] = false) do={
:log warning "Both checks failed - ISP1 is DOWN"
/ip/route/set [find comment="ISP1-primary"] disabled=yes
}
} \
up-script={
:global isp1check2 true
/ip/route/set [find comment="ISP1-primary"] disabled=no
} \
comment="ISP1 check 2 (1.1.1.1)"
# Скрипт отправки в Telegram
/system/script
add name=telegram-notify source={
:local botToken "1234567890:AAHxxxxxxxxxxxxxxxxxxxxxx"
:local chatId "-1001234567890"
:local identity [/system/identity/get name]
:local msg ("<b>$identity</b>%0A" . $message)
:do {
/tool/fetch url=("https://api.telegram.org/bot" . $botToken . \
"/sendMessage\?chat_id=" . $chatId . "&text=" . $msg . \
"&parse_mode=HTML") mode=https keep-result=no
} on-error={
:log error "Telegram send failed"
}
}
# Netwatch с Telegram-уведомлением
/tool/netwatch
add host=192.168.88.100 type=icmp interval=30s timeout=5s \
down-script={
:local message "Server 192.168.88.100 is DOWN!"
/system/script/run telegram-notify
} \
up-script={
:local message "Server 192.168.88.100 is UP again"
/system/script/run telegram-notify
} \
comment="Monitor file server"
# Веб-сервер
/tool/netwatch
add host=192.168.88.101 type=tcp-connect port=443 interval=30s timeout=5s \
down-script={
:local message "Web server HTTPS (192.168.88.101:443) is DOWN!"
/system/script/run telegram-notify
} \
up-script={
:local message "Web server HTTPS (192.168.88.101:443) is UP"
/system/script/run telegram-notify
} \
comment="Monitor web server HTTPS"
# DNS-сервер
/tool/netwatch
add host=192.168.88.53 type=tcp-connect port=53 interval=30s timeout=5s \
down-script={
:local message "DNS server (192.168.88.53) is DOWN!"
/system/script/run telegram-notify
} \
up-script={
:local message "DNS server (192.168.88.53) is UP"
/system/script/run telegram-notify
} \
comment="Monitor DNS server"
# Мониторим интернет через LTE
/tool/netwatch
add host=8.8.8.8 type=icmp interval=30s timeout=5s \
down-script={
:log warning "Internet via LTE is DOWN - rebooting modem"
# Вариант 1: перезагрузка USB-модема через power reset
/interface/lte/set lte1 disabled=yes
:delay 10s
/interface/lte/set lte1 disabled=no
# Вариант 2: AT-команда на перезагрузку модема
# /interface/lte/at-chat lte1 input="AT+CFUN=1,1"
# Вариант 3: PoE reset (если модем питается от PoE)
# /interface/ethernet/poe/set ether5 poe-out=off
# :delay 10s
# /interface/ethernet/poe/set ether5 poe-out=auto-on
:delay 30s
:log info "LTE modem reboot completed"
} \
up-script={
:log info "Internet via LTE is UP"
} \
comment="LTE modem watchdog"
/tool/netwatch
add host=8.8.8.8 type=icmp interval=60s timeout=5s \
down-script={
:global lteRebootCount
:if ([:typeof $lteRebootCount] = "nothing") do={ :global lteRebootCount 0 }
:if ($lteRebootCount < 3) do={
:global lteRebootCount ($lteRebootCount + 1)
:log warning ("LTE DOWN - reboot attempt " . $lteRebootCount . "/3")
/interface/lte/set lte1 disabled=yes
:delay 10s
/interface/lte/set lte1 disabled=no
} else={
:log error "LTE DOWN - max reboots reached, manual intervention needed"
# Можно отправить Telegram-уведомление
}
} \
up-script={
:global lteRebootCount 0
:log info "LTE is UP - reboot counter reset"
} \
comment="LTE modem watchdog with limit"
# Создаём firewall-правило (изначально отключено)
/ip/firewall/nat
add chain=dstnat action=dst-nat to-addresses=192.168.88.200 \
protocol=tcp dst-port=443 dst-address=10.10.10.1 \
comment="Redirect to fallback when VPN down" disabled=yes
# Netwatch для условного управления
/tool/netwatch
add host=10.10.10.1 type=tcp-connect port=443 interval=15s timeout=5s \
down-script={
:log warning "VPN server DOWN - enabling redirect to fallback"
/ip/firewall/nat/set [find comment="Redirect to fallback when VPN down"] disabled=no
} \
up-script={
:log info "VPN server UP - disabling redirect"
/ip/firewall/nat/set [find comment="Redirect to fallback when VPN down"] disabled=yes
} \
comment="Monitor VPN server availability"
# Правило блокировки (изначально отключено)
/ip/firewall/filter
add chain=forward action=reject protocol=tcp dst-port=80,443 \
src-address=192.168.88.0/24 \
comment="Block internet when filter is down" disabled=yes
# Netwatch
/tool/netwatch
add host=192.168.88.200 type=tcp-connect port=3128 interval=15s timeout=5s \
down-script={
:log warning "Content filter DOWN - blocking internet"
/ip/firewall/filter/set [find comment="Block internet when filter is down"] disabled=no
} \
up-script={
:log info "Content filter UP - allowing internet"
/ip/firewall/filter/set [find comment="Block internet when filter is down"] disabled=yes
} \
comment="Monitor content filter proxy"
# Проверяем, что сайт возвращает HTTP 200
/tool/netwatch
add host=www.company.ru type=http-get http-code-min=200 http-code-max=299 \
interval=60s timeout=10s \
down-script={
:log error "Website www.company.ru is not responding with HTTP 200"
:local message "Website www.company.ru is DOWN or returning error!"
/system/script/run telegram-notify
} \
up-script={
:log info "Website www.company.ru is responding normally"
} \
comment="Monitor company website HTTP"
# Если внешний DNS-сервер доступен — используем его, иначе — локальный
/tool/netwatch
add host=8.8.8.8 type=tcp-connect port=53 interval=30s timeout=3s \
down-script={
:log warning "External DNS is DOWN - switching to local DNS"
/ip/dns/set servers=192.168.88.53
} \
up-script={
:log info "External DNS is UP - switching back"
/ip/dns/set servers=8.8.8.8,8.8.4.4
} \
comment="DNS failover"
# Основной шлюз ISP
/tool/netwatch
add host=10.0.1.1 type=icmp interval=10s timeout=3s \
down-script={:log error "ISP gateway DOWN"} \
up-script={:log info "ISP gateway UP"} \
comment="ISP Gateway"
# Интернет (Google DNS)
/tool/netwatch
add host=8.8.8.8 type=icmp interval=30s timeout=5s \
down-script={:log error "Internet connectivity LOST"} \
up-script={:log info "Internet connectivity RESTORED"} \
comment="Internet check"
# Файловый сервер
/tool/netwatch
add host=192.168.88.100 type=tcp-connect port=445 interval=30s timeout=5s \
down-script={:log error "File server SMB DOWN"} \
up-script={:log info "File server SMB UP"} \
comment="File Server (SMB)"
# Почтовый сервер
/tool/netwatch
add host=192.168.88.101 type=tcp-connect port=25 interval=60s timeout=5s \
down-script={:log error "Mail server DOWN"} \
up-script={:log info "Mail server UP"} \
comment="Mail Server (SMTP)"
# Веб-приложение
/tool/netwatch
add host=192.168.88.102 type=http-get http-code-min=200 http-code-max=299 \
interval=60s timeout=10s \
down-script={:log error "Web application DOWN"} \
up-script={:log info "Web application UP"} \
comment="Web Application"
# IP-телефония
/tool/netwatch
add host=192.168.88.110 type=tcp-connect port=5060 interval=30s timeout=5s \
down-script={:log error "PBX SIP DOWN"} \
up-script={:log info "PBX SIP UP"} \
comment="PBX (SIP)"
# Точка доступа Wi-Fi
/tool/netwatch
add host=192.168.88.201 type=icmp interval=60s timeout=5s \
down-script={:log warning "Wi-Fi AP is DOWN"} \
up-script={:log info "Wi-Fi AP is UP"} \
comment="Wi-Fi Access Point"
# Все записи Netwatch
/tool/netwatch/print
# Детальная информация
/tool/netwatch/print detail
# Только DOWN хосты
/tool/netwatch/print where status=down
# Статистика
/tool/netwatch/print stats
0 host=8.8.8.8 type=icmp interval=30s timeout=5s
up-script=:log info "Google DNS UP"
down-script=:log warning "Google DNS DOWN"
status=up since=mar/28/2026 14:30:00
comment=Monitor Google DNS
# Временно меняем host на несуществующий
/tool/netwatch/set [find comment="Monitor file server"] host=192.168.88.254
# Через interval+timeout Netwatch покажет DOWN
/tool/netwatch/print where comment="Monitor file server"
# Проверяем логи
/log/print where message~"DOWN"
# Возвращаем правильный host
/tool/netwatch/set [find comment="Monitor file server"] host=192.168.88.100
# Ручная проверка TCP-порта (аналог того, что делает Netwatch)
/ip/firewall/connection/print where dst-address~"192.168.88.100" dst-port=445
# Или через fetch
/tool/fetch url="http://192.168.88.102" mode=http keep-result=no
# Ручная HTTP-проверка
/tool/fetch url="http://www.company.ru" mode=http keep-result=no
# Если вернул status=200 — сайт работает
# Все логи от Netwatch-скриптов
/log/print where topics~"script"
# Или по ключевым словам из скриптов
/log/print where message~"DOWN"
/log/print where message~"UP"
# Проверяем текущие интервалы
/tool/netwatch/print proplist=host,interval
# Увеличиваем для некритичных
/tool/netwatch/set [find comment~"Wi-Fi"] interval=2m
/tool/netwatch
add host=8.8.8.8 type=icmp interval=30s timeout=5s \
down-script={
:do {
/ip/route/set [find comment="ISP1-primary"] disabled=yes
} on-error={
:log error "Netwatch down-script error: route not found"
}
} \
up-script={
:do {
/ip/route/set [find comment="ISP1-primary"] disabled=no
} on-error={
:log error "Netwatch up-script error: route not found"
}
}
# Тестируем скрипт в терминале
:do { /ip/route/set [find comment="ISP1-primary"] disabled=yes } on-error={ :put "Error!" }
# Увеличьте timeout
/tool/netwatch/set [find host=8.8.8.8] timeout=10s
# Увеличьте threshold (количество неудачных проверок перед DOWN)
# В RouterOS 7.x используйте thr параметр
/tool/netwatch/set [find host=8.8.8.8] thr=3
# Или добавьте :delay в down-script для подтверждения
/tool/netwatch
set [find host=8.8.8.8] down-script={
:delay 30s
:if ([/ping 8.8.8.8 count=3] = 0) do={
:log warning "Confirmed: 8.8.8.8 is DOWN"
# действие
}
}
# Проверяем DNS
/ip/dns/print
# Должны быть указаны серверы
# Проверяем резолвинг
:put [:resolve www.google.com]
# Если DNS не работает — используйте IP-адрес
/tool/netwatch/set [find host=www.google.com] host=142.250.74.36
/tool/netwatch
add host=8.8.8.8 type=icmp interval=30s timeout=5s \
down-script={
:global isDown true
:log warning "Host DOWN"
} \
up-script={
:global isDown false
:log info "Host UP"
}
# Scheduler для периодических действий при DOWN
/system/scheduler
add name=periodic-down-action interval=5m on-event={
:global isDown
:if ([:tobool $isDown] = true) do={
:log warning "Host still DOWN - taking action"
# повторяющееся действие
}
}
# Импортируйте CA-сертификаты
/tool/fetch url="https://curl.se/ca/cacert.pem" dst-path=cacert.pem
/certificate/import file-name=cacert.pem passphrase=""
# Или используйте tcp-connect на порт 443 (без проверки HTTP-ответа)
/tool/netwatch
add host=www.company.ru type=tcp-connect port=443 interval=60s timeout=5s \
comment="Check HTTPS port only"
/tool/netwatch
add host=8.8.8.8 type=icmp interval=30s timeout=5s \
down-script={
:global failoverActive true
:global failoverTime [/system/clock/get time]
:log warning "Failover activated"
} \
up-script={
:global failoverActive false
:global failoverTime
:log info ("Failover deactivated. Was active since: " . $failoverTime)
}
# Проверяем все записи
/tool/netwatch/print detail
# Если записи disabled — включите
/tool/netwatch/set [find disabled=yes] disabled=no
# Проверяем логи
/log/print where message~"netwatch"