Сповіщення з MikroTik RouterOS у Telegram

Роутер першим дізнається про проблеми в мережі: зник інтернет у провайдера, перезавантажилося обладнання, підключився незнайомий пристрій. Вбудована мова скриптів RouterOS дає змогу надсилати повідомлення про такі події просто в Telegram — без додаткових серверів і програм.
Як це працює
Telegram має HTTP-інтерфейс для ботів: достатньо звернутися за спеціальною адресою, і бот надішле повідомлення в чат. У RouterOS для HTTP-запитів слугує команда /tool fetch. Ми оформимо надсилання як функцію й викликатимемо її з планувальника, Netwatch та інших місць.
Крок 1. Створіть бота
- Відкрийте в Telegram діалог із @BotFather і надішліть
/newbot. - Задайте ім’я та логін бота, збережіть отриманий токен на кшталт
123456789:AAH.... - Надішліть своєму боту будь-яке повідомлення.
- Відкрийте в браузері адресу
https://api.telegram.org/bot<ТОКЕН>/getUpdatesі знайдіть у відповіді фрагмент"chat":{"id":123456789— це ідентифікатор чату.
Для сповіщень групі додайте бота в групу й використовуйте її ідентифікатор — він починається зі знака мінус.
Крок 2. Перевірте надсилання
Виконайте в терміналі роутера, підставивши свої значення:
/tool fetch url="https://api.telegram.org/bot123456789:AAH.../sendMessage" http-method=post http-data="chat_id=123456789&text=Test from MikroTik" output=none
У чат має надійти повідомлення. Якщо його немає, перевірте, що на роутері працює DNS і є доступ в інтернет:
/ping api.telegram.org count=3
Крок 3. Створіть функцію надсилання
Щоб не повторювати токен у кожному скрипті, винесемо надсилання у функцію. Створіть скрипт:
/system script add name=tg-init policy=read,write,test,policy source={
:global tgSend do={
:local token "123456789:AAH..."
:local chat "123456789"
:local msg ("[" . [/system identity get name] . "] " . $text)
:do {
/tool fetch url=("https://api.telegram.org/bot" . $token . "/sendMessage") \
http-method=post http-data=("chat_id=" . $chat . "&text=" . $msg) output=none
} on-error={ :log warning "Telegram: message not sent" }
}
}
Функція додає до кожного повідомлення ім’я роутера — це зручно, коли пристроїв кілька. Блок on-error не дає скрипту зупинитися, якщо інтернет у цей момент недоступний.
Глобальні функції зберігаються в пам’яті й зникають після перезавантаження, тому скрипт потрібно виконувати під час старту:
/system scheduler add name=tg-init start-time=startup on-event="/system script run tg-init"
Запустіть його зараз вручну й перевірте функцію:
/system script run tg-init
:global tgSend; $tgSend text="Function works"
У будь-якому скрипті перед викликом функцію потрібно оголосити рядком :global tgSend.
Приклади використання
Роутер перезавантажився
/system scheduler add name=tg-boot start-time=startup on-event={
:delay 60s
:global tgSend
$tgSend text="Router started"
}
Пауза потрібна, щоб устигли піднятися інтернет-канал і функція надсилання. Розклади зі start-time=startup виконуються за порядком імен, тому tg-boot спрацює після tg-init.
Зник зв’язок із вузлом
Netwatch стежить за доступністю адреси й запускає скрипти в разі зміни стану:
/tool netwatch add host=192.168.88.10 interval=30s timeout=3s \
down-script={:global tgSend; $tgSend text="Server 192.168.88.10 is DOWN"} \
up-script={:global tgSend; $tgSend text="Server 192.168.88.10 is UP"}
Так зручно стежити за серверами, камерами й точками доступу в локальній мережі.
Перемикання на резервний канал
Якщо у вас два провайдери, відстежуйте основний канал за зовнішньою адресою. Повідомлення про падіння піде через резервний:
/tool netwatch add host=1.1.1.1 interval=20s timeout=2s \
down-script={:global tgSend; $tgSend text="Main ISP is DOWN"} \
up-script={:global tgSend; $tgSend text="Main ISP is UP"}
Щоб перевірка йшла саме через основного провайдера, додайте для цієї адреси окремий маршрут через його шлюз.
Новий пристрій у мережі
Скрипт DHCP-сервера виконується під час кожної видачі адреси:
/ip dhcp-server set [find] lease-script={
:if ($leaseBound = "1") do={
:global tgSend
$tgSend text=("New device: " . $"lease-hostname" . " " . $leaseActIP . " " . $leaseActMAC)
}
}
Повідомлення надходитимуть під час кожного підключення, включно зі знайомими пристроями. Щоб отримувати сповіщення лише про нові, зробіть для відомих пристроїв статичні записи DHCP і перевіряйте в скрипті, що запис динамічний.
Змінилася зовнішня IP-адреса
/system script add name=tg-wanip source={
:global tgSend
:global lastWanIp
:local ip [/ip address get [find interface=ether1] address]
:if ($ip != $lastWanIp) do={
:set lastWanIp $ip
$tgSend text=("WAN IP changed: " . $ip)
}
}
/system scheduler add name=tg-wanip interval=5m on-event="/system script run tg-wanip"
Високе завантаження процесора
/system script add name=tg-cpu source={
:global tgSend
:local load [/system resource get cpu-load]
:if ($load > 85) do={ $tgSend text=("CPU load " . $load . "%") }
}
/system scheduler add name=tg-cpu interval=5m on-event="/system script run tg-cpu"
Вхід адміністратора
Найпростіший спосіб — раз на хвилину перевіряти журнал на записи про вхід:
/system script add name=tg-login source={
:global tgSend
:global lastLoginTime
:foreach i in=[/log find where topics~"account" and message~"logged in"] do={
:local t [/log get $i time]
:if ($t != $lastLoginTime) do={
:set lastLoginTime $t
$tgSend text=[/log get $i message]
}
}
}
/system scheduler add name=tg-login interval=1m on-event="/system script run tg-login"
Скрипт спрощений: під час першого запуску він надішле повідомлення про недавні входи з журналу, а далі — лише про нові.
Права скриптів і планувальника
Якщо скрипт не виконується з планувальника, перевірте політики: розклад і скрипт повинні мати дозволи read, write, test і policy. Помилки виконання видно в журналі:
/log print where topics~"script"
Безпека
- Токен бота зберігається в конфігурації роутера відкритим текстом. Він потрапляє в резервні копії та в результат команди
/export— не публікуйте їх. - Команда
/tool fetchтипово не перевіряє сертифікат сервера. Щоб увімкнути перевірку, додайте параметрcheck-certificate=yesі переконайтеся, що на роутері є кореневі сертифікати. - Використовуйте окремого бота для сповіщень і не давайте йому зайвих прав у групах.
- Обмежте доступ до самого роутера — базові правила описано в статті про захист MikroTik.
Що ще можна відстежувати
Тим самим способом зручно повідомляти про підключення VPN-клієнтів, спрацювання правил файрвола, завершення резервного копіювання або оновлення RouterOS. Сповіщення з Linux-серверів налаштовуються схоже: вхід по SSH і високе навантаження.
Якщо роутер працює як хмарний CHR, ті самі скрипти підходять без змін.
Відеоінструкція



