1. Блог
  2. Мануали

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

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

Роутер першим дізнається про проблеми в мережі: зник інтернет у провайдера, перезавантажилося обладнання, підключився незнайомий пристрій. Вбудована мова скриптів RouterOS дає змогу надсилати повідомлення про такі події просто в Telegram — без додаткових серверів і програм.

Як це працює

Telegram має HTTP-інтерфейс для ботів: достатньо звернутися за спеціальною адресою, і бот надішле повідомлення в чат. У RouterOS для HTTP-запитів слугує команда /tool fetch. Ми оформимо надсилання як функцію й викликатимемо її з планувальника, Netwatch та інших місць.

Крок 1. Створіть бота

  1. Відкрийте в Telegram діалог із @BotFather і надішліть /newbot.
  2. Задайте ім’я та логін бота, збережіть отриманий токен на кшталт 123456789:AAH....
  3. Надішліть своєму боту будь-яке повідомлення.
  4. Відкрийте в браузері адресу 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, ті самі скрипти підходять без змін.

Відеоінструкція

YouTube video