UDP Trash Hack for WireGuard on AsusWRT Merlin
Проверяем, что включен пункт меню Enable JFFS custom scripts and configs
- Кладём файл
wgclient-start
в/jffs/scripts/
- Делаем скрипт запускаемым
chmod +x /jffs/scripts/wgclient-start
- Подключаем WG клиента в настройках роутера.
Если клиент уже подключен, то выполняем команду
/jffs/scripts/wgclient-start <номер впн клиента>
(Например/jffs/scripts/wgclient-start 1
если подключен клиент под номером 1) - Done ✅
Спасибо @alexbozhenko за полезные ссылки:
- Как установить прошивку AsusWRT merlin(один клик в web UI, даже все ваши старые настройки сохранятся) https://github.com/RMerl/asuswrt-merlin.ng/wiki/Installation
- Как включить SSH доступ: https://github.com/RMerl/asuswrt-merlin.ng/wiki/SSH
- О JFFS: https://github.com/RMerl/asuswrt-merlin.ng/wiki/JFFS
- О VPN Director(новый интерфейс для настройки VPN в AsusWRT Merlin) https://github.com/RMerl/asuswrt-merlin.ng/wiki/VPN-Director
- O скриптах, в т.ч. wgclient-start: https://github.com/RMerl/asuswrt-merlin.ng/wiki/User-scripts
- Как сделать отдельную вайфай сеть с VPN: https://gist.github.com/koolvn/993d9c7eb2666dbf15bdccc7d3c4fe33?permalink_comment_id=5264534#gistcomment-5264534
Проверен на роутерах:
- ASUS RT-AX88U PRO, Merlin 3004.388.8_2
- ASUS RT-AX68U, Merlin 3004.388.8_2
- ASUS RT-AX86U
- ASUS RT-AX56U, Merlin 3004.388.8_2
не умею вставлять код в коммент
'''
#!/bin/sh
Enable exit on error
set -e
Function to generate a random number between 49152 and 65535
generate_random_port() {
awk -v min=49152 -v max=65535 'BEGIN { srand(); print int(min + rand() * (max - min + 1)) }'
}
interface="wgc$1"
sleep 3
Log the start of the script
logger -t WireGuardClient -p user.notice "Starting junk-udp-hack script"
logger -t WireGuardClient -p user.notice "Processing WG interface - $interface"
Retrieve the server and port
wg_endpoint=$(wg show "$interface" endpoints 2>/dev/null || echo "")
if [ -z "$wg_endpoint" ]; then
logger -s -t WireGuardClient -p user.err "Unable to retrieve endpoint for interface $interface" >&2
exit 1
fi
wg_server=$(echo "$wg_endpoint" | awk '{print $2}' | cut -d':' -f1 2>/dev/null || echo "")
wg_port=$(echo "$wg_endpoint" | awk '{print $2}' | cut -d':' -f2 2>/dev/null || echo "")
if [ -z "$wg_server" ] || [ -z "$wg_port" ]; then
logger -s -t WireGuardClient -p user.err "Unable to extract server or port for interface $interface" >&2
exit 1
fi
Generate a new random port and ensure it's not in use
l_port=$(generate_random_port)
while netstat -an | grep -qE '(^|[^0-9])'"$l_port"'([^0-9]|$)'; do
logger -t WireGuardClient -p user.warn "Port $l_port is already in use. Generating new one"
sleep 1
l_port=$(generate_random_port)
done
logger -t WireGuardClient -p user.notice "Setting connection to WG server $wg_server:$wg_port from client's port $l_port"
Generate a random message
message=$(dd if=/dev/urandom bs=228 count=5 2>/dev/null | tr -dc 'A-Za-z0-9')
message2=$(dd if=/dev/urandom bs=228 count=5 2>/dev/null | tr -dc 'A-Za-z0-9')
message3=$(dd if=/dev/urandom bs=228 count=5 2>/dev/null | tr -dc 'A-Za-z0-9')
message4=$(dd if=/dev/urandom bs=228 count=5 2>/dev/null | tr -dc 'A-Za-z0-9')
message5=$(dd if=/dev/urandom bs=228 count=5 2>/dev/null | tr -dc 'A-Za-z0-9')
message6=$(dd if=/dev/urandom bs=228 count=5 2>/dev/null | tr -dc 'A-Za-z0-9')
Send the message using socat
echo "$message" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message2" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message3" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message4" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message5" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message6" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
sleep 1
echo "$message6" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message5" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message4" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message3" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message2" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
Update the WireGuard interface with the new listen port
wg set "$interface" listen-port "$l_port"
logger -t WireGuardClient -p user.notice "Done"
'''