Чуть подправил скрипт , чтобы лишний раз не бегал по клиентским пирам, которые подключаются к этому роутеру,
а только где роутер как клиент.
Работает убойно! Proton и Warp пробивает)
Upd.: увеличил время в фильтре до 2м30с как защита от ложных срабатываний у медленных подключений.
Считаю выполнение скрипта раз в 2 минуты средним нормальным значением.
Так же добавил в скрипт закомментированную строку с возможность исключения какого-либо wg интерфейса из проверки.
Update for ROS >= 7.17: у пиров изменили свойство is-responder на responder! добавил закоментированную строку в скрипт.
Если при выполнении скрипта на этапе генерации трафика выходит ошибка в лог, то:
выполнить команду /system/device-mode/print
если получаем mode: advanced и при этом в выводе нету traffic-gen: yes,
выполняем команду
/system/device-mode/update traffic-gen=yes и следуем инструкциям.
Официальная справка по device-mode.
:global Tx
:global Rx
/interface/wireguard/peers
# Для версии ROS >= 7.17
#:foreach i in=[find where disabled=no and responder!=yes] do={
# Исключить подключение wireguard-client по имени интерфейса чтобы скрипт его никогда не трогал
#:foreach i in=[find where disabled=no and is-responder!=yes and interface!="wireguard-client"] do={
:foreach i in=[find where disabled=no and is-responder!=yes] do={
:local LocalTx [get $i tx]
:local LocalRx [get $i rx]
:local LastHandshake [get $i last-handshake]
:if (([:tostr $LastHandshake] = "") or (($LastHandshake > [:totime "2m30s"]) and ($Rx->[:tostr $i] = $LocalRx))) do={
:local rawHeader [:rndstr length=4 from=123456789abcdef]
:local EndpointAddress [get $i endpoint-address]
:local EndpointAddressIP $EndpointAddress
:local EndpointAddressIP [get $i current-endpoint-address]
:local name [get $i name]
:local wgDstPort [get $i current-endpoint-port]
:local interface [get $i interface]
# Сбрасываем исходящий порт на уровне интерфейса
/interface wireguard set $interface listen-port=0
:local srcport [/interface/wireguard/get $interface listen-port];
:log info ("WG name is $name, EndpointAddress $EndpointAddress , LastHandshake $LastHandshake, LastTx " . $Tx->[:tostr $i] . ", CurrentTx $LocalTx, LastRx " . $Rx->[:tostr $i] . ", CurrentRx $LocalRx")
:log info ("WG Currentinterface $interface, srcport $srcport, EndpointAddressIP $EndpointAddressIP, DstPort $wgDstPort")
:log info ("Generating spam for RKN")
set $i disabled=yes
/tool traffic-generator stream remove [find]
/tool traffic-generator packet-template remove [find]
:delay 1
/tool/traffic-generator/packet-template/add header-stack=mac,ip,udp,raw ip-dst=$EndpointAddressIP name=packet-template-wg raw-header=$rawHeader special-footer=no udp-dst-port=$wgDstPort udp-src-port=$srcport
:delay 1
/tool traffic-generator stream add disabled=no mbps=1 name=stream1 id=3 packet-size=1450 pps=0 tx-template=packet-template-wg
:delay 1
/tool traffic-generator quick duration=4
:delay 1
:log info ("Starting WG $EndpointAddress")
set $i endpoint-address=$EndpointAddress
set $i disabled=no
}
:set ($Tx->[:tostr $i]) $LocalTx
:set ($Rx->[:tostr $i]) $LocalRx
}
Трафик идёт, но его видно только в статистике WG интерфейса, а в пире аналогичная статистика по нулям. Специально traceroute-ом проверял, что запросы идут через WG, а не напрямую в интернет.