MikroTik Скрипты: Уведомление о подключении устройства к сети

Настраиваем уведомление о подключении нового устройства к локальной сети или WiFi, используя настройки DHCP сервера (выделение IP адреса или истечение аренды). Отправляем сообщение в Telegram или электронную почту.

Мой Wi-Fi роутер сказал, что мужчина был дома с моей женой, пока я был на работе

 LickingWoundSalt (Reddit)

Но это не единственное применение этой возможности. 🙂

Если выставить время аренды IP адреса (Lease Time) равным 10 часов можно узнать во сколько подключились к сети компьютеры сотрудников или кто не выключает компьютер уходя с рабочего места.

Если использовать простой пароль для WiFi можно обнаружить, что соседский ребенок тоже использует ваш WiFi. 🙂

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

Так же можно на основе этого скрипта выполнить другие полезные действия.

Статья на других языках:
?? — MikroTik Scripts: Notification of device connection to the network
?? — MikroTik Scripts: Notificación de la conexión del dispositivo a la red
?? — Scripts MikroTik: notification de la connexion de l’appareil au réseau
?? — MikroTik-Scripts: Benachrichtigung über die Geräteverbindung zum Netzwerk
?? — MikroTik-scripts: Melding van apparaat verbinding met het netwerk

Скрипт: Отправка уведомления о подключении устройства к сети

MikroTik скрипт срабатывает при выделении IP адреса новому устройству или устройству срок аренды IP адреса которого истек. Отправляет сообщение в Telegram или электронное письмо.

Сообщение содержит:

  1. имя устройства (имя компьютера или назначенное производителем);
  2. комментарий (если устройству назначен статический адрес с указанным комментарием)
  3. имя DHCP интерфейса;
  4. IP и MAC адрес подключаемого устройства.

? Рекомендую в комментариях к устройствам использовать только символы английского языка!

Скрипт использует вызов функций:

Пример электронного письма уведомления от DHCP сервера о подключении устройства
Пример электронного письма уведомления от DHCP сервера о подключении устройства

Изменить время аренды IP адреса

Устанавливаем время аренды IP адреса = 10 часов.

[IP] -> [DHCP Server] -> [Your DHCP server] -> [General: Lease Time=10:00:00]

Создать скрипт уведомления

[IP] -> [DHCP Server] -> [Script]

Код скрипта

:if ($leaseBound =1) do={
    # Variables
    :local Time [/system clock get time];
    :local Date [/system clock get date];
    :local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
    :local DeviceName [/system identity get name];

    # START Send Telegram Module
    :local MessageText "\F0\9F\9F\A2 <b>$DeviceName: New DHCP client</b> %0D%0A <b>Name:</b> $"lease-hostname" %0D%0A <b>Comment:</b> [$Comment] %0D%0A <b>Interface:</b> $leaseServerName %0D%0A <b>IP:</b> $leaseActIP %0D%0A <b>MAC:</b> $leaseActMAC";
    :local SendTelegramMessage [:parse [/system script  get MyTGBotSendMessage source]]; 
    $SendTelegramMessage MessageText=$MessageText;
    #END Send Telegram Module

    # START Send Email Module
    :local SendTo "notify@mhelp.pro";
    :local Subject "\F0\9F\9F\A2 INFO: $DeviceName [$Date $Time] New DHCP client";
    :local MessageText "Name: $"lease-hostname", Comment: $Comment, Interface: $leaseServerName IP: $leaseActIP MAC: $leaseActMAC";
    :local FileName "";
    :local SendEmail [:parse [/system script get SendEmailFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
    # END Send Email Module
}
MikroTik Скрипты: Уведомление о подключении устройства к сети

? В этой статье обсуждалось создание скрипта MikroTik для отправки сообщений о подключении устройства к сети. Я надеюсь у вас получилось настроить отправку уведомлений в Telegram или на электронную почту. Однако, если вы столкнулись с каким-то проблемами при получении информации, не стесняйтесь написать в комментариях. Я постараюсь помочь.

P.S. Если у вас есть интересные или необычные вариант применения скрипта, напишите в комментариях, я добавлю в статью. 🙂

31 комментарий к “MikroTik Скрипты: Уведомление о подключении устройства к сети”

  1. Подскажите как доработать скрипт, так чтобы он сравнивал с заготовленным списком типа user + mac и давал ответ о вхождении в список. Я попытался сделать так:
    # Список пользователей и их MAC-адресов
    :local userMACs {
    "user1"="00:11:22:33:44:55";
    "user2"="66:77:88:99:AA:BB"
    }

    # Функция для получения имени пользователя по MAC-адресу
    :local getUserNameByMAC do={
    :local macAddress \$1
    :foreach user, mac in=$userMACs do={
    :if ($macAddress = $mac) do={
    return $user
    }
    }
    return ""
    }

    # Основной скрипт
    :local macAddress [/ip dhcp-server lease get [find where active-address=$leaseActIP] mac-address]
    :local userName [$getUserNameByMAC $macAddress]
    :if ($userName != "") do={
    :log info ("Авторизация успешна для пользователя " . $userName . " с MAC-адресом " . $macAddress)
    } else={
    :log warning ("MAC-адрес " . $macAddress . " не сопоставлен ни с одним пользователем")
    }

    Ответить
  2. Здравствуйте! А нету подобного, только для капсмана?
    Чтобы при подключении клиента, комментарий брался из аксесс листа и отправлялся в телегу.

    Ответить
  3. Всем привет! хочу поделиться кодом который работает у меня, так как все взято именно от сюда и спасибо огромное автору за публикацию и поднятую тему. Также благодарность всем участникам.
    Может кому поможет и мой опыт. Комменты отправляются как при коннекте так и при дисконнекте клиента DHCP, для меня это было важно. для наглядности, коннект-зеленый круг, дисконнект-красный круг, ну и дата со временем событий тоже присутствует.
    Работает у меня (на ROS 7.13) только с такой вариацией строк кода. И да, лиза у DHCP 10 мин. Для моих задач это выглядит так.

    :if ($leaseBound =1) do={
    :local Time [/system clock get time];
    :local Date [/system clock get date];
    :local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
    :local DeviceName [/system identity get name];
    :local MessageText "\F0\9F\9F\A2 $DeviceName: New DHCP client %0D%0A Date: [$Date] Time: [$Time] %0D%0AName: $"lease-hostname" %0D%0A Comment: [$Comment] %0D%0A Interface: $leaseServerName %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC";
    :local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    } else={
    :local Time [/system clock get time];
    :local Date [/system clock get date];
    :local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
    :local DeviceName [/system identity get name];
    :local MessageText "\F0\9F\94\B4 $DeviceName: Disconnect DHCP client %0D%0A Date: [$Date] Time: [$Time] %0D%0AName: $"lease-hostname" %0D%0A Comment: [$Comment] %0D%0A Interface: $leaseServerName %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC";
    :local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    }

    Ответить
  4. Очень классный скрипт, спасибо.
    Правда не работает с устройствами Apple, даже если МАС не меняется. Пока не придумал как победить

    Ответить
  5. Вау! Это прям то что я искала и ломала голову как сделать. Спасибо большое что делитесь такой полезной информацией!

    Мне кстати стало интересно, у меня дома в качестве сервера стоит Thinkpad x230 tablet, в который вставлены симка (в заводской слот) и карточка sierra wireless mc8355 gobi3000 в родной mini pci-e слот. Т.е. Мобильная связь там можно сказать нативная. Реально ли как-то сделать чтобы вывод этого скрипта с микротика обращался к локальном серверу (т.е. ноуту) и триггерил какой-нибудь скрипт для отправки смс?

    Ответить
  6. Все работало нормально, но после обновления прошивки до 7.6 оповещение о новых подключенных перестали приходить. Просто email вручную с микрота отправляются, никакие настройки не менялись.
    Может кто сталкивался с похожей проблемой?

    Ответить
  7. Подскажите, как отправить сообщение при покидании клинетом wi-fi сети? Секция кода else от Павла М. срабатывает вместе с
    секцией if. И приходит просто два сообщения при подключении клиента к точке доступа. В настройках dhcp время лизы установлено 10мин.

    } else={
    :local DeviceName [/system identity get name];
    # START Send Telegram Module when disconnect device
    :local MessageText "\F0\9F\9F\A2 $DeviceName: Disconnect DHCP client %0D%0A Name: $"lease-hostname" %0D%0A Interface: $leaseServerName %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC";
    :local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
    $SendTelegramMessage MessageText=$MessageText;
    #END Send Telegram Module when disconnect device
    }

    Ответить
  8. Ребята, подскажите а как в Comment: [] вставить (вывести) Active Host Name?
    Вот пример моего сообщения, ну очень не хватает знать Active Host Name и еще бы уровень сигнала из CAPsMAN
    ? MikroTikMainSouz: New DHCP client
    Name: MEIZU-M6-Note
    Comment: []
    Interface: main-dhcp
    IP: 192.168.88.18
    MAC: 02:5F:67:C4:0E:EE

    Ответить
  9. Павел М.
    27 декабря, 2020 в 18:02
    Всё решил, причём намного проще чем думал изначально: воспользовался тем, что DHCP-сервер всегда отслеживает не только подключение нового клиента но и отключение подключенного, таким образом скрипт просто дополняется новой веткой…

    Павел, вы ошибаетесь! $leaseBound = 0 — это не отключение подключенного клиента, а окончание срока аренды IP-адреса.

    Ответить
  10. Добрый день. Подскажите пожалуйста, как можно реализовать уведомления ТОЛЬКО для динамических адресов?

    Ответить
    • :if ($leaseBound = 1 && [/ip dhcp-server lease get [find address=$leaseActIP] dynamic ]=true) do={
      :local Time [/system clock get time];
      :local Date [/system clock get date];
      :local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
      :local DeviceName [/system identity get name];

      /tool fetch "https://api.telegram.org/bot5XXXXXXXXXXXXXXXXXXX/sendMessage?chat_id=-100XXXXXXXXXX6&text=\F0\9F\9F\A2 $DeviceName: %D0%9D%D0%BE%D0%B2%D0%BE%D0%B5+DHCP+%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE+%D0%B2+%D1%81%D0%B5%D1%82%D0%B8%3A $"lease-hostname" [$Comment]+IP: $leaseActIP+MAC: $leaseActMAC"
      }

      Ответить
  11. Настроил по инструкции, но при подключении устройств — ничего не приходит. Что-то надо поменять? Последняя версия прошивки — RouterOS v6.48.1 (stable).

    p.s. если в ручном режиме запускаю этот скрипт — ничего в телегу не приходит, а если выполняю ручной запуск скрипта SendMessageToTelegram — приходит: «? MyName: italic inline fixed-width code plain text More Scripts (https://mhelp.pro/)».

    Ответить
    • Проверяйте правильность отправки текста сообщения, проблема скорей всего в этом, а не в данном скрипте.
      По статье «Отправка сообщения в Телеграм (функция)».
      Добейтесь чтобы отправка сообщения проходила успешно (проверяйте наличие спец символов или символов русского языка в тексте сообщения).

      Ответить
  12. Как сделать чтобы уведомления приходили только о тех устройствах в которых в комментариях отсутствует некий общий текст, например если в комментарии присутствует слово «Sss» то уведомления не должны приходить?

    Ответить
  13. Уважаемый автор, ещё раз спасибо за скрипт, всё работает отлично, но столкнулся с одной неприятной особенностью некоторых Apple-устройств: отчего-то они почти непрерывно подключаются и тут же самостоятельно отключаются от DHCP-сервера, в результате в лог попадает много ненужных уведомлений, в связи с этим вопрос: как изменить скрипт чтобы этого избежать? Самым простым вижу способ просто отключить уведомления о подключении/отключении по имени устройства или его MAC-адресу, но тогда об этом устройстве не будет вообще никогда информации в уведомлениях, это не совсем устраивает. Нет ли ещё каких вариантов — чтобы отслеживались ситуации с отключением/подключением одного и того же устройства в пределах 1-2 минут и они не попадали в лог, а попадали именно такие, которые не имели бы обратно-парных? Как для этого можно модернизировать скрипт?

    Ответить
    • Спасибо за отзыв.
      1. С Apple устройствами проблема, у них стандартное поведение — это изменение MAC адреса в WiFi сети, для «обезличивания». Так же как частое включение/отключение (это может быть работа режима энергосбережения), после чего устройство заходит в сеть с новым MAC адресом;
      2. По поводу доработки, нужно подумать, но маловероятно что это будет простая доработка. Как быстрое решение видится создание этим скриптом списка подключаемых устройств (с перезаписью дублей). Список будет забирать другой скрипт и при этом очищать этот список.

      Ответить
  14. Отличная статья, спасибо!!! А как можно добавить функцию отслеживания и уведомления при отключении устройства?

    Ответить
    • Здравствуйте, спасибо. Придется немного переделать скрипт Уведомление о входе — ссылка. При отключении от WiFi в логе MikroTik генерируется сообщение вида: «2C:59:8A:71:20:78@wlan2-5GHz: disconnected, received disassoc: sending station leaving (8)».
      В указанном скрипте изменить строку поиска определенного события на :local IDsEventsAccount [/log find where message ~ «station leaving»]; или какой-то свой признак из журнала устройства.

      Ответить
      • Всё решил, причём намного проще чем думал изначально: воспользовался тем, что DHCP-сервер всегда отслеживает не только подключение нового клиента но и отключение подключенного, таким образом скрипт просто дополняется новой веткой:

        :if ($leaseBound =1) do={
        # Variables
        :local Time [/system clock get time];
        :local Date [/system clock get date];
        :local Comment [/ip dhcp-server lease get value-name=comment number=[/ip dhcp-server lease find address=$leaseActIP]]
        :local DeviceName [/system identity get name];

        # START Send Telegram Module when connect new device
        :local MessageText "\F0\9F\9F\A2 $DeviceName: Connect new DHCP client %0D%0A Name: $"lease-hostname" %0D%0A Comment: [$Comment] %0D%0A Interface: $leaseServerName %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC";
        :local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
        $SendTelegramMessage MessageText=$MessageText;
        #END Send Telegram Module when connect new device
        } else={
        :local DeviceName [/system identity get name];
        # START Send Telegram Module when disconnect device
        :local MessageText "\F0\9F\9F\A2 $DeviceName: Disconnect DHCP client %0D%0A Name: $"lease-hostname" %0D%0A Interface: $leaseServerName %0D%0A IP: $leaseActIP %0D%0A MAC: $leaseActMAC";
        :local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
        $SendTelegramMessage MessageText=$MessageText;
        #END Send Telegram Module when disconnect device
        }

        Всё почти точно такое же как и при подключении — только убрал выдачу комментария при отключении клиента — всё равно он приходил пустым несмотря на заранее заданный комментарий — при подключении клиента он как раз отображался, а вот при отключении — нет, интересно почему так?
        Думаю, можно поместить этот скрипт в основную статью, переделав её и сразу назвав как «скрипт для уведомления о подключении и отключении устройства к сети» — так будет легче найти и сразу же использовать тем кто в этом нуждается.
        У меня же остался вопрос о том как можно менять цвет и тип пиктограммы первого символа при выдаче сообщения: зелёная жирная точка это хорошо, а как подставлять иные варианты и где можно их все увидеть? Понятно что сейчас это задано вот этими символами \F0\9F\9F\A2, но где можно узнать как именно они кодируют?

        Ответить
        • Вы молодец.

          1. Статья задумывалась в упрощенном виде, чтобы новичкам было легче войти в тему скриптов. Поэтому нет многофункциональных скриптов и разного рода «оптимизаций» и сокращений кода. Т.е. посмотрели что легко, сделали. Понравилось, начали оптимизировать, благо знания уже есть.
          О варианте уведомлений при отключении клиентов, насколько ценная информация, что 30 сетевых устройств были выключены по завершению рабочего дня?

          2. Зеленая точка — это emoji. MikroTik не поддерживает прямую вставку эмодзи, поэтому записываем её кодом. Найти HEX коды эмодзи, можно по запросу «emoji utf-8 web», например ? это \xF0\x9F\x98\x81, что для MikroTik запишется как \F0\9F\98\81. Использование эмодзи в заголовке уведомления очень информативно.

          3. Вы можете вынести эти строки вниз скрипта, исключив их из условий:
          :local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
          $SendTelegramMessage MessageText=$MessageText;

          Это уменьшит код (избыточность) еще на две строки, т.к. в вашем варианте в любом случае происходит отправка сообщения, а в условиях оставить только генерацию сообщения.

        • 1. Честно признаюсь, необходимость отслеживания точного времени отключения устройств возникла не просто так, а в связи с желанием дистанционного контроля ребёнка (почти уже взрослого), живущего самостоятельно — хотелось ненавязчиво понять график прихода/ухода на учёбу, режим работы ПК — теперь всё это будет попадать в чат и можно будет просмотреть и получить исчерпывающие ответы на свои вопросы.
          2. Спасибо за пояснение, пока ждал уже и сам нашёл ответ где искать эти эмодзи, правда пока не нашёл их все в одном месте сразу.
          3. Логично, и правда отправка сообщения произойдёт и так и этак, сейчас переделаю и проверю работоспособность.

          Ещё раз спасибо и хотелось бы побольше статей про автоматизацию работы с Mikrotik и его настройку, использование разных полезных скриптов. К примеру, на некоторых скриншотах видна имеющаяся настройка CAPsMAN — а статьи про неё нет, можно добавить?

        • 1. Да, для домашнего варианта будет хорошо.

          2. Я смотрю здесь, и ищу запрос в гугле вида «⚠️ utf8 hex». Кстати, возможен вариант, что эмодзи может некорректно отображаться на устройстве определенного вендора (особенно какие-то новые символы).

          3. Статьи пишутся, но времени не хватает. Про CAPsMAN планы есть, но очень отдаленные.

        • Для себя собрал такой скрипт. Были проблемы с lease-hostname — нужны еще двойные кавычки, поэтому сделал так.
          Работает на версии 6.48.5

          :global Message
          :if ($leaseBound =1) do={
          :local Hname $"lease-hostname";
          :set Message "\F0\9F\86\99 New client%0D%0A $leaseActIP [$Hname]%0D%0A MAC: $leaseActMAC ";
          } else={
          :local Hname $"lease-hostname";
          :set Message "\F0\9F\93\B4 Disconnect %0D%0A[$Hname] ";
          }
          :local SendTelegramMessage [:parse [/system script get MyTGBotSendMessage source]];
          $SendTelegramMessage MessageText=$Message;

        • Добрый день.
          Ваш скрипт оказался самым интересным и очень подходящим мне, хотел только уточнить одну вещь.
          Сам я не умею писать сприпты, только могу примерно понять о чем идёт речь, прочитать так сказать немного. Вопрос у меня такого характера, есть 2 устройства, спамять раз в 10 минут, то поключаться то отключаться, как сделать так, что бы исключить их маки, что в ваш скрипт надо дописать и главное куда? Спасибо заранее за ответ

  15. В телеграме получаю:

    ? MikroTik: New DHCP client
    Name: MiNote10Lite-MiNote1
    Comment: []
    Interface: server1
    IP: 192.168.0.241
    MAC: AE:1D:16:73:4A:AD]
    —-

    Что должно выводиться в «Comment», у меня там пустой массив?
    В конце MAC адреса лишняя закрывающаяся квадратная скобка

    Ответить
    • 1. Comment это комментарий к устройствам со статическими IP адресами (в таблице [IP] -> [DHCP Server] -> [Leases]), у вас клиент MiNote10Lite-MiNote1 либо имеет динамический IP, либо, если ему назначен статический IP адрес, поле комментарий не заполнено;
      2. Спасибо, опечатка, исправлю.

      Ответить

Оставьте комментарий