Генерация белого списка WIFI-клиентов

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Приветствую!

Столкнулся с проблемой несанкционированного подключения к своим беспроводным сетям.
Со временем надоело вручную блокировать каждое вновь подключившееся неизвестное устройство.
Было решено попытаться автоматизировать процесс блокировки.

Суть идеи: На основе списка DHCP-клиентов генерИтся список разрешенных WIFI-клиентов. Всем остальным подключение по WIFI запрещено.

Задумка реализована под CAPsMAN.
При запуске скрипта, из списка зарегистрированных DHCP-Server->Leases производится выборка только тех, в комментариях у которых присутствует слово: "wifi". Из этих записей формируется белый список MAC-адресов, который складывается в CAPsMAN->Access List. В конце добавляется запрещающее правило.
С этого момента доступ к WIFI-сети имеют только прописанные в белом списке клиенты.
Теперь все желающие, в том числе знающие пароль от WIFI-сети, но не прописанные в белом списке WIFI-клиентов, не имеют возможности подключиться к сети без участия администратора.

Для того, чтобы прописать нового клиента, необходимо вручную зарегистрировать его в списке DHCP-Server->Leases, в комментарии указать "wifi" и запустить скрипт для перегенерации белого списка.

Код: Выделить всё




# Script for blocking unknown wifi clients by drPioneer
# https://forummikrotik.ru/viewtopic.php?p=82674#p82674
# tested on ROS 6.49.10
# updated 2021/12/09

:if ([:len [ /ip dhcp-server lease find; ]] = 0) do={ :put ("Wifi clients not found in DHCP list."); }
:if ([:len [ /caps access-list find action=reject; ]] > 0) do={ /caps access-list remove [ /caps access-list find action=reject ]; }
:foreach wlanClients in=[ /ip dhcp-server lease find comment~"wifi"] do={
    :local wlanMAC    ([ /ip dhcp-server lease get $wlanClients mac-address; ]);
    :local wlanCommet ([ /ip dhcp-server lease get $wlanClients comment; ]);
    :local counter 0;
    :foreach accessList in=[ /caps access-list find; ] do={
        :local accessMAC ([ /caps access-list get $accessList mac-address; ]);
        :if ($wlanMAC = $accessMAC) do={ :set counter ($counter + 1); }
    } 
    :if (counter = 0) do={ /caps access-list add mac-address=$wlanMAC comment=$wlanCommet action=accept; }
}
/caps access-list add action=reject;


Усовершенствования скрипта только приветствуются .


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Версия скрипта под WifiWave2 (ROS7.xx):

Код: Выделить всё




# Script for blocking unknown wifi clients by drPioneer
# https://forummikrotik.ru/viewtopic.php?p=91303#p91303
# tested on ROS 7.12 (wifiwave2)
# updated 2023/11/11

:if ([:len [/ip dhcp-server lease find]]=0) do={:put ("Wifi clients not found in DHCP list.")}
:if ([:len [/interface wifiwave2 access-list find action=reject]]>0) do={/interface wifiwave2 access-list remove [ /interface wifiwave2 access-list find action=reject]}
:foreach wlanClients in=[/ip dhcp-server lease find comment~"wifi"] do={
    :local wlanMAC     ([/ip dhcp-server lease get $wlanClients mac-address]);
    :local wlanCommet  ([/ip dhcp-server lease get $wlanClients comment]);
    :local counter 0;
    :foreach accessList in=[/interface wifiwave2 access-list find] do={
        :local accessMAC  ([/interface wifiwave2 access-list get $accessList mac-address]);
        :if ($wlanMAC=$accessMAC) do={:set counter ($counter+1)}
    } 
    :if (counter=0) do={/interface wifiwave2 access-list add mac-address=$wlanMAC comment=$wlanCommet action=accept}
}
/interface wifiwave2 access-list add action=reject;




Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Универсальная версия скрипта, работающая и под ROS 6.49.10 (CAPsMAN) и под ROS 7.12 (WifiWave2):

Код: Выделить всё




# Script for blocking unknown wifi clients by drPioneer
# https://forummikrotik.ru/viewtopic.php?p=91303#p91303
# tested on ROS 6.49.10 (capsman) & ROS 7.12 (wifiwave2)
# updated 2024/01/05

:do {
    # --------------------------------------------------------------------------------- # wifiwave2 package search function
    :local AvailableWifiwave2 do={
        :local counter 0;
        :local package "";
        :do {
            :set package ([sys pack pri as-value]->$counter->"name");
            :if ($package="wifiwave2") do={:return "/interface wifiwave2"}
            :set counter ($counter+1);
        } while ([:len $package]!=0);
        :return "/caps";
    }

    # --------------------------------------------------------------------------------- # character replacement function
    :local ReplacingChars do={
        :if ([:typeof $1]!="str" or [:len $1]=0) do={:return ""}
        :local source {"\22"};
        :local destin {"\27"};
        :local result "";
        :for i from=0 to=([:len $1]-1) do={
            :local char [:pick $1 $i];
            :local index [:find $source $char];
            :if ($index>-1) do={:set char [:pick $destin $index]};
            :set result "$result$char";
        }
        :return $result;
    }

    # ================================================================================= # main body of the script ========================
    :local counter 0;
    :local interface [$AvailableWifiwave2];
    :local reject [[:parse "$interface access-list find action=reject"]];
    :if ([:len $reject]!=0) do={[[:parse "$interface access-list remove $reject"]]}
    :if ([:len [/ip dhcp-server lease find]]=0) do={:put ("Wifi clients not found in DHCP list.")}
    :put ("List of allowed wifi clients:");
    :foreach wlanClients in=[/ip dhcp-server lease find comment~"wifi"] do={
        :local presence false;
        :local wlanMAC ([/ip dhcp-server lease get $wlanClients mac-address]);
        :local wlanComment ([$ReplacingChars [/ip dhcp-server lease get $wlanClients comment]]);
        :set counter ($counter+1);
        :put ("$counter $wlanMAC $wlanComment");
        :foreach accessList in=[[:parse "$interface access-list find"]] do={
            :local accessMAC ([[:parse "$interface access-list get $accessList mac-address"]]);
            :if ($wlanMAC=$accessMAC) do={:set presence true}
        }
        :if (!$presence) do={[[:parse "$interface access-list add mac-address=$wlanMAC comment=\"$wlanComment\" action=accept"]]}
    }
    [[:parse "$interface access-list add action=reject"]];
} on-error={                                                                            # when emergency break script ->
    :put "Script error something didn't work when generating a list of allowed WIFI clients";
}


Последний раз редактировалось drpioneer 05 янв 2024, 02:33, всего редактировалось 1 раз.


Tpr
Сообщения: 1
Зарегистрирован: 29 дек 2023, 18:14

Так вот же уже есть https://t.me/mikRobot_RU/21
там управление ДХЦП клиентами целиком. Интерактивное из телеги.


Ответить