MIKROTIK уведомления о новых узлах (DHCP LEASE)

Возникла задача получать уведомления при подключении новых (не санкционированных) клиентов к сети и автоматически добавлять их в списки блокировки (adress-list=lock).Все зарегистрированные клиенты, у меня, имеют статическую запись в dhcp leases. Новые клиенты автоматически регистрируются как динамические, поэтому нам надо при очередной выдаче IP проверить является ли запись статической или динамической. В настройках DHCP сервера имеется параметр: Lease Script.

dhcp-lease-script

Этот скрипт выполняется при каждой выдаче IP. В этом скрипте определены глобальные переменные:

  • leaseBound – 0 если клиент не привязан к IP, 1 – если привязан;
  • leaseServerName – имя сервера DHCP который выдал IP;
  • leaseActMAC – MAC адрес клиента;
  • leaseActIP – IP адрес присвоенный клиенту;

Далее нам понадобится php скрипт отправляющий SMS по параметрам, который будет вызываться при выдаче очередного IP. Для примера это будет: http://mysite.ru/sms.php?text=testmessage.

Если не хотите заморачиваться со скриптом на своем хостинге рекомендую зарегистрироваться на сервисе отправки smsc.ru и отправлять SMS используя простой HTTP запрос формата:

Если у вас есть сайт (любой) можете разместить у себя кнопку сервиса smsc.ru и через службу поддержки (они проверят линк) вам установят тариф “6” уровня, что сделает отправку сообщений дешевле. Так же после подтверждения вашего номера телефона на счете появится бонус – 15 руб., которых достаточно для отладки скрипта. Так что денег не понадобится.

В Lease Script приписываем саму логику:

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

Проблему постоянных уведомлений решит список блокировки в Firewall. Если выделенный IP уже в списке блокировки то не стоит повторно уведомлять. Итоговый вид скрипта будет таким:

 

Добавляем в начало firewall правила блокировки всех пакетов входящих в Adress-List “lock”:

В принципе можете нагрузить php скрипт дополнительным функционалом, который будет добавлять события в БД или через Router OS API разносить блокировку по другим узлам.

PS: Усилить блокировку можно сменив в настройка интерфейса бриджа (по умолчанию) arp=reply-only, и в настройках сервиса dhcp:  add-arp=yes. Эти настройки позволяют передать “управление” ARP – DHCP серверу. Если во время настройки отвалится Микротик, подключайтесь к нему по MAC (для этого в списке найденных роутеров надо щелкнуть по МАС а не по IP адресу роутера).

26 мыслей о “MIKROTIK уведомления о новых узлах (DHCP LEASE)”

  1. Статья очень помогла. Не понравился костыль с фаерволом.
    Использую GSM модем для оповещения о подключении.
    Новую неизвестную запись делаю статической и вношу в список unknown. В фаерволе блокируется весь трафик для клиентов из списка unknown.

    :if ($leaseBound = 1) do={
    /ip dhcp-server lease;
    :foreach i in=[find dynamic=yes] do={
    :local dhcpip
    :set dhcpip [ get $i address ];
    :local clientid
    :set clientid [get $i host-name];

    :if ($leaseActIP = $dhcpip) do={
    :local comment “New IP”
    :set comment ( $comment . “: ” . $dhcpip . “: ” . $clientid);
    /log error $comment;
    /ip dhcp-server lease make-static numbers=$i
    /ip dhcp-server lease set numbers=$i address-lists=unknown
    /tool sms send usb1 phone-number=+79208888888 channel=0 message=$comment

    }
    }
    }

    1. Хороший вариант. Спасибо.
      Скрипт я вытащил “из контекста”, поэтому некоторые некрасивости получились, но он работает. Я оставляю записи динамическими для того чтобы “не напрягать зрения” при просмотре списка Leases и даже если я пропустил SMS я вижу в списке кого я проработал (могу сделать Static, но оставить в списке lock, могу просто удалить из обоих списков, чтобы адрес не занимал).
      Можно состыковать со статьей: “Защита” сети от несанкционированных подключений (MIKROTIK), чтобы полнее защититься от таких подключений.

  2. скрипт полностью не работает. Отрабатывает первая часть добавляет один адрес. При следующей работе скрипта больше не добавляет записи в таблицу фаервола.

    1. Ну значит не полностью… Попробуйте добавить брекпоинт в виде /log warning “OK”, чтобы разобраться на каком этапе у вас возникает исключение.

  3. Господа, не поможете со скриптом для выдачи одного статического адреса из пула dhcp для конкретного устройства с известным именем, например server.

    1. У Микротика есть понятие статический Lease. Не видя вашей задачи не ясно какое решение предложить. Например, если вам нужно чтобы определенный клиент всегда получал один и тот же IP, то достаточно просто подключить его к сети, дождаться выделения ему IP, после чего, зайти в ip \ dhcp server \ leases открыть нужную запись и нажать Make Static. Другой вариант можно создать статическую запись заранее, указав MAC и нужный IP. Так же если указать другой IP в статической записи, то при следующем переподключении (lease update) клиент получит новый указанный IP (это на тот случай если не нравится какой IP был выделен из пула автоматом). Как видите скрип тут не уместен. Если ваша задача сложнее, то опишите ее подробнее.

  4. Задача состоит в том, что есть несколько устройств, получающих адреса по dhcp от микротика через неуправляемый свич. Одно из устройств с host-name server должно получать всегда адрес с двоечкой на конце х.х.х.2. Сетей таких много и постоянно добавляются. Мак адреса соответственно разные у каждого устройства с именем server в другом филиале.

    1. Задача экзотическая, единственное что может сделать скрипт: сменить IP уже выделенный IP на другой по имени записи, что даст при повторном подключении нужный вам результат. События (скрипт) позволяющее переопределить выделяемый IP в Микротике нет.

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

    1. Отключив порт микротика вы уберете линк с неуправляемым коммутатором, а не с server. Но если интересно то так: /interface ethernet disable [find name="ether9-slave-local"]. В DHCP скрипте есть глобальные переменные, которые предопределены для скрипта (события):
      leaseServerName – Имя DHCP сервера (микротик);
      leaseActMAC – MAC клиента;
      leaseActIP – Назначенный клиенту IP.

      Вставьте в скрипт следующее:
      /log info "dhcp script";
      /log info $leaseBound;
      /log info $leaseServerName;
      /log info $leaseActMAC;
      /log info $leaseActIP;

      И смотрите лог при подключении клиента.

  6. Вообщем получилось вот так
    :local c;
    :local m;
    :set c [/ip dhcp-server lease get value-name=address from [find leaseActIP=server]];
    :set m [/ip dhcp-server leaseget value-name=mac-address from [find leaseActMAC=server]];
    /ip dhcp-server lease add address=10.х.х.2 client-id=$c mac-address=$m server=example;
    /log info “dhcp script”;
    /log info $leaseBound;
    /log info $leaseServerName;
    /log info $leaseActMAC;
    /log info $leaseActIP;

    При этом должна появится статическая запись в списке dhcp-server lease, но ее нет. Скрипты пишу впервые. Возможно проблема с синтаксисом.

  7. А для ревнивых мужей можно что то подобное реализовать ?)))
    типа приходит жена домой ее тел регистрируется в сети а микротик сразу кидает смс и когда исчезает из сети тоже кидает смс…или так типа подходит нашальнике к офису а микротик весело начинает пикать при регистрации телефона нашальнике в сети ))) заранее благодарю , крайне нуждаюсь))

    1. Да можно. Сделайте lease-time (время аренды IP) не большим 5-10 минут, в зависимости от необходимой точности. В начале скрипта добавьте /log info “dhcp event” и смотрите что происходит с переменными при выделении IP, повторном выделении и завершении аренды.

      1. а не могли бы вы мне помочь на возмездной основе , нужно чтобы при появлении.исчезновении мака в сети микротик пикал (1вареант) и например как 2й вареант просто на почту уведамление или в телегу или смс .

  8. Господа, не поможете у меня проблема несколько mac адресов забирает все ip адреса которые может раздать dhcp сервер , я их блокирую но заново появляется новые mac адреса тоже самый цикл повторяется вот так банит dhcp

    1. Нужно сделать статичную запись для проблемного узла и поставить 2 галочки:
      1. Usr Src. MAC address
      2. Block Access (если вам нужно полностью залочить клиента)

    1. Если вы поставили галочку “Use Src. MAC” то у вас в принципе не может выделится 2 IP на один MAC. Проверьте внимательно.

  9. Добрый день!
    У меня Mikrotik выдает IP по DHCP, адреса получаем с сервера по Radius.
    В случае падения Radius на сервере, клиент не может получить IP.
    Через Netwatch реализовал проверку IP сервера. В случае не доступности, рапускаем /ip dhcp-server lease make-static [/ip dhcp-server lease find]
    НО есть минусы:
    1) Сервер может быть в сети, а Radius не запущен. И клиенты не могут получить IP.
    2) Netwatch стоит проверка в 5секунд. Довольно часто бывает, что в эти 5секунд(между падением сервера и назначением всем статических адресов), у когота закончилось время аренды. И он не получит адрес,пока не поднимется Radius на сервере.
    Подскажите как реализовать:
    Проверку ответов от Radius, и если нет ответа,выдавать клиенты IP, который выдавался ему ранее
    ?
    Возможно это можно реализовать через скрипт, который будет запоминать все выданные IP+MAC. И в случае появления адреса 0.0.0.0 в IP-DHCP server-Leases, будет выдавать всем адреса статически?

    1. Mikrotik вряд ли вам поможет с тем что у вас происходит за пределами его “владений”. Скрипты DHCP выполняются асинхронно и вы не сможете им управлять. Попробуйте найти watchdog со стороны вашего RADIUS сервера и при помощи Mikrotik API управляйте им. Или же не дожидаясь падения в реальном времени, при выделении IP RADIUSом, сразу его переносите в Mikrotik при помощи того же API, т.е. формируйте backup схему в автомате. Думаю, это самый перспективный вариант.

  10. Маленько некропост, но всё же не удержусь. Несколько загадочно выглядит код в статье.
    ….
    :foreach i in=[find dynamic=yes] do={
    :local dhcpip
    :set dhcpip [ get $i address ];
    :if ($leaseActIP = $dhcpip) do={
    ….
    Зачем делать цикл по всем записям и для каждой проверять условие, если можно сразу их отфильтровать?
    ….
    :foreach i in=[find dynamic=yes address=$leaseActIP] do={
    ….
    Не менее загадочно выглядят размазанные по нескольким строкам объявления локальных переменных, скажем тот же
    ….
    :local dhcpip
    :set dhcpip [ get $i address ];
    ….
    легко переписывается в одну строчку:
    ….
    :local dhcpip [ get $i address ];
    ….
    и тд и тп.

    Ещё более загадочно выглядит вот этот фрагмент:
    ….
    :local comment “New IP”
    :set comment ( $comment . “: ” . $dhcpip . “: ” . $clientid);
    ….

    Почему не
    ….
    :local comment (“New IP: ” . $dhcpip . “: ” . $clientid);
    ….
    или даже
    ….
    :local comment “New IP: $dhcpip : $clientid”;
    ….
    ?

    1. Скрипт – вырезка из рабочего скрипта. Оптимизацией заниматься нужды нет, т.к. нужно было просто показать базовые вещи.

  11. Добрый день, у меня в настройках DHCP сервера нет параметра: Lease Script. Есть только -Alerts!
    https://i86.fastpic.ru/big/2019/0905/10/449a2550d725930adf158ea2283fec10.jpg
    Устройство RB4011, прошивка 6,45,5

    Можно ли вместо Вашего скрипта оповещения смс использовать оповещение на почту gmail?
    вот к примеру уведемление о новой прошивке
    :local emailAddress “**********@gmail.com”

    /system package update
    set channel=stable
    check-for-updates

    :if ([get installed-version] != [get latest-version]) do={
    :log info “A new software update is available. Sending email…”

    /tool e-mail send to=”$emailAddress” subject=”[Mikrotik] Software Update Available” body=”A new update is available for your MikroTik device”
    }

    В микротике новичек, если можно поледовательность действий установки с уведомлением на почту.
    Спасибо

    1. Script находится в конкретном DHCP сервере, висящем на конкретном интерфейсе. Список этих серверов здесь: IP / DHCP Server / DHCP (вкладка Alerts не нужна).

  12. Правильно ли я понял, скрипт нужно прописать вот тут
    https://i90.fastpic.ru/big/2019/0908/88/3fe07f575e500f4bca7f618dad9c1088.jpg

    Выглядить он будет так (уведомление на почту)
    Я заменил вот эту строку
    /tool fetch host=”mysite.ru” keep-result=no mode=http address=”mysite.ru” src-path=”/sms.php?

    на вот эту
    /tool e-mail send to=”$emailAddress”

    Измененный скрипт
    :if ($leaseBound = 1) do={
    /ip dhcp-server lease;
    :foreach i in=[find dynamic=yes] do={
    :local dhcpip
    :set dhcpip [ get $i address ];
    :local clientid
    :set clientid [get $i host-name];

    :if ($leaseActIP = $dhcpip) do={
    :local comment “New IP”
    :set comment ( $comment . “: ” . $dhcpip . “: ” . $clientid);
    /log error $comment;

    /ip firewall address-list;
    :local recfound 0;
    :foreach lrec in=[find list=lock] do={
    :local checkip “”
    :set checkip [ get $lrec mac-address ];
    :if ($checkip = $dhcpip) do={
    :set recfound 1;
    }
    }

    :if ($recfound = 0) do={
    add list=lock address=$dhcpip
    /tool e-mail send to=”$emailAddress”text=IP:$leaseActIP;$leaseActMAC;SRV:$leaseServerName;HN:$clientid”
    }

    }
    }
    }

    спасибо

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.