mikrotik-wiki.ru
Главная
Загрузка...

Netwatch на MikroTik — мониторинг хостов

RouterOS 7.xМониторинг13 мин130 мар. 2026 г.
TelegramVK

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

ТипОписаниеКогда использовать
icmpPing (ICMP Echo Request/Reply)Проверка базовой доступности хоста
tcp-connectУстановка TCP-соединения на указанный портПроверка доступности сервиса (HTTP, SSH, DNS)
http-getHTTP 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:

code
 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

Ключевые поля:

  • 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 failover10-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 и используйте глобальные переменные для обмена данными между скриптами.

[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
  }
}
/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"
Мониторинг / Netwatch на MikroTik — мониторинг хостов