Перейти к содержимому

Telegram уведомления для Mikrotik RouterOS

После установки и настройки любой системы, появляется вопрос ее мониторинга, получения уведомлений о тех либо иных событиях.

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

Как отправить сообщение?

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

Для того чтобы создать бота, в приложении телеграм ищем отца ботов BotFather и отправляем ему команлду /start и следовать инструкции. После создания вы получите HTTP API (токен) который мы будем использовать для отправки сообщения.

Для того чтобы бот понимал куда отправлять сообщение, ему необходимо передать ID группы либо чата. Чтобы получить ID можно воспользоваться ботом IDBot, либо начать диалог с ботом и отправить ему произвольный текст, потом открыть браузер и перейти по ссылке в которой необходимо указать HTTP API который вы получили ранее . Ссылка выглядит следующим образом

https://api.telegram.org/bot<ваш_токен>/getMe
{"ok":true,"result":{"id":122145458590,"is_bot":true,"first_name":"UnixHost","username":"unixhost","can_join_groups":true,"can_read_all_group_messages":false,"supports_inline_queries":false}}

В поле id будет указан ваш ID, его вам нужно будет сохранить.

Все необходимы данные для отправки сообщения боту у нас есть, теперь мы можем сформировать ссылку для отправки.

https://api.telegram.org/bot<ваш_токен>/sendMessage?chat_id=<id_чата>&text=<сообщение>

В ссылке выше заменим токен на ваш HTTP API, id_чата на ваш ID и укажите произвольное сообщение, после чего скопируем данную ссылку в браузере и перейдем по ней.

Сразу же после перехода бот отправит вам сообщение с указанным текстом.

После того как мы разобрались с отправкой сообщений в телеграм, перейдем к реализации отправки уведомлений в телеграм с роутеров mikrotik c операционной системой routeros.

Отправка уведомлений в телеграм с routeros

Для того чтобы выполнить отправку сообщения в телеграм через терминале routeros мы будем использовать утилиту tools/fetch

/tool fetch

Данная утилита служит для копирования файлов на/из сетевого устройства через HTTP, FTP или SFTP, также она может использоваться для отправки POST/GET запросов и отправки любого типа данных на удаленный сервер.

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

/tool fetch url="https://api.telegram.org/bot<ваш_токен>/sendMessage?chat_id=<id_чата>&text=<сообщение>"

В качестве параметра утилите мы передаем ulr который совпадает с тем который мы копировали и вставляли в браузер.

После этого вы получите сообщение от бота в телеграм.

Получаем логи от mikrotik routeros в телеграм

В mikrotik routerOS реализована система скриптинга, подробнее про написание скриптов вы можете прочитать в официальной Wiki:Scripting.

Создадим две переменные TelegramApi и ChatId в которые внесем HTTP API и ChatID. В терминале выполним следующие команды

:global TelegramApi;
:global ChatId;

Таким образом мы создали глобальные переменные которые могут быть использованы при написании скриптов. Чтобы установить значение переменных выполним следующие команды предварительно заменив значения на свои.

:set TelegramApi your_http_api
:set ChatId your_chat_id

Задать значения переменных вы можете и через winbox. Перейдите в System — Scripts.

И теперь при создании скрипта мы сможем использовать данные переменные и их же можно использовать при отправке сообщений через терминал. Команда отправки сообщения теперь будет выглядеть следующим образом

/tool fetch url="https://api.telegram.org/bot$TelegramApi/sendMessage?chat_id=$ChatId&text=mikrot test"

Очень важный момент, после перезагрузки роутера, все внесенные переменные удаляются.

Добави наш первый скрипт. Перейдем в System — Scripts на вкладке Scripts нажимаем + и в поле текста скрипта копируем следующий текст и заменив значения your_http_api и your_chat_id на свои.

:global lastTime;
:global output;
:global ChatId;
:global TelegramApi;
:set TelegramApi your_http_api
:set ChatId your_chat_id
:global mtIdentity [/system identity get name];

:local LogGet [ :toarray [ /log find topics~"system" || message~"login failure" || message~"logged" || message~"connected" || message~"[Ff]ailure" ]];

:local LogtLineCount [ :len $LogGet ];

if ($LogtLineCount > 0) do={
:local currentTime "$[ /log get [ :pick $LogGet ($LogtLineCount -1) ] time ]";
:if ([:len $currentTime] = 10 ) do={
:set currentTime [ :pick $currentTime 0 10 ];
}
:set output "$currentTime - $[/log get [ :pick $LogGet ($LogtLineCount-1) ] message]";
:if (([:len $lastTime] < 1) || (([:len $lastTime] > 0) && ($lastTime != $currentTime))) do={
:set lastTime $currentTime ;
:tool fetch url=("https://api.telegram.org/bot$TelegramApi/sendmessage\?chat_id=$ChatId&text=%F0%9F%93%A1\"$mtIdentity\" :  $output") keep-result=no 
}

}

Назовем наш скрипт LogToTelegram и установим на скрипте права read,write,policy,test и проверим работу скрипта выполнив подключения к роутеру от несуществующего пользователя.

В телеграм от бота мы получим уведомление с информацией о том, что была произведена попытка входа, указано время, имя пользователя и IP адрес с которого была попытка подключения.

Все что нам осталось, добавить скрипт в планировщик и запускать его, к примеру, каждую минуту. Переходим в System — Scheduler и добавляем новое задание.

Присваиваем имя заданию sendlogtotg устанавливаем выполнение 1 раз в минуту и заполняем команду запуска в которой указано, что будет выполнен скрипт с названием LogToTelegram

/system script run LogToTelegram

После этого, скрипт будет проверять журнал логов и отправлять вам уведомление.

Данная реализация дает понимание о том, как работает отправка уведомлений в телеграм с mikrotik routeros и даст вам возможность оптимизировать и настроить скрипт под свои задачи.