MikroTik – скрипт мониторинга интернета и внешних узлов с оповещением

MikroTik — скрипт мониторинга

Добрый день, дорогие читатели! Вчера я обещал выложить скрипт мониторинга внешних ресурсов с оповещением, чем и займусь в этой статье.

Кто то из вас мог уже прочитать мою предыдущую статью, где я представил скрипт для роутеров MikroTik на базе RouterOS для мониторинга подключенного ПК и перезагрузки LAN порта в случае необходимости. Сегодня речь пойдет о мониторинге домашнего интернета и любого внешнего узла, например вашего сервера, причем с оповещением по СМС или в Телеграм.

Для начала рассмотрим скрипт по частям:

: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 вашего сервера.

:if (checkdns = 0) do={
	:if ($inetdown != true) do={
	/log error "INTERNET is DOWN"
	:set $inetdown true
	}

Здесь пингуется DNS и если он недоступен, переменная отсутствия интернета принимает значение true и пишется запись в лог.

else={
	:if ($inetdown = true) do={
		/log warning "INTERNET is UP"
		:set $inetdown false
	}

Далее, если пинг DNS успешено, но до этого не был успешен, переменная изменяет значение и делается запись в лог INTERNET is UP.

	: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 используйте знак “+” вместо пробела, как показано в коде моего скрипта. При этом на телефон вам будет приходить СМС с пробелами, вместо знака “+”.

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 Телеграм бота:

/tool fetch url=”https://api.telegram.org/bot153358077:AAF4qYdUNIcWfp-SLtduVR18DuzqtXwEQAs/sendMessage?chat_id=-175202495&text=VDS_0.0.0.0_is_DOWN”

Более детально процесс создания бота в Телеграм для использования в роутерах Микротик описан в этой статье.

Полный текст скрипта:

: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 пишете: system script run inet-vds, где inet-vds – название вашего скрипта, указанное в System->Scripts.

P.S. Как вы понимаете, Микротик не может отправить вам СМС, о том что пропал интернет, ведь интернета нет и к API SMS.RU обратиться не получится. Вы можете дописать в скрипт  сохранение времени, когда интернет пропал в глобальную переменную и отправку СМС после появления интернета, с указанием промежутка времени, когда интернет отсутствовал. Но я предпочитаю мониторить домашний интернет с оповещением по СМС со своего VDS, ведь это удобно: Микротик мониторит VDS, а VDS мониторит Микротик. В этом случае вы 100% будете мгновенно оповещены о проблемах. Об этом я напишу в следующей статье.

UPD 2022: проверено, работает и на RouterOS 7.