Mikrotik dhcp lease script

Mikrotik dhcp lease script

Возникла задача получать уведомления при подключении новых (не санкционированных) клиентов к сети и автоматически добавлять их в списки блокировки (adress-list=lock). Все зарегистрированные клиенты, у меня, имеют статическую запись в dhcp leases. Новые клиенты автоматически регистрируются как динамические, поэтому нам надо при очередной выдаче IP проверить является ли запись статической или динамической. В настройках 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)”

Спасибо, за статью пригодилась 🙂

Статья очень помогла. Не понравился костыль с фаерволом.
Использую 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

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

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

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

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

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

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

Читайте также:  Volume label что это

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

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

Отключив порт микротика вы уберете линк с неуправляемым коммутатором, а не с 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;
И смотрите лог при подключении клиента.

Вообщем получилось вот так
: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, но ее нет. Скрипты пишу впервые. Возможно проблема с синтаксисом.

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

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

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

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

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

да я таки делаю, mac блокируется
но появляется новые
я штук 200 сделал так все равно выходить

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

Добрый день!
У меня 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, будет выдавать всем адреса статически?

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

Маленько некропост, но всё же не удержусь. Несколько загадочно выглядит код в статье.
….
: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);
….

Читайте также:  Таймер на микросхеме ne555

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

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

Добрый день, у меня в настройках 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”
>

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

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

Выглядить он будет так (уведомление на почту)
Я заменил вот эту строку
/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”
>

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

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

Войти

Скрипт в dhcp-server

Я уже писал, что не слишком люблю применять шифрование в домашних беспроводных сетях. Мне жалко ресурсов на подобные телодвижения. В отличие от продакшн-сегмента, где применение шифрования оправдано и даже необходимо. Но и ограничивать пул своей локалки по числу своих устройств я не желаю. Поэтому надо ограничить гостей до предела и пусть сидят в сети и не жужжат. А тут я по случаю обнаружил просто расчудесную фишку в RouterOs. Если внимательно посмотреть в настройки dhcp-server, то там обнаруживается интересный пункт — LeaseScript . Насколько я понимаю, скрипт, помещенный в данное поле будет срабатывать каждый раз, когда сервер будет выдавать новый адрес. Ну что же, приступим к проверке моих предположений.
Смоделируем такую ситуацию.
1. Имеем открытую сеть WiFi с дефолтной аунтефикацией (не задействуя access-list для контроля доступа)
2. Правила маршрутизатора предусматривают несколько уровней доступа к интернету, локальной сети и с различными скоростными режимами и приоритетами с использование адресных листов фаервола. О всех подобных ограничения в сети написано столько, что не хочется повторятся никак.
3. dhcp-server имеет lease time равный 1 дню.
4. Устройства, которые принадлежат мне, давно закреплены за адресами локалки с помощью make static
Что хотелось бы:
1. Обрабатывать все подключающиеся устройства в момент выдачи им адресов локальной сети, не трогая мои устройства.
2. Пометить те адреса, которые мы уже обработали скриптом.
3. Внести эти обработанные адреса в соответствующий адресный лист фаервола.
4. В моей сети не один dhcp-server, но обработать надо адреса, которые выдал лишь один строго определенный сервер.
Родился вот такой набросок, который уже трое суток висит в сети и исправно делает все, что я наметил:

<
:local t [/system clock get time];
:local d [/system clock get date];
:foreach i in=[/ip dhcp-server lease find] do= <
:if ([/ip dhcp-server lease get $i status]="bound" && [/ip dhcp-server lease get $i comment]="" && [/ip dhcp-server lease get $i server]="DHCP") do= <
:local g [("Guest" . "-" . $d . "-" . $t)]
/ip dhcp-server lease set $i comment=$g;
/ip firewall address-list add address=[/ip dhcp-server lease get $i address] list="Drop" timeout=1d dynamic=yes

Первые две переменные лишь для идентификации, дата и время срабатывания.
Далее ищем совпадения трех параметров, статус должен быть "bound", комментарий должен отсутствовать (это отличает необработанные адреса от обработанных) и сервер выдачи адресов должен быть определенным. Следующая переменная определяет комментарий, который присвоится этому адресу, в него входят и дата и время выдачи адреса. Далее адрес добавляется в адрес-лист фаервола для последующей обработки маршрутизатором. Желающие могут организовать извещение по SMS или по почте и любые другие действия.

Написал параллельно маленький скриптик, собирающий в массив все МАС-адреса в Leases , которые мы сделали статическими. Применения пока не вижу, но просто стало интересно. Значения в терминале выводятся в столбик, что не в пример легче для восприятия:

<
:local y [toarray ""];
:foreach i in=[/ip dhcp-server lease find] do= <
:if ([/ip dhcp-server lease get $i dynamic]=false) do= <
:local p [/ip dhcp-server lease get $i address];
:local o [/ip dhcp-server lease get $i mac-address];
:local k [/ip dhcp-server lease get $i comment];
:set y [($y, "
$p __ $o __ $k")];
>
>
:put $y;
>

Читайте также:  Как установить файлы xap на windows 10

Для наглядности выводится сначала IP-адрес, потом МАС и потом комментарий.

Приветствую, Хабр! В связи с плохим качеством линии меня попросили настроить автоматическое переключение на резервный канал. Для этой цели предоставили роутер MikroTik RB 951Ui.

Думал, что проблем не возникнет… Всего-то настроить проверку канала и маршруты. Но, к сожалению, оба провайдера выдают IP динамически. Сначала я попробовал подставить в маршрут название интерфейса, но пинг не проходил. Прочитав несколько статей, включая зарубежные сайты, но не нашел решения проблемы, которое мне подошло бы. Пришлось знакомится с RouterOS по ближе, а в частности с созданием скриптов…

В этой ОС можно создавать маршрут двумя способами:

  • вручную (через графический интерфейс или через терминал);
  • автоматически DHCP-клиентом.

При создании маршрута вручную не получится обновлять шлюз динамически. Для этого придется писать несколько достаточно больших скриптов и добавлять множество проверок. При их написании заметил, что в RouterОS проблематично заставить работать сложные скрипты. Очень тяжело отследить логику работы, хотя использовались логи и переменные для проверки. Скрипты были написаны, но работали нестабильно, несмотря на оптимизацию кода и добавления проверок. Когда количество проверок начало расти в геометрической прогрессии и многократная оптимизация логической схемы ненамного улучшила ситуацию — я решил отказаться от этого варианта и попробовать использовать в скрипте опцию автоматического создания маршрута DHCP- клиентом.

Для нужного интерфейса в настройках DHCP-клиента устанавливается опция автоматического создания маршрута по умолчанию.

Итак, скрипт будет работать по такому алгоритму:

Объяснение алгоритма

Для каждого интерфейса будет запущена копия скрипта. Каждая копия будет автономно создавать маршрут по умолчанию. Приоритет маршрута будет зависеть от distance. То есть, когда «упадет» соединение на маршруте с Distance 10 произойдет переключение на 11. Благодаря этому переключение получается бесшовным.

Для начала скрипт пингует выбранный хост в интернете по маршруту по умолчанию. Если пинг меньше чем ($PingCount-$Margin) (Margin — задается погрешность для контроля точности), тогда пингуем по тестовому маршруту для проверки «живое» ли соединение. В случае негативного результата проверяем маршрут и наличие проблем с настройками:

  • перегружаем интерфейс каждые $TimeToWait раз (снижаем нагрузку на процессор);
  • ждем загрузки интерфейса;
  • проверяем есть ли настройки DHCP — клиента для данного интерфейса, в противном случае создаем;
  • проверяем статус DHCP клиента (иногда RouterOS может «подсунуть свинью»);
  • ждем получение DHCP lease;
  • добавляем к значению $CurrentGateway нужный интерфейс;
  • проверяем есть ли тестовый маршрут;
  • проверяем правильный ли в тестовом маршруте шлюз.

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

  • PingCount — количество посылаемых icmp запросов (также можно добавить еще одну переменную для определения количества посылаемых запросов по тестовому маршруту и на шлюз провайдера, то есть уменьшится количество запросов и соответственно увеличится скорость работы скрипта);
  • Margin — коэффициент нужен для задания погрешности. Например, при $Margin=1 цикл проверки маршрутов запускается только тогда, когда пропадет больше одного пакета, что немаловажно в моей ситуации;
  • TimeToWait при ожидании соединения интерфейс перегружается каждый $TimeToWait раз (это нужно для того, чтобы снять нагрузку на процессор)

Подготовительная настройка

Описывать стандартные настройки роутера я не буду по двум причинам: во-первых, эта тема не раз поднималась в интернете, в том числе на Хабре, во-вторых, сети отличаются своей конфигурацией. Так как работа скрипта затрагивает только маршруты по умолчанию и настройки DHCP клиента, думаю у вас не возникнет трудностей при адаптации скрипта под вашу сеть.

Для работы скрипта не нужно создавать маршруты по умолчанию — он создаст их автоматически. Единственное, нужно подобрать подходящий distance для тестовых маршрутов (можно оба с $Distance = 1) и $DistanceDefault 10 и 11 для маршрутов по умолчанию (по одному для каждого провайдера). Также не нужно создавать dhcp клиентов.

При настройке роутера я использовал SSH и Winbox (специализированная программа для настройки устройств управляемых RouterOS, работает даже в *nix с помощью Wine).

В Interfaces меняем названия двух интерфейсов, чтобы совпадали со значением переменной $Iface в скрипте (у меня isp1, isp2):

Меняем DNS адреса на google-кие:

Создаем скрипт: System → Scripts → Add и вставляем код указанный ниже:

Повторяем предыдущий шаг для второго интерфейса, только заменяем значение переменной $Iface на «isp2», также меняем $DistanceDefault на вышеуказанные значения (у меня для isp1 — 10, а для isp2 — 11 ).

Теперь нужно настроить планировщик для автоматического запуска скриптов при загрузке роутера.
System → Scheduler->

Также это можно сделать с помощью ssh или же из консоли, если возникают проблемы с кириллицей в дате:

Перегружаем…
Я думал, что возникнут проблемы с NAT при переключении маршрутов, но пока
полет нормальный. Если возникнут пишите…

Вот и все. Надеюсь, что эта статья окажется для кого-то полезной.

PS: Напоследок RouterOS подбросил еще одну задачку…

Как видите, несмотря на то, что маршрут указан верно — пинг не проходит.

Чтобы это исправить, добавил еще одну проверку (выше в коде скрипта она уже добавлена).

Ссылка на основную публикацию
Imaqliq g box прошивка android
Кнопка «Вверх» - собственный плэйлист. Зелёная (либо влево) — система Синяя (или вправо) — сетьЖелтая (или вверх) — аудио/видео Красная...
Headphone virtualization что это
Реализованные в Microsoft Windows Vista™ передовые звуковые и коммуникационные технологии обеспечивают профессиональное качество звука при воспроизведении музыки и просмотре фильмов,...
Hp 2035 индикация ошибок
Принтеры компании HP можно смело сказать являются самыми распространенными среди российских пользователей. Они заслужили уважение за бюджетные цены, высокое качество...
Iskratel innbox e70 настройка
14/06/2018 Доступ на CPE осуществляется по IP адресу 192.168.0.1. Для входа используются учетные данные Пользователь: admin Пароль: По умолчанию CPE...
Adblock detector