Функции управления доступом в Интернет через /ip kid control
Добавлено: 06 июл 2022, 11:45
Приветствую всех любителей скриптов !
Конечно, заблокировать доступ в Интернет определенному пользователю можно по разному, например так:
Восстановить доступ можно удалением или отключением данного правила.
/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 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")}
}
}