Как узнать какой пользователь воткнул кабел в роутер лан?

Хорошая идея. Может и кому-то понадобится это интересное решение. Есть 50 абонентов подключенные через простые не управляемые swich-и. В роли сервера у нас Микротик. Всем раздается статический пул dhcp адресов, соответсвенно фиксированными мак адресами. Возникает проблема, когда кто то по неосторожности путает порты wan с lan на роутере. Так вот, немного уйдем от темы. При личных наблюдениях данной проблемы я заметил такой нюанс, что 99,9% роутеров всех производителей мак адреса wan и lan портов отличаются последние две, а от начала до последних двух символов совпадают. И я решил написать скрипт, который будет уведомлять о том, кто именно спутал порты.

вешаем на локальный интерфейс микротика dhcp-client, чтоб изнутри наш локальный интерфейс получал несанциональный ип по ошибке пользователя.
/ip dhcp-client add interface="Local" use-peer-dns="no" add-default-route="no" script="
и поехали..

:local tturlASH "https://api.telegram.org/botхххххххх:хххххххххх/sendmessage\?chat_id=хххххх&text=";
:local ttmessage "obnarujen DHCP ip na lokalke";
:local a;
:local dhcpgw;
:local arpall;
:local fmac;
:local macfound;
:local b;
:local g;
:local h;
:local i;
:local c;
:foreach a in=[/ip dhcp-client find interface=Local] do={:set dhcpgw [/ip dhcp-client get $a gateway];/ping $dhcpgw count=5};
:foreach arpall in=[/ip arp find where address=$dhcpgw] do={:set fmac [/ip arp get $arpall mac-address];:set fmac [:pick $fmac 0 ([:len $fmac]-2)]};

:foreach macfound in=[/ip dhcp-server lease find mac-address~"$fmac"] do={
/ip dhcp-server lease set $macfound comment="dhcpfound";
:foreach b in=[/ip dhcp-server lease find comment="dhcpfound"] do={
:set g [/ip dhcp-server lease get $b address];
:foreach h in=[/ip firewall address-list find address="$g"] do={
:if ($h != "") do={
:set i [/ip firewall address-list get $h comment];
/tool fetch url="$tturlASH $ttmessage %0A%0ADHCP SERVER IP  --->  $dhcpgw %0A%0AADDRESS LIST --->   $i%0A%0ACLIENT IP  --->   $g" keep-result=no;
} else={
:log warning message="ip not address list";
}
}
}

} else={:log warning message="not find mac-address in leases..."};

подробнее о функциях -->

ищем все что есть в Local, заносим в переменную dhcpgw шлюз незванного ип, далее пингуем, чтоб было гарантированно что он динамически отобразится в арп.
:foreach a in=[/ip dhcp-client find interface=Local] do={:set dhcpgw [/ip dhcp-client get $a gateway];/ping $dhcpgw count=5};


далее узнаем узнаем мак адрес и обрезаем последние два символа.
:foreach arpall in=[/ip arp find where address=$dhcpgw] do={:set fmac [/ip arp get $arpall mac-address];:set fmac [:pick $fmac 0 ([:len $fmac]-2)]};


далее ищем совпадения в lease с параметром ~ так как у нас обрезаны последние два символа.
в найденный результат заносим комент - dhcpfound, и извлекаем оттудо ип адрес уже пользовареля. Что и требовалось доказать!
:foreach macfound in=[/ip dhcp-server lease find mac-address~"$fmac"] do={
/ip dhcp-server lease set $macfound comment="dhcpfound";
:set g [/ip dhcp-server lease get $b address];


но так быстро...

далее скрипт должен найти совпадение в address-list по найденному ип, чтоб найти комент записи в котором указаны инициалы пользователя, для подготовки отчета на телеграм.

помогите исправить ошибки которые я допустил. у меня не работают комады else={ ,
и еще не могу понять как правильно сравнивать данные внутри переменных .

например с посредством :if ($h != "") я хотел бы указать то, что а вдруг мак адрес найден , а вот пользователь в адрес листе не найден, и то что если он не найден, не надо продолжать рабору скрипта, а надо с посредсвом else={ поменять подход и поиски в другом направлении, так как неккоторые пользоварели лежат в queue
  • Вопрос задан
  • 215 просмотров
Решения вопроса 1
icCE
@icCE
youtube.com/channel/UC66N_jRyZiotlmV95QPBZfA
Я думаю , что по предыдущиму вопросу, тут вопрос сам по себе отпал, но все равно отпишу.

:local varIP  192.168.240.253
:if ([:len [/ip firewall address-list find address=$varIP]]>"0" ) do={
:log info ("$varIP: found");
} else={
:log info ("$varIP:  not found");
}


P.S. Конечно не мое собачье дело, но я бы рекомендовал все же приобрести управляемые коммутаторы l2 (не web smart ) и использовать их функционал , для таких целей.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы