Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Определение интернет-соединения

    Определение интернет-соединения

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Определение интернет-соединения, RouterOS
     
    droux
    Guest
    #1
    0
    08.02.2022 10:31:00
    У меня RouterOS 7.1. Вопрос: как проверить активное интернет-соединение, если UDP использовать нельзя, а /ping не возвращает полезный код завершения? Это оказалось намного сложнее, чем я думал. Команда /ping не имеет кода выхода, который можно проверить (!).

    Сначала я пытался использовать https://help.mikrotik.com/docs/display/ROS/Detect+Internet — но это не работает. Мой провайдер блокирует UDP, так что переключение с wan на internet не происходит:

    [admin@MikroTik] /interface/detect-internet/state> print
    Columns: NAME, STATE, STATE-CHANGE-TIME  
    #  NAME              STATE    STATE-CHANGE-TIME  
    0  wlan1             no-link  feb/07/2022 13:23:20  
    1  lte1              wan      feb/07/2022 13:23:26  

    Потом я попробовал /ping. И /ping выдает результаты, которые отличаются от тех, что пишут на форумах. Может, это баг в версии 7+? Вот что я вижу:

    Для валидного IP:  
    [admin@MikroTik] > :set $pingResult [:ping count=1 1.1.1.1]
    Columns: SEQ, HOST, SIZE, TTL, TIME  
    SEQ  HOST     SIZE  TTL  TIME  
     0  1.1.1.1    56   51  118ms503us  

    [admin@MikroTik] > :put [:typeof $pingResult]
    nothing  

    Для невалидного IP:  
    [admin@MikroTik] > :set $pingResult [/ping count=1 172.1.1.1]
    Columns: SEQ, HOST, STATUS  
    SEQ  HOST       STATUS  
     0  172.1.1.1  timeout  

    [admin@MikroTik] > :put [:typeof $pingResult]
    nothing  

    То есть, получается, проверить код выхода команды /ping никак нельзя?

    Вот что меня почти поражает из-за этого:  
    [admin@MikroTik] > :if ([/ping 1.1.1.1 count=1] = 1) do={:put "Down"} else={:put "Up"}
    Columns: SEQ, HOST, SIZE, TTL, TIME  
    SEQ  HOST     SIZE  TTL  TIME  
     0  1.1.1.1    56   51  134ms149us  

    Up  

    [admin@MikroTik] > :if ([/ping 172.1.1.1 count=1] = 1) do={:put "Down"} else={:put "Up"}
    Columns: SEQ, HOST, STATUS  
    SEQ  HOST       STATUS  
     0  172.1.1.1  timeout  

    Up
     
     
     
    majestic
    Guest
    #2
    0
    27.10.2024 19:46:00
    Хочу поделиться своим опытом использования Netwatch на роутерах MikroTik для сценариев резервирования и предложить альтернативный подход, который мне показался более эффективным.

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

    Хотя эта тема уже обсуждалась раньше, я решил вернуться к ней, потому что столкнулся с ситуациями, когда Netwatch просто не справляется с чистым и эффективным управлением резервированием.

    Благодаря команде, упомянутой в одном из предыдущих постов, мне удалось написать простой скрипт, который использует /interface detect-internet state для мониторинга состояния интерфейсов и соответствующей реакции.

    Сценарий использования: в моей конфигурации я хочу, чтобы вторичный роутер включался только тогда, когда основной WAN/интернет-ссылка не работает. Как только основной канал восстанавливается, вторичный роутер должен отключаться. Такой подход помогает экономить трафик и электроэнергию, так как резервный роутер имеет ограниченные ресурсы. Это скорее актив-ожидание (active-cold/standby), что идеально подходит под мои задачи. Хотя на подключение вторичного канала уходит несколько минут, выигрыш в эффективности того стоит.

    Вот скрипт, который я использую:

    :local primaryState [/interface detect-internet state get [find name="pppoe0"] state]
    :local backupState [/interface detect-internet state get [find name="ether2"] state]
    :local powerState [/interface ethernet poe get ether2 poe-out]

    # Когда основной WAN недоступен  
    :if ($primaryState != "internet") do={  
       # Проверяем, что ether2 не включён по питанию  
       :if ($powerState != "auto-on") do={  
           /interface ethernet poe set ether2 poe-out=auto-on  
           /log info "IntelliFailover: PPPoE интерфейс (pppoe0) ОТКЛЮЧЁН"  
           /log info "IntelliFailover: Переключение на резервное соединение (ether2)"  
       }  
    } else={  
       # Когда основной WAN восстановлен, проверяем наличие интернета на обоих интерфейсах  
       :if ($primaryState = "internet" && $backupState = "internet") do={  
           # Проверяем, что ether2 включён  
           :if ($powerState != "off") do={  
               /interface ethernet poe set ether2 poe-out=off  
               /log info "IntelliFailover: PPPoE интерфейс (pppoe0) ВОССТАНОВЛЕН"  
               /log info "IntelliFailover: Восстановление основного соединения (pppoe0)"  
           }  
       }  
    }

    Надеюсь, этот скрипт и подход помогут тем, кто сталкивается с похожими задачами. Буду рад услышать ваши мысли и возможные улучшения!
     
     
     
    HoracioDos
    Guest
    #3
    0
    25.01.2025 14:09:00
    Привет! Это мой первый скрипт для определения интернет-соединения. Будьте добры, любые комментарии по его улучшению очень приветствуются. Сначала я настроил определение интернета так:

    /interface detect-internet set detect-interface-list=WAN internet-interface-list=WAN lan-interface-list=LAN wan-interface-list=WAN

    Потом он запускается каждые 3 минуты через планировщик.

    Скрипт check-internet:

    :global previousState;

    :global id [/interface/detect-internet/state find];
    :global ifaceName [/interface/detect-internet/state get $id value-name=name];
    :global ifaceState [/interface/detect-internet/state get $id value-name=state];
    :global ifaceTime [/interface/detect-internet/state get $id value-name=state-change-time];
    :global ifaceRTT [/interface/detect-internet/state get $id value-name=cloud-rtt];

    :if ($ifaceState != $previousState) do={:set previousState $ifaceState;

    :global ms [:pick $ifaceRTT 9 12];
    :set ifaceRTT ($ms . "ms");

    :global emailBody ("Интерфейс: $ifaceName\rСостояние: $ifaceState\rПоследнее изменение: $ifaceTime\rRTT: $ifaceRTT\rОпределение интернета использует cloud.mikrotik.com по протоколу UDP на порту 30000. Проверка соединения происходит каждую минуту, и если его нет в течение 3 минут, состояние меняется с internet на WAN");

    :if ($ifaceState = "internet") do={/tool e-mail send to="mail@gmail.com" subject=("Интернет доступен на " . $ifaceName) body=$emailBody;} else={/tool e-mail send to="mail@gmail.com" subject=("Нет соединения на " . $ifaceName) body=$emailBody;}}  

    Вот пример вывода:

    Нет интернет-соединения  
    Интерфейс: ether1-isp  
    Состояние: wan  
    Последнее изменение: 2025-01-23 07:12:12  
    RTT: ms  
    Определение интернета использует cloud.mikrotik.com по протоколу UDP на порту 30000. Проверка соединения происходит каждую минуту, и если его нет в течение 3 минут, состояние меняется с internet на WAN  

    Интернет восстановлен  
    Интерфейс: ether1-isp  
    Состояние: internet  
    Последнее изменение: 2025-01-23 07:14:09  
    RTT: 253ms  
    Определение интернета использует cloud.mikrotik.com по протоколу UDP на порту 30000. Проверка соединения происходит каждую минуту, и если его нет в течение 3 минут, состояние меняется с internet на WAN
     
     
     
    Amm0
    Guest
    #4
    0
    25.01.2025 16:34:00
    Я не уверен, что стоит автоматически добавлять интерфейс в список WAN или LAN. Чтобы использовать detect-internet, у вас уже должны быть определены интерфейсы как WAN. А поскольку detect-interface-list=WAN, он всё равно никогда не найдёт LAN. Добавление чего-то в стандартный список LAN или WAN может привести к разным побочным эффектам, которые нужно учитывать, так как firewall использует эти списки в качестве критериев. Поэтому, если вы не используете состояние detect-internet в правилах файрвола, вообще не нужно ничего задавать (оставьте пустым), кроме detect-interface-list=WAN для вашего скрипта.

    Если хотите использовать функцию «добавления интерфейса в список» для новых правил файрвола, лучше сделать это через отдельные списки, например internet-interface-list=DETECTED_WAN, lan-interface-list=DETECTED_LAN, wan-interface-list=DETECTED_WAN — а не через все переменные сразу. К тому же их лучше делать локальными (:local), а не глобальными (:global), если скрипт запускается из /system/scheduler и вы не используете переменные в других скриптах (там нужны бы были :global).

    На самом деле, не нужен даже «value name=» — просто используйте [/interface/detect-internet/state get $id name], это работает так же, но короче.

    :global> :local ms [:pick $ifaceRTT 9 12];
    :set ifaceRTT ($ms . “ms”);

    Наверно, это работает нормально. Но RTT может быть равен 0 или чему-то другому, так что использовать [:pick] без «защиты» не лучшая идея… Но для письма — если показывается только «ms», это уже сигнал о проблеме.

    Не уверен, что многие решались использовать, тем более писать скрипты с /interface/detect-internet. Но для уведомлений на почту — это простой и удобный способ проверить интернет.

    Отказ от ответственности: не рекомендую использовать /internet/detect-internet для принятия маршрутизационных решений или переключения на резервный канал — для этого есть более надёжные методы. И detect-internet может вызывать побочные эффекты — об этом и в документации MT предупреждают, хотя многие из них довольно тонкие и порой неожиданные.

    В общем, просто использовать «detect-interface-list=WAN» относительно безопасно, но если detect-interface МОЖЕТ МЕНЯТЬ ваши списки интерфейсов WAN или LAN (или добавлять DHCP клиентов), вот тут начинаются проблемы. Если интерфейс объявлен как WAN в /interface/list, он должен иметь IP-адрес или DHCP клиента, если вы явно назначаете интерфейс WAN, тогда «автоматический DHCP клиент» проблем не создаст.
     
     
     
    HoracioDos
    Guest
    #5
    0
    25.01.2025 21:24:00
    Спасибо, Amm0, за такой подробный ответ. Я начал использовать “detect internet” вместо Netwatch с пингом на Google или Cloudflare, потому что эта функция уже встроена, и я хотел воспользоваться этим. В инструкции читала, что “detect internet” может выполнять автоматические действия, которые могут изменить текущую конфигурацию. Эти возможные изменения никогда не были для меня до конца понятны, но я все равно рискнул.

    У меня есть правила для фаервола, основанные на Interface Lists, таких как LAN и WAN, поэтому я создал новый список с именем INTERNET и назначил на него порт ether1-ips. Потом я установил detect-interface-list=INTERNET и остальные параметры в NONE. Если я не ошибаюсь, я следовал твоему совету. Я изменил все переменные на локальные, кроме previousState, которая должна быть глобальной, чтобы не получать письма каждые 3 минуты с сообщением, что состояние в порядке. Я также немного изменил [:pick $ifaceRTT 9 12], потому что мне не нравились пробелы и “ms”, когда интернета нет. Других правил по настройке механизма резервирования у меня нет.

    Поскольку у меня только один провайдер, я последую твоему совету и не буду полагаться на эти решения в “detect internet”. У меня есть Raspberry Pi с Zabbix 7.0.X, где настроено много проверок и срабатывают алерты, но я хотел начать учиться скриптингу MikroTik на простом примере. Не могу поверить, сколько сетевых концепций для меня прояснилось, с тех пор как я начал настраивать устройства MikroTik. Так много функций и конфигурационных решений скрыто от обычных пользователей, когда покупаешь простую сетевую технику.

    Вот изменённая версия:

    :global previousState;

    :local id [/interface/detect-internet/state find];
    :local ifaceName [/interface/detect-internet/state get $id name];
    :local ifaceState [/interface/detect-internet/state get $id state];
    :local ifaceTime [/interface/detect-internet/state get $id state-change-time];
    :local ifaceRTT [/interface/detect-internet/state get $id cloud-rtt];

    :if ($ifaceState != $previousState) do={:set previousState $ifaceState;

    :local ms [:pick $ifaceRTT 9 12];
    :if ([:len $ms] = 0) do={
       :set ms "No RTT";
    }
    :set ifaceRTT ($ms . "ms");

    :local emailBody ("Interface: $ifaceName\rState: $ifaceState\rLast change: $ifaceTime\rRTT: $ifaceRTT\rWAN's internet connectivity via cloud.mikrotik.com (UDP:30000) проверяется каждую минуту. Если не доступен 3 минуты подряд, состояние меняется на WAN");

    :if ($ifaceState = "internet") do={/tool e-mail send to="mail@gmail.com" subject=("Интернет доступен на " . $ifaceName) body=$emailBody;} else={/tool e-mail send to="mail@gmail.com" subject=("Нет подключения к интернету на " . $ifaceName . " Семья начнёт жаловаться — беги!") body=$emailBody;}}

    Большое спасибо за твоё время и ответ. С уважением, H
     
     
     
    Amm0
    Guest
    #6
    0
    25.01.2025 22:50:00
    Нет, я думаю, это вполне разумный подход. Я использую /interface/detect-internet в стандартной конфигурации с detect-interface-list=WAN, так как мобильное приложение Mikrotik показывает статус интернета прямо на главном экране... И да, это «безопасно», если не устанавливать «три нижних атрибута» в detect-internet, потому что они записывают обнаруженный интерфейс в список адресов — насколько я понимаю, ты это уже исправил. detect-interface-list= просто ЧИТАЕТ список интерфейсов, один атрибут отвечает за то, что «проверяется на наличие интернета», но не меняет никакие списки интерфейсов. Поэтому типичная ошибка — когда кто-то ставит все четыре параметра, а на самом деле нужен только detect-interface-list=WAN (или твой собственный список интерфейсов для проверки). Вторая распространённая ошибка — включать в detect-interface-list известные LAN (или другие внутренние) сети, чего делать не стоит, и с этим у тебя всё в порядке.

    Что касается скрипта, если хочешь именно миллисекунды... RTT — это тип «время», так что можно конвертировать напрямую в наносекунды (а потом в миллисекунды), что, вероятно, точнее, чем разбирать строку (или, по крайней мере, устойчивее к будущим изменениям в выводе скриптов). Но я почти уверен, что твой существующий код работает нормально. Просто для информации:

    :local ms [:pick $ifaceRTT 9 12];
    :if ([:len $ms] = 0) do={ :set ms “No RTT”; }
    :set ifaceRTT ($ms . “ms”);

    можно заменить на

    :set ifaceRTT "$[([:tonsec $ifaceRTT]/(1000*1000))]ms"
     
     
     
    HoracioDos
    Guest
    #7
    0
    25.01.2025 23:00:00
    ГОТОВО!! Ещё раз спасибо за ваше время. С уважением, H
     
     
     
    Amm0
    Guest
    #8
    0
    25.01.2025 23:19:00
    Думаю, можно добавить ещё одно письмо, когда detect-internet переключается в состояние “WAN”. Это происходит, если пингуется DNS от Google 8.8.8.8, но недоступны серверы Mikrotik (через UDP). Приложение в таком случае показывает что-то вроде “Интернет (Ограничен)”, когда в состоянии WAN, а если “Internet state”, то просто “Интернет: Хорошо” (или что-то в этом духе). Так что можно обработать и состояние “WAN” (например, в тексте):

    :if ($ifaceState = “wan”) do={/tool e-mail send to=“mail@gmail.com” subject=("Ограниченный интернет на " . $ifaceName) body=$emailBody;} else={/tool e-mail send to=“mail@gmail.com” subject=("Ограниченное соединение на " . $ifaceName . " Семья начнёт жаловаться — беги прочь!") body=$emailBody;}}
     
     
     
    HoracioDos
    Guest
    #9
    0
    26.01.2025 11:28:00
    Привет, Amm0! Согласен, что недоступность cloud.mikrotik.com не обязательно означает проблему с полным доступом в интернет — сервис может быть просто ограничен или работать с перебоями. Согласно документации, сейчас существует всего два возможных состояния (internet и wan), но MikroTik может в любой момент изменить это поведение. Я изменю скрипт, чтобы убрать else и проверять состояние только на два варианта (Internet и wan), отправляя письма при состояниях Degraded/Limited internet service и Restored/Full Service, а потом забуду об этом. Это избыточный способ уведомления помимо тех, что уже есть. В случае настоящего сбоя интернета, письмо приходит, как только интернет снова работает, и по-другому никак не уведомиться через Wi-Fi, если мобильный телефон подключен к LAN. Я не пытался держать мобильное приложение MikroTik постоянно включенным и работающим в фоне, чтобы проверить, приходит ли уведомление на телефон при отключении интернета, и не хотел бы этим заниматься. Это та же проблема, что и у любых систем мониторинга: им нужен доступ в интернет, чтобы сообщить о сбое интернета (мой пёс раньше лучше бегал за своим хвостом, ха-ха!), если, конечно, у тебя нет резервного провайдера или LTE-сервиса. Всегда рад общаться с вами, господа. С уважением, H
     
     
     
    Amm0
    Guest
    #10
    0
    26.01.2025 14:08:00
    Да, это был мой единственный момент — обычно «wan» означает, что интернет есть. Например, раньше в /ip/cloud иногда случались кратковременные сбои, из-за чего что-то, что обычно в состоянии «internet», переходило в состояние «wan». Как уведомлять — это уже на ваше усмотрение, я просто хотел привести конкретный пример, подкорректируйте под свои нужды.

    Еще на что стоит обратить внимание: например, в состоянии «WAN» пинг до 8.8.8.8 работает, тогда как в состоянии «Internet» можно передавать данные через UDP на Mikrotik. В detect-internet не хватает функции определения типа NAT, а это полезно, чтобы понимать, CGNAT это или другая схема NAT, потому что состояние «WAN» может появляться при работающем интернете в зависимости от того, что делает провайдер.

    Игровые консоли часто показывают какой-то «тип NAT» — это было бы полезно в RouterOS, но пока нет. Всё правда.

    Еще есть узкополосный LTE, который поддерживает KNOT, и такие SIM-карты довольно дешевые в месяц, так как трафик ограничен.

    Также есть LoRaWAN для таких уведомлений, который поддерживают KNOT/LtAP и подобные. Конечно, нужно больше настроек, оборудования, конфигураций, скриптов… В общем, всегда можно найти решение, если что-то действительно важно.
     
     
     
    HoracioDos
    Guest
    #11
    0
    27.01.2025 13:48:00
    Всё верно. Теперь есть еще узкополосный LTE, который поддерживает KNOT, и такие SIM-карты довольно дешевы в месяц, поскольку данные ограничены. Также есть LoRaWAN для таких уведомлений, который поддерживают KNOT, LtAP и прочие. Конечно, там больше настроек, оборудования, конфигураций, скриптов... В любом случае, всегда найдется решение, если что-то действительно важно. Привет! Ты раззадорил моё любопытство! Спасибо!
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры