Добрый день, дорогие читатели!
Кто то из вас мог уже прочитать мою предыдущую статью, где я представил скрипт для роутеров MikroTik на базе RouterOS для мониторинга подключенного ПК и перезагрузки LAN порта в случае необходимости. Сегодня речь пойдет о мониторинге домашнего интернета и любого внешнего узла, например вашего сервера, причем с оповещением по СМС или в Телеграм.
Для начала рассмотрим скрипт по частям:
1 2 3 4 5 6 7 |
:global inetdown :global vdsdown :local checkdns [/ping 8.8.8.8 count=5] :local checkvds [/ping 0.0.0.0 count=5] :local time [/sys clock get time] :local downsms "VDS+0.0.0.0+is+DOWN+$time" :local upsms "VDS+0.0.0.0+is+UP+$time" |
Здесь мы объявили глобальные переменные - IP публичного Google DNS, IP вашего сервера, время и шаблоны текстов для СМС. Для мониторинга интернета вы можете использовать любой DNS - просто замените IP. Также вам нужно заменить IP 0.0.0.0 на IP вашего сервера.
1 2 3 4 5 |
:if (checkdns = 0) do={ :if ($inetdown != true) do={ /log error "INTERNET is DOWN" :set $inetdown true } |
Здесь пингуется DNS и если он недоступен, переменная отсутствия интернета принимает значение true и пишется запись в лог.
1 2 3 4 5 |
else={ :if ($inetdown = true) do={ /log warning "INTERNET is UP" :set $inetdown false } |
Далее, если пинг DNS успешено, но до этого не был успешен, переменная изменяет значение и делается запись в лог INTERNET is UP.
1 2 3 4 5 6 7 |
:if (checkvds = 0) do={ :if ($vdsdown != true) do={ /log error "VDS 0.0.0.0 is DOWN" /tool fetch url="http://sms.ru/sms/send?api_id=YOUR_API_KEY&to=79012345678&text=$downsms" keep-result=no :set $vdsdown true } } |
В коде выше начинается самое интересное - если DNS доступны, т.е. интернет есть, но ваш сервер не пингуется, то в лог пишется сообщение, а вам отправляется СМС. Здесь вам нужно заменить 0.0.0.0 на IP вашего сервера, YOUR_API_KEY на ваш API ключ на сайте SMS.RU и 79012345678 на ваш номер телефона. После регистрации на сайте SMS.RU вы получите свой API ключ и сможете бесплатно отправлять 5 СМС в день на свой номер телефона (тот, который использовали для регистрации). Очень полезный сервис.
Кстати строка текста сообщения не поддерживает пробелы, так что в переменных downsms и upsms используйте знак "+" вместо пробела, как показано в коде моего скрипта. При этом на телефон вам будет приходить СМС с пробелами, вместо знака "+".
1 2 3 4 5 6 |
else={ :if ($vdsdown = true) do={ /log warning "VDS 0.0.0.0 is UP" /tool fetch url="http://sms.ru/sms/send?api_id=YOUR_API+KEY&to=79012345678&text=$upsms" keep-result=no :set $vdsdown false } |
В последней части кода, если ваш сервер был недоступен (глобальная переменная помнит об этом), но снова стал пинговаться, отправляется СМС на ваш номер с оповещением об этом событии. Что тут нужно заменить вы уже знаете.
Для использования оповещения в Телеграм вместо СМС, вам просто необходимо создать бота, получить chat_id с вашим аккаунтом и вместо запроса к API сервиса SMS.RU прописать запрос к API Телеграм бота:
1 |
/tool fetch url=”https://api.telegram.org/bot153358077:AAF4qYdUNIcWfp-SLtduVR18DuzqtXwEQAs/sendMessage?chat_id=-175202495&text=VDS_0.0.0.0_is_DOWN” |
Более детально процесс создания бота в Телеграм для использования в роутерах Микротик описан в этой статье.
Полный текст скрипта:
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 |
:global inetdown :global vdsdown :local checkdns [/ping 8.8.8.8 count=5] :local checkvds [/ping 0.0.0.0 count=5] :local time [/sys clock get time] :local downsms "VDS+0.0.0.0+is+DOWN+$time" :local upsms "VDS+0.0.0.0+is+UP+$time" :if (checkdns = 0) do={ :if ($inetdown != true) do={ /log error "INTERNET is DOWN" :set $inetdown true } } else={ :if ($inetdown = true) do={ /log warning "INTERNET is UP" :set $inetdown false } :if (checkvds = 0) do={ :if ($vdsdown != true) do={ /log error "VDS 0.0.0.0 is DOWN" /tool fetch url="http://sms.ru/sms/send?api_id=YOUR_API_KEY&to=79012345678&text=$downsms" keep-result=no :set $vdsdown true } } else={ :if ($vdsdown = true) do={ /log warning "VDS 0.0.0.0 is UP" /tool fetch url="http://sms.ru/sms/send?api_id=YOUR_API_KEY&to=79012345678&text=$upsms" keep-result=no :set $vdsdown false } } } |
Если у вас несколько серверов, вы можете разделить скрипт и сделать один скрипт для мониторинга домашнего интернета с логированием на роутере и другой скрипт для мониторинга IP адресов ваших серверов. Для удобства используйте циклы и массивы.
Полный текст скрипта после редактирования добавляете в System->Scripts и даете ему название. Для запуска скрипта каждую минуту или другой удобный вам промежуток времени добавляете его в System->Scheduler.
В On Event пишете:
1 |
system script run inet-vds |
где inet-vds - название вашего скрипта, указанное в System->Scripts.
P.S. Как вы понимаете, Микротик не может отправить вам СМС, о том что пропал интернет, ведь интернета нет и к API SMS.RU обратиться не получится. Вы можете дописать в скрипт сохранение времени, когда интернет пропал в глобальную переменную и отправку СМС после появления интернета, с указанием промежутка времени, когда интернет отсутствовал. Но я предпочитаю мониторить домашний интернет с оповещением по СМС со своего VDS, ведь это удобно: Микротик мониторит VDS, а VDS мониторит Микротик. В этом случае вы 100% будете мгновенно оповещены о проблемах. Об этом я напишу в следующей статье.
16 комментариев MikroTik — скрипт мониторинга интернета и внешних узлов с оповещением
Сергей Серков - 18.12.2017 - 12:00
Строки такого вида, использованные в Ваших скриптах, теперь в Микротик (в новых версиях ROS по крайней мере) не работают.
/tool fetch url=»http://sms.ru/sms/send?api_id=YOUR_API_KEY&to=79012345678&text=test sms»
Для отправки SMS нужно к обращаться методом POST типа:
/tool fetch url=»http://sms.ru/sms/send?api_id=YOUR_API_KEY» http-method=post http-data=»&to=79012345678&text=test SMS»
Проверено ! Переработайте скрипты.
Alexell - 22.12.2017 - 20:48
В 6.41 что ли? Потому что у меня версия 6.40.4 (stable), весь код копировал из рабочих скриптов своего Микротика, т.е. все слово в слово как здесь, так и у меня в Микротике. По сей день все работает.
Сергей Серков - 18.12.2017 - 12:02
Да и знак вопроса в строке URL нужно экранировать !
Дмитрий - 13.02.2018 - 09:01
Здравствуйте!
Напишите пожалуйста для примера проверку/опрос хотя бы двух устройств в локальной сети, что бы по образцу можно было добавлять столько сколько необходимо. Совсем не силен в программировании, тем более циклов и массивов :))
Alexell - 15.02.2018 - 12:45
Здравствуйте. Похоже вы не к той статье коммент оставили. Эта о мониторинге внешних узлов.
Дмитрий - 16.02.2018 - 10:44
К этой самой 🙂
Там где вы пишите для удобства можете разделить и т.д.
Скрипту работает у меня, но только по одному адресу, а как проверять сразу несколько адресов ?
Alexell - 18.02.2018 - 21:44
С циклами в скриптах для Микротика я и сам толком не работал, так что «неизвестное» число внешних узлов пинговать скриптом не смогу.
Набросал «методом копипаста» на скорую руку скрипт, проверяющий 3 ip адреса: https://alexell.ru/files/mikrotik-script.txt
P.S. Работу скрипта не проверял, но по идее должен работать.
Дмитрий - 22.02.2018 - 10:27
Большое спасибо, все работает
Сергей - 12.04.2018 - 05:40
Спасибо!
Александр - 13.08.2018 - 01:14
Доброго дня!
Не знаю, я к той теме или не к той…
Настроили в школе hotspot с авторизацией по звонку, со многими вопросами разобрались, но остались некоторые нюансы. В настройках не предусмотрена система оповещения в случае отсутствия интернета, а пропадет он у нас довольно часто — провайдер самый дешевый, а потому не самый лучший. СМС и прочие дистанционные решения не рассматриваем, хотим прикрутит сообщение на экран «ИНТЕРНЕТА НЕТ — ЗВОНИТЬ ПРОВАЙДЕРУ», в случае физического отсутствия интернета. Но не знаем как это сделать. Пробовали в файле login.html прикрутить скрипт с запуском картинки на этот случай… Но, то ли скрипт не правильно сделали, то ли микрот не распознает его, в общем ничего сделать так и не смогли.
Может подскажите решение?
Alexell - 13.08.2018 - 21:59
Такое мне реализовывать не приходилось. Но насколько я понимаю, это можно реализовать с помощью Webproxy и редиректа на страницу ошибки, которую разместить можно прямо на Микротике.
Леонид - 22.02.2019 - 19:56
пожайлучта это для прошивки 6.42 и выше
Алексей - 01.09.2019 - 23:05
Всем привет
Имеется Wap_lte_kit Зачастую бывает так что отпадает у него связь (это нормально)
Соответственно она появляется если передернуть lte по питанию либо таким образом
interface lte disable lte1
interface lte enable lte1
Вопрос кроется в следующем, я организовал сначала передергивание LTE по API(пинговал состояние сети сторонним софтом) но не учёл то что в момент когда пропадает связь, соответственно и запрос обработать он не в состоянии…
В связи с чем, у меня возникла идея
сделать проверку по sheduller на пинг, в определенный промежуток времени к примеру каждые 15 сек. или 60
Но не могу никак собрать нужный скрипт
Что бы он пинговал заданный узел (пускай будет http://www.ya.ru) и в случае обрыва связи посылал команду на выполнение определенного скрипта, а скрипт бы передергивал уже LTE
Но никак не соберу скрипт, был бы рад помощи!
Спасибо!
Александр - 03.04.2020 - 01:29
Доброго времени суток, на актуальных версиях RouterOS работают данные скрипты?
Alexell - 10.04.2020 - 15:48
Доброго. У меня 6.46.5 — и этот и вообще все мои скрипты работают.
Александр - 13.07.2020 - 19:21
Добрый день! Было бы функционально добавить проверку на наличие определённой строки. потому что сервер может быть и доступен, отдавать код 200, а сайт всё-таки висеть, показывать пустую страницу, например, из-за неполадки в cms.