Функции управления доступом в Интернет через /ip kid control

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Приветствую всех любителей скриптов !

Конечно, заблокировать доступ в Интернет определенному пользователю можно по разному, например так:

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

/ip firewall filter add chain=forward scr-address=192.168.0.X action=drop
Восстановить доступ можно удалением или отключением данного правила.

/ip firewall filter remove [/ip firewall filter find scr-address=192.168.0.Х]


Мне же захотелось сделать тоже самое через инструмент /ip kid control, появившийся в версии ROS 6.41 (если не ошибаюсь) и далее.

Чтобы не пудрить мозг пользователю были созданы соответствующие функции, которыми можно управлять из терминала или собственных скриптов. При этом было создано две функции: FuncKidsControl и FuncKidsRule. Первая из них может управлять только готовыми правилами /ip kid-control, созданными пользователем ранее (включать/выключать, ставить на паузу/снимать с паузы). Функция FuncKidsRule способна добавлять пользователя, устройство и блокирующее правило в соответствующие вкладки инструмента kid-control. При этом её работа основана на том, что при добавлении пользователя и его устройства с произвольными дефолтными установками времени работы при постановке "на pause" пользователю просто блокируется доступ в интернет на всё время паузы (так работает /ip kid-control).

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

Это первая версия этих функций. Замечания и критика приветствуются.

update 07/07/2022 - добавлена возможность в функции FuncKidsRule указывать не только mac-address или ip-address, но и вместо них host-name блокируемого/разблокируемого устройства.

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

# Функции блокировки интернета пользователя через /ip kid-control

# --------------------------------------------------------------------------
# FuncKidsControl by Sertik 07/07/2022
# --------------------------------------------------------------------------

# - $1 - kids name (/ip kid-control find name=$1)
# - $2 - enable/disable/pause/resume

# example: [$FuncKidsControl User enable]

global FuncKidsControl do={
    :if ([:typeof $0]="lookup") do={
:if ([:len [/ip kid-control find name=$1]]>0) do={
    :if (($2="enable") or ($2="disable") or ($2="resume") or ($2="pause")) do={
               [[:parse "/ip kid-control $2 $1"]]
              :log warning "Function $0 set rule kid control";
              :return ("Done"." kids rule $1 is"." $2")
       } else={:return  "ERROR function $0 bad parametr 2 <$2>"}
     } else={:return "ERROR function $0 parametr 1\nNo find kid`s name <$1>"}
   }
}


# --------------------------------------------------------------------------
# FuncKidsRule by Sertik 07/07/2022
# --------------------------------------------------------------------------

# - $1 - kids name (/ip kid-control find name=$1)
# - $2 - mac-address or ip address or host-name (from /ip dhcp-server lease) device kid`s name $1
# - $3 - on/off (in case "on" - parameter can be omitted)

# if ($3=off and user is in the database kid-control - then add /ip kid-control user $1 and device with mac=$2 (or ip=$2) and block him (set "pause") wifi for $1 user is blocked
# if $3=on or nothing then remove user name $1 and his device with mac-address=$2 (or ip=$2)  -  that is, allow it to connect via wifi (WIFI OK)

# examples:
:put [$FuncKidsRule Lenovo F8:A2:D6:D7:A9:75 off] 
:put [$FuncKidsRule Sergo 192.168.0.100 on]
:put [$FuncKidsRule Sertik android-36979def777cba33 off]

global FuncKidsRule do={
     global FuncKidsControl
    :if ([:typeof $0]="lookup") do={

    :if (($3="on") or ([:len $3]=0)) do={:set $3 "resume"}
    :if ($3="off") do={:set $3 "pause"}

:local McIp 
   :do {
   :set McIp [:toip $2]; :if ([:typeof $McIp]="ip") do={:set $2 $McIp}
   } on-error={}


# если в качестве параметра 2 передан ip адрес устройства

:if ([:typeof $2]="ip") do={
     :if (([:len [/ip arp find address=$2]]!=0) or ([:len [/ip  dhcp-server lease find address=$2]]!=0)) do={
     :local McArp [/ip arp get [/ip arp find address=$2] mac-address]
#     :put $McArp
     :if ([:len $McArp]!=0) do={:set $2; :set $2 $McArp} else={
     :local McDhcp [/ip dhcp-server lease get [/ip  dhcp-server lease find address=$2] mac-address]
#     :put $McDhcp
     :if ([:len $McDhcp]!=0) do={:set $2; :set $2 $McDhcp}}
         } else={:return ("ERROR function $0 parametr 2 ip not found")}
     }

# если в $2 не мак-адресс, а active-hostname, то найдем его мак-адрес

:if ($2~"[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]") do={} else={
:do {:set $2 [/ip dhcp-server lease get [/ip  dhcp-server lease find host-name=$2] mac-address]
 } on-error={:return ("ERROR function $0 parametr 2 host-name not found")}
}

# если задано восстановить доступ, а правила в /kid control не найдены

:if (([:len [/ip kid-control find name=$1]]=0) && ([:len [/ip kid-control device find mac-address=$2]]=0) && ($3="resume")) do={
:return "ERROR Function $0 not find rule kid control name $1 and device $2"}

# если профиль и мак-адрес есть в базе kid-control и стоят на паузе, то удаляем их восстанавливая доступ пользователя к Интернет

:if (([:len [/ip kid-control find name=$1]]>0) && ([:len [/ip kid-control device find mac-address=$2]]>0) && ($3="resume")) do={

:do {
      /ip kid-control remove $1
      /ip kid-control device remove [find mac-address=$2]
} on-error {}
      :log warning "Function $0 removed rule kid control name <$1>";
      :return ("Done"." kids rule $1 $McIp Mac $2 is removed")}
   
:if (([:len [/ip kid-control find name=$1]]>0) && ([:len [/ip kid-control device find mac-address=$2]]>0) && ($3="pause")) do={
:return "Done function $0 rule kid control name $1 device Mac $2 already added"}

:if (([:len [/ip kid-control find name=$1]]=0) && ($3="pause")) do={
# если же задано "pause", то добавляем правила блокирующие интернет пользователю
    :do {
    /ip kid-control add name=$1
    :delay 20ms;
    /ip kid-control device add name=("$[:pick $0 1 [:len $0]]_"."$[/system clock get time]") user=$1 mac-address=$2
    :delay 20ms;
    } on-error={:return "Done function $0 rule kid control already added"}

# и сбрасываем его активные соединения

:local IpArp
:foreach i in=[/ip arp find mac-address=$2] do={
    :set IpArp [/ip arp get $i address]
    :if ([:typeof $IpArp]=ip) do={[/ ip firewall connection remove [find src-address $IpArp]]}}

:local IpDhcp
:foreach i in=[/ip  dhcp-server lease find mac-address=$2] do={
    :set IpDhcp [ip dhcp-server lease get $i address]
    :if ([:typeof $IpDhcp]=ip) do={[/ ip firewall connection remove [find src-address $IpDhcp]]}}

     :set McIp (" "."$McIp"." ")
     :return ("$[$FuncKidsControl $1 $3] "."\n"."device"."$McIp"."Mac $2")}
   }
}
Последний раз редактировалось Sertik 07 июл 2022, 13:36, всего редактировалось 7 раз.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
navigator
Сообщения: 2
Зарегистрирован: 06 июл 2022, 14:14

Ввиду того, что андроид-смартфоны часто меняют mac-адрес своей сетевой карты и тем более дети сейчас продвинутые с гаджетами сами меняют мас-адрес, что приводит к выдаче dhcp-сервером нового ip-адреса предлагаю добавить поиск девайса по host-name, т.к. он не меняется.


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Спасибо, подумаю над Вашим предложением.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Сделано. Теперь в функции FuncKidsRule можно указывать host-name вместо МАК или IP-адресов.
Изменения внесены в код.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить