Skip to content

Instantly share code, notes, and snippets.

@koolvn
Last active September 18, 2024 06:56
Show Gist options
  • Save koolvn/993d9c7eb2666dbf15bdccc7d3c4fe33 to your computer and use it in GitHub Desktop.
Save koolvn/993d9c7eb2666dbf15bdccc7d3c4fe33 to your computer and use it in GitHub Desktop.
UDP Trash Hack for WireGuard on AsusWRT Merlin

UDP Trash Hack for WireGuard on AsusWRT Merlin

Подготовка

Проверяем, что включен пункт меню Enable JFFS custom scripts and configs

image

Установка

  • Кладём файл wgclient-start в /jffs/scripts/
  • Делаем скрипт запускаемым
chmod +x /jffs/scripts/wgclient-start
  • Done ✅

Проверен на роутере ASUS RT-AX88U PRO Firmware: AsusWRT 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 random message
message=$(dd if=/dev/urandom bs=228 count=5 2>/dev/null | tr -dc 'A-Za-z0-9')
# 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"
# Send the message using socat
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"
@kitzik
Copy link

kitzik commented Aug 31, 2024

Спасибо! Отлично работает на RT-AX68U c Merlin 3004.388.8_2

@Rocker009
Copy link

Не работает, логи следующие:

Sep 7 20:05:10 WireGuard: Starting client 1.
Sep 7 20:05:13 WireGuardClient: Starting junk-udp-hack script
Sep 7 20:05:13 WireGuardClient: Processing WG interface - wgc1
Sep 7 20:05:13 WireGuardClient: Setting connection to WG server 162.159.192.1:2408 from client's port 60705
Sep 7 20:05:14 WireGuardClient: Done

В чём может быть проблема?

@koolvn
Copy link
Author

koolvn commented Sep 8, 2024

@Rocker009 Судя по логам, скрипт корректно отработал.
В UI роутера (VPN -> VPN-Client -> Wireguard - > Client status logs) можно проверить, что порт изменился на тот, что указан в логах (60705 в твоём случае)
image

П.С. Правила VPN Director'а настроены?

@Rocker009
Copy link

Снимок экрана 2024-09-08 144700
Снимок экрана 2024-09-08 144751
Правила VPN Director'а не настраивал, перед запуском твоего скрипта загрузил конфиг из файла Warp, который с небольшими правками работает у меня в AmneziaWg.

@koolvn
Copy link
Author

koolvn commented Sep 9, 2024

@Rocker009 Выглядит всё ок.
Попробуй настрой правило (VPN -> VPN Director -> Add new rule) для телефона например, чтоб весь трафик шёл через WGC1
image
После этого роутер пустит весь трафик телефона через wgc1.

@Rocker009
Copy link

Сделал, как написано. На телефоне показывает подключение без доступа к сети Интернет, ни одна страница не открывается.
Логи следующие.
изображение_2024-09-09_211249074

@koolvn
Copy link
Author

koolvn commented Sep 9, 2024

@Rocker009 печаль ☹️ как говорится, на этом мои полномочия всё
Могу только предложить протестить какой-то другой точно работающий WireGuard сервер ну и копать в iptables, если и этот вариант не сработает.

@Nomoneyno
Copy link

Всё отлично работает, спасибо. Даже со скриптом Domain-based VPN Routing, он правда перезаписывает wgclient-start своими настройками, но достаточно в wgclient-start ручками дописать

sh /jffs/scripts/domain_vpn_routing.sh cron # domain_vpn_routing

sh /jffs/scripts/domain_vpn_routing.sh querypolicy all # domain_vpn_routing_queryall

И тогда всё будет работать вместе и ходить только на нужные адреса

@AlexeyAM
Copy link

Это работает с обычным WG или с AmneziaAG?

@Nomoneyno
Copy link

Это работает с обычным WG или с AmneziaAG?

С обычным. AmneziaWG только на OpenWRT.

@AlexeyAM
Copy link

А в чём тогда смысл этой добавки?

@mbbel
Copy link

mbbel commented Sep 18, 2024

Отлично работает asus rt-ax86u. Спасибо!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment