Скрипт проверки интернета в MikroTik RouterOSv7
Несколько лет назад я опубликовал статью и предоставил в открытый доступ скрипт для проверки доступности интернета в MikroTik RouterOS. Однако, с течением времени обновляется и сам RouterOS, и обстоятельства требуют нового подхода.
Первое изменение, которое следует отметить, заключается в том, что в седьмой версии RouterOS отсутствует параметр routing-table в утилите ping. Хотя это не является серьезной проблемой, можно решить данную проблему с помощью правила mangle и установки адреса источника.
Второе изменение более важное и, возможно, именно это побудило меня написать данную статью. Одним пингом уже недостаточно. Например, провайдер MTS может блокировать интернет со стороны биллинговой системы в некоторых регионах, при этом разрешая прохождение трафика ICMP, что противоречит обычному скрипту проверки интернета.
Подготовка
Я предполагаю, что вы уже настроили несколько провайдеров в соответствии с моими предыдущими статьями:
- Небольшую часть для седьмой версии по этой статье.
- Основную часть для шестой версии и выше согласно этой статье.
Хотя важно не столько то, какие именно статьи вы использовали для настройки, сколько то, чтобы трафик всегда отправлялся с IP-адреса первого провайдера и через интерфейс этого провайдера, даже если провайдер недоступен. Для этого необходимо создать правило маршрутизации с действием lookp-only-in-table
.
Проверка
При выборе метода проверки доступности интернета необходимо учитывать несколько факторов. Важно отметить, что использование ICMP для этой цели может быть неэффективным, особенно на примере провайдера MTS, который сохраняет доступность хостов по протоколу ICMP даже при отключении интернета через биллинговую систему.
Кроме того, при проведении проверок следует исключить сайты и IP-адреса социально значимых отечественных ресурсов. По общепринятым стандартам, провайдеры обязаны предоставлять доступ к таким ресурсам даже в случае неоплаты услуг интернета. Однако, комментарии и дополнения по этому поводу приветствуются в разделе комментариев.
Также необходимо учитывать возможное перенаправление веб-трафика на заглушку при блокировке интернета из-за неуплаты. Иногда также может происходить подмена сертификатов для HTTPS-сайтов, что также необходимо учитывать при проверке доступности интернета.
Хотя в RouterOS есть встроенное средство detect-internet, которое можно было бы использовать для этих целей, многие предпочитают не полагаться на него из-за недавних проблем, включая длительное недоступность в облаке в 2020 году и некоторые национальные ограничения.
В конечном счете, стоит помнить, что с 100% уверенностью определить наличие интернета невозможно. Интернет представляет собой децентрализованную сеть, доступ к которой может быть затруднен по разным причинам, включая технические сбои, блокировки узлов и проблемы с маршрутизацией.
Netwatch
Мы будем использовать утилиту netwatch для определения доступности хостов. Важно отметить, что данная утилита не позволяет указывать доменные имена или пути при проверке HTTP/HTTPS, что уменьшает гибкость.
Мы будем проверять доступность NS-серверов крупных регистраторов и хостинг-провайдеров, так как они используют порт 53 для репликации зон через TCP.
/tool netwatch
add src-address=88.88.88.2 port=53 interval=1m type=tcp-conn thr-tcp-conn-time=1s disabled=no comment=ns1.reg.ru host=176.99.13.13
add src-address=88.88.88.2 port=53 interval=1m type=tcp-conn thr-tcp-conn-time=1s disabled=no comment=ns9.nic.ru host=31.177.85.186
add src-address=88.88.88.2 port=53 interval=1m type=tcp-conn thr-tcp-conn-time=1s disabled=no comment=ns3.hostland.ru host=81.95.18.26
add src-address=88.88.88.2 port=53 interval=1m type=tcp-conn thr-tcp-conn-time=1s disabled=no comment=ns2.yandex.ru host=93.158.134.1
88.88.88.2 - это адрес вашего провайдера, который необходимо указать. С помощью PBR вы должны направить трафик с этого IP-адреса через интерфейс первого провайдера. Каждый хост имеет комментарий, поясняющий его назначение. Обратите внимание, что нет скриптов, выполняющихся при изменении статуса.
add src-address=88.88.88.2 port=80 interval=1m type=http-get thr-http-time=1s disabled=no http-codes=503 comment=cbr.ru host=185.178.208.7
add src-address=88.88.88.2 port=80 interval=1m type=http-get thr-http-time=1s disabled=no http-codes=302 comment=moex.com disabled=no host=85.118.181.8
Также мы добавим пару проверок HTTP. Для этого я выбрал сайт Центрального банка России и Московской биржи. По умолчанию Центральный банк возвращает ошибку 503, если не указано доменное имя, а Московская биржа делает редирект на страницу HTTPS при коде ответа 302. Если провайдер сделает подмену на заглушку, ответ скорее всего будет 200.
Скрипт
Приведу сразу скрипт целиком, и в него помещу комментарии, добавите данный скрипт в cron.
# Настройки
:local myip "88.88.88.2";
:local RouteComment "checkinternet";
# Определяем общееколичество правил netwatch включенные и указанные адрес источника
:local NetWatchCountAll [/tool/netwatch/print count-only where src-address=$myip disabled=no];
# Определяем количество правил в статусе UP
:local NetWatchCountUp [/tool/netwatch/print count-only where src-address=$myip disabled=no status=up];
# Определяем количество правил в статусе Down
:local NetWatchCountDown [/tool/netwatch/print count-only where src-address=$myip disabled=no status=down];
# Опредяем количество маршрутов с коментарием $RouteComment
:local RouteCount [/ip/route/print count-only where comment=$RouteComment]
# Опредяем количество маршрутов с коментарием $RouteComment и дистанцией 254
:local RouteBadDistanceCount [/ip/route/print count-only where comment=$RouteComment distance=254]
#Проверка загрушка, на тот случай если все правила ктото выключит или удалит из netwatch
:if ($NetWatchCountAll = 0) do={
# Останавливаем выполнения скрипта
:error "Netwatch Count Null"
}
# Если количество правил netwatch ровно количеству правил в статусе down (т.е. все) и маршруты с коментарием $RouteComment и дистанцией меньше чем 254 меньше чем кол-во маршрутов с коментарием (т.е не все) то:
:if ($NetWatchCountAll = $NetWatchCountDown and $RouteBadDistanceCount < $RouteCount) do={
# для маршрутов с коментарием $RouteComment и дистанцией меньше чем 254 установить значение дистанции 254
/ip/route/set distance=254 [find comment=$RouteComment distance<254];
# Удаляем соединения из connection-tracker которые попали под snat и не имеют марки соединения.
/ip/firewall/connection/remove [find connection-mark="" srcnat ];
# Останавливаем выполнения скрипта
:error "ISP down"
}
# Если количество правил netwatch со статусом up больше нуля
:if ($NetWatchCountUp > 0) do={
# для маршрутов с коментарием $RouteComment и дистанцией больеш чем 10 установить значение дистанции 10
/ip/route/set distance=10 [find comment=$RouteComment distance>10]
# Удаляем соединения из connection-tracker которые попали под snat и не имеют марки соединения.
/ip/firewall/connection/remove [find connection-mark="" srcnat ]
# Останавливаем выполнения скрипта
:error "ISP up"
}
Если все проверки находятся в состоянии “down”, мы устанавливаем значение дистанции маршрута с комментарием “checkinternet” на 254, и наоборот - если хотя бы одна проверка находится в состоянии “up”, для всех таких маршрутов устанавливаем значение дистанции на 10.
Итог
Netwatch – мощный инструмент в операционной системе RouterOS от MikroTik, который предназначен для мониторинга состояния сетевых соединений. С помощью Netwatch администраторы сети могут автоматизировать процессы мониторинга и реакции на изменения в состоянии доступности устройств или сервисов.
При конфигурации Netwatch крайне важным является корректное указание адреса источника (src-address), с которого будет инициирована проверка доступности. Это должен быть локальный IP-адрес, на который настроен интерфейс вашего MikroTik устройства. Правильное определение источника позволит точно контролировать работоспособность и доступность сетевых ресурсов.
Система принятия решений о доступности интернета работает на основании агрегации состояний всех активных правил Netwatch. Если все проверки показывают статус “down”, система определяет, что интернет отсутствует. Однако, если хотя бы одна проверка имеет статус “up”, это указывает на наличие активного интернет-соединения, и скрипт считает, что доступ к интернету есть.
Для повышения надёжности мониторинга рекомендуется создавать несколько правил Netwatch, направленных на различные целевые адреса в Интернете. Это могут быть серверы DNS, популярные веб-сайты или другие внешние ресурсы, стабильное соединение с которыми свидетельствует о работоспособности интернет-канала.
Используя возможности Netwatch в RouterOS MikroTik, можно значительно упростить процесс управления сетью, повысить её надёжность и сократить время реакции на возникающие проблемы с доступностью интернета.
Поделиться
Обсуждение
Лицензия
Текст данной статьи распространяется под общедоступной лицензией CC BY-NC-ND 4.0, ознакомиться с тектом лицензии вы можете на данной странице.