Скрипт контроля работы мобильного Интернет’а (3G/4G) на MikroTik (обновлённая версия моего старого скрипта). Если Интернет недоступен то перезагружается модем и отправляется отчёт на email.
Обновление от 24/09/2018, Версия 1.1.1:
- Увеличен таймер ожидания загрузки модема после процедуры USB Power Reset (с 30 сек до 50) для последующего тестирования доступности Интернет’а. Некоторые модемы с прошивкой HiLink загружаются дольше чем 30 сек (Обсуждение этой проблемы: https://2keep.net/mikrotik-mobile-internet-check/#comment-466).
Обновление от 17/02/2018, Версия 1.1.0:
- Добавлена поддержка модемов с HiLink прошивкой (подробнее читайте в комментариях в скрипте).
- Добавлена проверка правильности указания интерфейса ‘ifName’ и типа модема ‘modemType’.
Функции скрипта
- Проверяет загрузку процессора в течении указанного времени. Если загрузка 100% — отправляется отчёт на email и перезагружается Mikrotik.
- Проверка наличия WLAN интерфейса. Если интерфейса нет — отправляется отчёт на email и перезагружается Mikrotik (Как-то давно, были у меня проблемы на старом Mikrotik — исчезали Wi-Fi интерфейсы. Помогала только перезагрузка. Проблемы такой давно нет, но данную функцию оставил).
- Проверка наличия маршрута по умолчанию. Если его нет, то перезагружается по питанию USB модем (если функция поддерживается), перезапускается PPP соединение (Stick модем) и отправляется отчёт на email. Бывало у меня, что PPP соединение поднято, но маршрут по умолчанию исчезает. Не знаю, кто был виноват, модем или Mikrotik.
- Проверка наличия трафика на интерфейсе USB модема. Если трафик есть, то дальнейшие проверки PINGами доступности Интернета не проводятся. Это сделано для того, что бы когда канал забивался на 100% (например из-за Torrent) и ICMP пакеты терялись, скрипт не считал, что интернет недоступен и не перезапускал соединение. Иначе он будет перезапускать соединение по кругу, пока на 100% занят канал в Интернет.
- Если трафика на интерфейсе модема нет, то производится тестирование соединения используя ICMP протокол (ping). Если недоступны сразу ДВА хоста, то перезагружается по питанию USB модем (если функция поддерживается), перезапускается PPP соединение (Stick модем) и отправляется отчёт на email. Реализована проверка на ошибки написания адреса хоста или ошибки резлова IP по доменному имени. В моём старом скрипте, такой проверки не было и могла произойти ошибка резолва IP по домену когда недоступен DNS сервер и скрипт останавливал свою работу.
- Отправка отчета на email о состоянии USB модема и сети сотового оператора (для Stick модема). В отчёт входит: средний уровень сигнала мобильной сети (RSSI измеряется в течении 10 секунд и вычисляется среднее значение), название оператора, технология подключения к сети, модель модема, LAC, CID и др. Также на email отправляется прикрепленный файл с лог файлом Mikrotik.
Данный скрипт, это обновлённая версия моего скрипта для проверки работы мобильного Интернета, написанного в 2014 году. В данной статье я не буду подробно рассказывать как установить скрипт, настроить отправку почты, создать правило в планировщике. Если у вас возникают с этим проблемы, почитайте мою предыдущую статью на эту тему, там всё разжёвано: Скрипт контроля качества 3G Интернет’а на MikroTik
В сущности, это не один, а два скрипта:
- healthCheck — скрипт проверки работы мобильного Интернета. Данный скрипт, с помощью планировщика запускается каждые 5 минут и выполняет тестирование мобильного Интернета.
- modemStatus — скрипт вызывается из скрипта «healthCheck» и выполняет опрос модема со Stick прошивкой, получая с него следующие данные: состояние модем, технология подключения к сети (3G, 4G), оператор, средний уровень сигнала RSSI и др. Для модема типа HiLink данный скрипт не нужен, т.к. с HiLink модема невозможно получить информацию.
Если используется модем со Stick прошивкой, то в MikroTik необходимо установить два скрипта.
В комментариях в скриптах, я постарался по максимуму описать алгоритм их работы. В случае необходимости, это вам поможет подправить скрипты под свои задачи.
Скрипт healthCheck
С помощью планировщика скрипт «healthCheck» запускается каждые 5 минут и выполняет тестирование Интернета.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 |
# Version 1.1.1 (24/09/2018) # Увеличен таймер ожидания загрузки модема после процедуры USB Power Reset (с 30 сек до 50) # для последующего тестирования доступности Интернет'а. # Некоторые модемы с прошивкой HiLink загружаются дольше чем 30 сек. # Обсуждение этой проблемы: https://2keep.net/mikrotik-mobile-internet-check/#comment-466). # Version 1.1.0 (17/02/2018) # + Добавлена поддержка модемов с HiLink прошивкой (ограниченная функциональность скрипта). # В случае если не работает Интернет, то скрипт перезагружает по питанию модем. # MikoTik должен поддерживать функцию "USB Power Reset" (https://wiki.mikrotik.com/wiki/Manual:USB_Features). # Значение параметра 'usbReset' игнорируется, если тип модем 'hilink', подразумевается что 'usbReset' всегда 'Yes'. # С HiLink модема невозможно получить информацию о работе модема и мобильной сети, # поэтому скрипт "modemStatus" не нужен. # + Добавлена проверка правильности указания интерфейса 'ifName' и типа модема 'modemType'. ########################## ### НАЧАЛО - Настройки ### # Тип прошивки модема. Возможные варианты: stick, hilink :local modemType "stick"; # Имя интерфейса модема :global ifName "ppp-out1"; # email на которые отправлять отчёты :local mailAddrTo "user@domain.ru"; # В течении какого времени (сек) анализируем загрузку CPU :local cpuLoadSec 5; # Количество посылаемый icmp пакетов :local cntPing 10; # Ожидаемое количество вернувшихся пакетов # В вашем случае, ожидается, что 10 пакетов отправлено и хотя бы 1 должен вернуться :local cntPingOk 1; # Первый тестируемый адрес в Интернете :local hostPing1 "ya.ru"; # Второй тестируемый адрес в Интернете :local hostPing2 "8.8.8.8"; # Отключать питание на USB для перезагрузки модема? (yes/no) # Параметра 'usbReset' игнорируется, если тип модем 'hilink', подразумевается что 'usbReset' всегда 'Yes'. # Внимание! Если включить данную опцию, но ваш Mikrotik не поддерживает её, # то выполнение скрипта прервётся и работать скрипт не будет! # Список MikroTik поддерживающих USB Power Reset: https://wiki.mikrotik.com/wiki/Manual:USB_Features # Если вы не найдете свой MikroTik в списке, то вы можете выполнить в консоли команду: /system routerboard usb power-reset # если появится ошибка - "ERROR: USB power reset not implemented on this hardware", значит поддержки нет. :local usbReset "no"; ### КОНЕЦ - Настройки ### ######################### :local inetStatus; :local inetFailedReason; :local modemTypeFound "0"; # Проверяем наличие интерфейса 'ifName' и правильности указания типа прошивки модема 'modemType' :if ($modemType = "hilink") do={ :set modemTypeFound "1"; :if ([/interface lte find name=$ifName] = "") do={ :log warning "Interface '$ifName' for '$modemType' modem not found!"; :log warning "Check parameter - ifName"; :log warning "Script is stopped!"; :error "Script is stopped! For more information, see log..."; } } else={ if ($modemTypeFound != "1") do={ :set modemTypeFound "0"; } } :if ($modemType = "stick") do={ :set modemTypeFound "1"; :if ([/interface ppp-client find name=$ifName] = "") do={ :log warning "Interface '$ifName' for '$modemType' modem not found!"; :log warning "Check parameter - ifName"; :log warning "Script is stopped!"; :error "Script is stopped! For more information, see log..."; } } else={ if ($modemTypeFound != "1") do={ :set modemTypeFound "0"; } } :if ($modemTypeFound = "0") do={ :log warning "$modemType - incorrect type of modem!"; :log warning "Check parameter - modemType"; :log warning "Script is stopped!"; :error "Script is stopped! For more information, see log..."; } # проверяем наличие интерфейсов с именем начинающимся на wlan :if ([/interface find name~"wlan"] = "") do={ /tool e-mail send to=$mailAddrTo body="Wi-Fi interface not found. Mikrotik rebooted!" subject="$[/system identity get name]. Wi-Fi interface not found. $[/system clock get time] $[/system clock get date]" :delay 20; /system reboot; } :delay 1; # Проверяем загрузку CPU :local cpu100 0; for x1 from=1 to=$cpuLoadSec do={ :if ([/system resource get cpu-load] = "100") do={ :set cpu100 ($cpu100+1); } :delay 1; } :if ($cpu100 = $cpuLoadSec) do={ /tool e-mail send to=$mailAddrTo body="Within $cpuLoadSec seconds, CPU load on Mikrotik: 100%. Mikrotik rebooted!" subject="$[/system identity get name]. CPU load on Mikrotik: 100%. $[/system clock get time] $[/system clock get date]" :delay 20; /system reboot; } # Проверка наличие Интернета # Проверяем, есть ли маршрут по умолчанию if ([/ip route find where dst-address=0.0.0.0/0] != "") do={ # Если маршрут есть, то в течении 5 секунд следим за ИСХОДЯЩИМ и ВХОДЯЩИМ трафиком на сетевом интерфейсе :local wanTrafTx 0; :local wanTrafTxRes 0; :local wanTrafRx 0; :local wanTrafRxRes 0; for x from=1 to=5 do={ /interface monitor-traffic [/interface find name=$ifName] once do={ :set wanTrafTx (tx-bits-per-second / 1024); } /interface monitor-traffic [/interface find name=$ifName] once do={ :set wanTrafRx (rx-bits-per-second / 1024); } if ($wanTrafTx > $wanTrafTxRes) do={ :set wanTrafTxRes $wanTrafTx; } if ($wanTrafRx > $wanTrafRxRes) do={ :set wanTrafRxRes $wanTrafRx; } :delay 1; } # Если трафик на интерфейсе меньше 100 кбит/с запускаем проверку PINGами if ($wanTrafTxRes < 100 and $wanTrafRxRes < 30) do={ # Производим тестирование доступности хостов (с проверкой на ошибки) и результаты помещаем в переменные :local cntRes1; :local errorMsgHost1; :do { :set cntRes1 [/ping count=$cntPing $hostPing1]; } on-error={ :set cntRes1 0; :set errorMsgHost1 "Error ping host1: $hostPing1, maybe DNS resolve error!"; :log warning $errorMsgHost1; } :local cntRes2; :local errorMsgHost2; :do { :set cntRes2 [/ping count=$cntPing $hostPing2]; } on-error={ :set cntRes2 0; :set errorMsgHost2 "Error ping host2: $hostPing2, maybe DNS resolve error!"; :log warning $errorMsgHost2; } # Если из 10ти посланных пакетов вернулось меньше указанного в переменной $cntPingOk, то делаем запись в лог файл, # присваиваем переменной inetStatus признак наличия проблем с Интернетом (failed) и далее перезапускам соединение if ($cntRes1 < $cntPingOk and $cntRes2 < $cntPingOk) do={ :set inetStatus "failed"; :set inetFailedReason ("\ Internet connection failure!\n\ \n\ Host1 - $hostPing1 lost ".[:tonum $cntPing] - [:tonum $cntRes1]." packets of $cntPing ($errorMsgHost1)\n\ Host2 - $hostPing2 lost ".[:tonum $cntPing] - [:tonum $cntRes2]." packets of $cntPing ($errorMsgHost2)\n\ \n\ WAN speed RX: $wanTrafRxRes kbit/s \n\ WAN speed TX: $wanTrafTxRes kbit/s \n\ "); :log warning $inetFailedReason; } } } else={ # Если маршрута по умолчанию нет, то делаем запись в лог файл, # присваиваем переменной inetStatus признак наличия проблем с Интернетом (failed) и далее перезапускам соединение :set inetStatus "failed"; :set inetFailedReason "Internet connection failure!\nNo default gateway!\n" :log warning $inetFailedReason; } # Если после проверки доступности Интернета есть проблемы, то... if ($inetStatus = "failed") do={ :global modemStatus; # Если модем со Stick прошивкой, то перезагружаем PPP интерфейс, # питание на USB (если включено) и получаем данные с модема и мобильной сети. if ($modemType = "stick") do={ /interface ppp-client disable $ifName; :delay 1; # Отключаем на 5 секунд питание на USB для перезагрузки модема if ($usbReset = "yes") do={ :log warning "USB Modem power reset!"; /system routerboard usb power-reset duration=5; # Ждём 50 сек пока загрузится модем :log warning "Wait 50 sec to modem boot"; :delay 50; } # Запускаем скрипт "modemStatus" и получаем состояние модема и уровня сигнала сети execute "/system script run modemStatus"; :delay 15; /interface ppp-client enable $ifName; } # Если модем с HiLink прошивкой, то только перезагружаем питание на USB if ($modemType = "hilink") do={ :set modemStatus "Modem status: HiLink modem. No additional info!"; :log warning "USB Modem power reset!"; /system routerboard usb power-reset duration=5; :log warning "Wait 30 sec to modem boot"; :delay 30; } :delay 20; # Сохраняем лог в файл /log print file=log.txt # Отправляем email с отчётом и логом /tool e-mail send to=$mailAddrTo file=log.txt body="$inetFailedReason\n$modemStatus" subject="$[/system identity get name]. Internet connection failure! $[/system clock get time] $[/system clock get date]" } |
Скрипт modemStatus
Скрипт «modemStatus» вызывается из скрипта «healthCheck» и выполняет опрос модема для получение информации о его состоянии и параметрах сети сотового оператора.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# Version 1.0.1 (29/08/2018) :global modemStatus; :global ifName; :local i 0; :local avgRSSI 0; :local i1 0; /interface ppp-client info $ifName do={ :set i ($i + 1); # START - Расчитываем среднее значения RSSI (dBm) # При опросе модема, он не сразу выдаёт необходимые данные, а с задержкой, по этому, # ждём когда появится значение signal-strengh и начинаем расчёт среднего значения RSSI :if ($"signal-strengh" != "") do={ :log info "Current RSSI: $"signal-strengh""; :set i1 ($i1 + 1); # signal-strengh выдаётся в виде: "-101 dBm", для расчёта необходимо получить только число! # Для этого удаляем знак "-" и " dBm", что бы получить только число "101". # Записываем полученное число в переменную avgRSSI :set avgRSSI ($avgRSSI + [:tonum [:pick $"signal-strengh" 1 [:find $"signal-strengh" " dBm"]]]); } :if ($i = 10) do={ # Финальная операция по расчёту среднего значения RSSI :set avgRSSI "-$[($avgRSSI / i1)] dBm"; # END - Расчитываем среднее значения RSSI (dBm) # Формируем значение переменной modemStatus, значение которой отправится на почту как часть отчета :set modemStatus "\ Modem Status: $"modem-status"\n\ Pin-status: $"pin-status"\n\ Functionality: $"functionality"\n\ Manufacturer: $"manufacturer"\n\ Model: $"model"\n\ Revision: $"revision"\n\ Serial Number: $"serial-number"\n\ Current Operator: $"current-operator"\n\ IMSI: $"imsi"\n\ Access Technology: $"access-technology"\n\ Average Signal Strength: $avgRSSI\ "; :log warning "Start report USB Modem:"; :log warning $modemStatus; :log warning "End report USB Modem"; :log warning "Remove modemStatus script job"; /system script job remove [find script=modemStatus ]; } } |
Вкратце по другим настройкам
Настройка email
1 2 3 4 |
/tool e-mail set address=smtp.ya.ru from=yourLogin@ya.ru password=yourPass port=465 start-tls=tls-only user=yourLogin@ya.ru |
Добавление в планировщик запуск скрипта
1 2 3 4 |
/system scheduler add interval=5m name=healthCheck on-event="/system script run healthCheck" |
Скрипты «healthCheck» и «modemStatus» добавляйте в MikroTik через WinBox, там проще.
Если возникнут вопросы по данным процедурам, почитайте мою предыдущую статью на эту тему, там всё разжёвано: Скрипт контроля качества 3G Интернет’а на MikroTik
Примеры отчётов приходящих на email
Нет маршрута по умолчанию
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Internet connection failure! No default gateway! Modem Status: ready Pin-status: no password required Functionality: full Manufacturer: huawei Model: E3372 Revision: 21.180.01.00.00 Serial Number: 869907027329719 Current Operator: MTS RUS (cellid: 2b3a6, lac: 12a6 ) IMSI: 250116378414154 Access Technology: 3G Average Signal Strength: -99 dBm |
Недоступны хосты
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Internet connection failure! Host1 - ya.rud lost 10 packets of 10 (Error ping host1: ya.rud, maybe DNS resolve error!) Host2 - 8.8.8.7 lost 10 packets of 10 () WAN speed RX: 0 kbit/s WAN speed TX: 0 kbit/s Modem Status: ready Pin-status: no password required Functionality: full Manufacturer: huawei Model: E3372 Revision: 21.180.01.00.00 Serial Number: 869907027329719 Current Operator: MTS RUS (cellid: 2b3a6, lac: 12a6 ) IMSI: 250116378414154 Access Technology: 3G Average Signal Strength: -100 dBm |
P.S.
Скрипт опубликованный в данной статье, это упрощённая версия скрипта, используемого мной для своих задач. В скрипте, что использую я, более сложная логика реакции на возникающие проблемы с Интернет’ом, но в связи с этим, он сложнее и больше.
Т.к. я не использую данный скрипт в своей работе, в нём могут всплывать ошибки, которые я не отловил в процесс отладки. Пишите о них в комментарии, я исправлю.
Похожие записи...
Latest posts by Андрей Торженов (see all)
- MikroTik. Wi-Fi. Описание Tx Rate Set - 11/11/2018
- Zabbix. Удалённое выполнение команды (SSH) - 07/11/2018
- Установка и обновление ESXi Embedded Host Client (WEB клиент для ESXi) - 13/08/2018
- SNMP TRAP отправка на E-mail и интеграция с Zabbix - 28/07/2018
- MikroTik. Скрипт контроля мобильного Интернет’а - 28/01/2018
Добрый день!
Подскажите, а с модемами на hilink будет работать?
hilink модемом Mikrotik управлять не может. Не может он с него получить и уровни сигнала, и разорвать соединение и т.д. Единственное что можно, это перезагрузить питание usb, если Mikrotik это поддерживает.
Данный скрипт не поддерживает hilink модем, но его можно для него переделать, значительно упростив скрипт.
Добавил в скрипт поддержку hilink модемов.
Но как я писал ранее, Mikrotik должен поддерживать функцию USB power reset: https://wiki.mikrotik.com/wiki/Manual:USB_Features
Добрый день! Использую модем HILINK. Установил скрипт, а он в логе вон что пишет. Отсутствует Stick и останавливает выполнение скрипта. Подскажите, что надо поправить.
2 вопрос: настроил почту ya.ru, добавил свои данные. А на какой адрес будет приходить оповещения? На этот же? Получается будет отправлять сам себе?
Прикрепленный файл:

Со скриптом разобрался. Не поправил кое что. Но правда, на мой адрес логи не отправляет, хотя тестовое письмо я пробовал, отправляется. Проверял так: на самом хайлинк отключил сеть- ждал 10 минут, ничего после подключения к интернету не пришло.
Упрощенная логика скрипта такая:
Пингует заданные узлы, если они недоступны, то перезагружает модем, опять тестирует доступность узлов, если они стали доступны, то отправляется email с отчётом.
В вашем случае, вы отключили интернет сами, скрипт его пытается тестировать, выключает/включает модем, но инет не появляется… он и не отправляет отчёт, интернета то нет… как он его отправит?
Для себя я использую более сложный скрипт, который в вашем случае, отправил бы отчёт на почту.
Но в этом скрипте, этого нет, дабы не усложнять его.
А как тогда можно проверить отправку оповещения? Не просто test, а вот полноценный отчет?
Вот scheduler . Все настроено. Делал через терминал Вашу команду. Если у Вас группа в телеграмме допустим или ник куда я смогу задать пару вопросов? Сюда не очень удобно писать.
Прикрепленный файл:

Например можно удалить шлюз по умолчанию (скрипт проверяет его наличие).
Как удалить шлюз по умолчанию?
Например из консоли
Или через web/winbox
А что, если Вы добавите и в этот скрипт принудительное отправление отчета, после появления интернета?
Программирование процесс творческий… будет вдохновение — сделаю.
У меня есть готовый скрипт, который я сам использую. Там это реализовано, но он сложнее и нет поддержки hilink. Его тоже дописывать надо.
А зачем вам этот отчёт? Основная задача скрипта — автоматически восстановливать работу интернета в случае зависания модема, а не отчёты.
Отчёты на функциональность не влияют.
Как определить, что я правильно установил скрипт? Ошибок в логе никаких нет.
Например, как писал выше, удалить шлюз по умолчанию.
Скрипт должен это определить, перезагрузить по питанию USB модем и прислать отчёт.
Спасибо! Все работает корректно! Поначалу в логах красным писало ошибку. Разобрался: в параметре
:log warning «Wait 30 sec to modem boot»;
:delay 30;
}
:delay 20;
Вместо 20 поставил 40. Видимо письмо пытался отправить без соединения с интернетом. Увеличил до 40 — все полетело! спасибо!
Прикрепленный файл:
Значит модем hilink дольше загружается чем со stick прошивкой.
Внёс изменения в скрипт с учётом данной особенности. Увеличил таймер.
А в какой строчке и что конкретно поменяли? Очень интересно.
Увеличил таймер ожидания загрузки модема после USB Power Reset. Также, как и сделали вы.
Здравствуйте! Использую модем Stick в качестве резервного канала. Основной канал по кабелю, подключен к ether1.
Подскажите, будет ли работать скрипт при таких исходных данных?
Здравствуйте!
Должен работать, но я бы сделал для тестируемых с помощью скрипта узлов отдельные маршруты через модем .
Т.е. если пинговать будете 8.8.8.8, то для этого узла, лучше сделать отдельный маршрут через USB модем.