Skip to content

Instantly share code, notes, and snippets.

@koolvn
Last active November 13, 2024 01:16
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
  • Подключаем WG клиента в настройках роутера. Если клиент уже подключен, то выполняем команду /jffs/scripts/wgclient-start <номер впн клиента> (Например /jffs/scripts/wgclient-start 1 если подключен клиент под номером 1)
  • Done ✅

Спасибо @alexbozhenko за полезные ссылки:

Проверен на роутерах:

  • 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
# Set the number of times a random message would be sent
NUM_MESSAGES_SENT=3
# Random message generation params
block_size=512
block_count=5
# 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)) }'
}
# Function to generate a random message and send it
send_random_message() {
message=$(dd if=/dev/urandom bs=$block_size count=$block_count 2>/dev/null | tr -dc 'A-Za-z0-9')
echo "$message" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
logger -t WireGuardClient -p user.notice "Message sent to WG server $wg_server:$wg_port from client's port $l_port"
sleep 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
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
# Send random messages specified number of times
i=1
while [ "$i" -le "$NUM_MESSAGES_SENT" ]; do
send_random_message
i=$((i + 1))
done
# Update the WireGuard interface with the new listen port
wg set "$interface" listen-port "$l_port"
logger -t WireGuardClient -p user.notice "Done"
@JugglerLKR
Copy link

@koolvn - а если размечтаться, и в скрипт встроить механизм проверки поднялось ли соединение, и ежели нет - увеличить количество пакетов и/или их длину?

@koolvn
Copy link
Author

koolvn commented Oct 22, 2024

@JugglerLKR В теории это возможно скорее всего, но мне лень  🦥 😉

@jamal200591
Copy link

@JugglerLKR В теории это возможно скорее всего, но мне лень  🦥 😉

Ну пожалуйста 🥹

@AlexeyAM
Copy link

Вот чего очень хотелоь бы, так это возможность подгружать файл со списком адресов, которые нужно пускать через VPN. Я понимаю, что есть VPN director, но он как-то в плане интерфейса не очень. Лучше бы просто в файле прописывать

@JoyZzzzz
Copy link

JoyZzzzz commented Nov 1, 2024

@AlexeyAM
Так есть же для мерлина скрипт который может разные списки доменов отправлять в разные vpn тунели.

@alexbozhenko
Copy link

alexbozhenko commented Nov 2, 2024

@koolvn Это просто прекрасно! Рабоает! А то уж думал зря дорогущие роутеры всем родственникам купил :-)
Пожалуйста добавьте ссылки для тех кто впервые merlin устанавливает:

  1. Как установить прошивку AsusWRT merlin(один клик в web UI, даже все ваши старые настройки сохранятся) https://github.com/RMerl/asuswrt-merlin.ng/wiki/Installation
  2. Как включить SSH доступ: https://github.com/RMerl/asuswrt-merlin.ng/wiki/SSH
  3. О JFFS: https://github.com/RMerl/asuswrt-merlin.ng/wiki/JFFS
  4. О VPN Director(новый интерфейс для настройки VPN в AsusWRT Merlin) https://github.com/RMerl/asuswrt-merlin.ng/wiki/VPN-Director
  5. O скриптах, в т.ч. wgclient-start: https://github.com/RMerl/asuswrt-merlin.ng/wiki/User-scripts

@alexbozhenko
Copy link

alexbozhenko commented Nov 2, 2024

А используя эту инструкцию можно просто сделать отдельную wifi сеть под VPN. Очень удобно!
https://www.reddit.com/r/Asus_Merlin/comments/vqkjxg/comment/jjed9sf/

Easy Solution with Wireguard and without CLI or Scripts (i know its an old Thread but for everyone that stumbles upon it)

   1. Create a Guest Network 1 WITHOUT Intranet Access.
   The Router will give it the the IP: 192.168.101.0 at 2,4 GHz 102.0 at 5 Ghz.
   Only Guest Network 1 will create a another IP Range.

   2. Go To VPN - VPN Client - Wireguard

   3. Setup your Wireguard Client with Allowd IPs [0.0.0.0/0,::0/0]

   4. Go to VPN Director add a new Rule

   5. Choose the Interface you created, Describe it as Guest VPN or whatever you like
    in Local IP type: [192.168.101.0/24] or 102.0/24 if you're on 5GHz

    Enjoy your Guest Network with VPN and Disabled Intranet

@koolvn
Copy link
Author

koolvn commented Nov 5, 2024

@alexbozhenko Спасибо! Добавил

@AlexeyAM
Copy link

AlexeyAM commented Nov 5, 2024

@AlexeyAM Так есть же для мерлина скрипт который может разные списки доменов отправлять в разные vpn тунели.

Не пришлёте ссылочку? Буду признателен)

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