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"
@koolvn
Copy link
Author

koolvn commented Sep 26, 2024

Добрый день. ASUS RT-AX56U, Merlin [3004.388.8_2] Ошибки: Sep 26 09:15:24 WireGuardClient: Starting junk-udp-hack script Sep 26 09:15:24 WireGuardClient: Processing WG interface - wgc Sep 26 09:15:24 WireGuardClient: Unable to retrieve endpoint for interface wgc

Привет! Такая ошибка появляется, если нет подключенных клиентов WireGuard
Нужно сначала настроить и включить клиента. После этого скрипт выполнится автоматически (если положил его в /jffs/scripts/wgclient-start)

image

@Evgenych-sse
Copy link

Добрый день. ASUS RT-AX56U, Merlin [3004.388.8_2] Ошибки: Sep 26 09:15:24 WireGuardClient: Starting junk-udp-hack script Sep 26 09:15:24 WireGuardClient: Processing WG interface - wgc Sep 26 09:15:24 WireGuardClient: Unable to retrieve endpoint for interface wgc

Привет! Такая ошибка появляется, если нет подключенных клиентов WireGuard Нужно сначала настроить и включить клиента. После этого скрипт выполнится автоматически (если положил его в /jffs/scripts/wgclient-start)

клиент есть, подключен. поменял в скрипте interface="wgc$1" на interface="wgc1" стало подключаться

@koolvn
Copy link
Author

koolvn commented Sep 26, 2024

клиент есть, подключен. поменял в скрипте interface="wgc$1" на interface="wgc1" стало подключаться

Похоже, что клиент был подключен до того как скрипт был положен в /jffs/scripts/wgclient-start
Этот скрипт запускается автоматически после подключения клиента. $1 - означает первый аргумент, который передаётся в скрипт (в случае подключения клиента 1 будет передана единичка и interface будет равен wgc1)
Когда роутер запускает этот скрипт автоматически он передаёт номер клиента как аргумент

Спасибо, добавлю эту инфу в описание

@Evgenych-sse
Copy link

Я руками скрипт запускал для проверки работоспособности. Если стартует автоматически - то все верно, менять ничего в скрипте не нужно

@JoyZzzzz
Copy link

@koolvn
Есть интересный скрипт Domain VPN Routing в версии 2.1.3 вся связка работала отлично. Но после обновления их скрипта до 3.0 ваш скрипт перестает отрабатывать запуск wg

@AirAlarm
Copy link

AirAlarm commented Oct 1, 2024

@koolvn Есть интересный скрипт Domain VPN Routing в версии 2.1.3 вся связка работала отлично. Но после обновления их скрипта до 3.0 ваш скрипт перестает отрабатывать запуск wg

Что у вас в client status log клиента WireGuard? У меня скрипт продолжает отрабатывать нормально.

@JugglerLKR
Copy link

JugglerLKR commented Oct 16, 2024

@koolvn - можно ли доработать скрипт, чтобы он слал около 12 рандомных пакетов, разного содержания, разной длины, с разными небольшими задержками а-ля amneziawg? пока сделал вот такой "костыль", вроде работает.
`

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')

Send the message using socat

echo "$message" | 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 "$message2" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message4" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
sleep 1
echo "$message2" | socat - UDP-SENDTO:"$wg_server:$wg_port",sourceport="$l_port"
echo "$message" | 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"
`

@romanlex
Copy link

а не кажется всем что время от времени было бы неплохо крутить скрипт в кроне? к примеру раз в 30минут?

@GoBugsGo
Copy link

Привет. Раньше скрипт работал всё нормально было. Сейчас в логе только:
Oct 17 12:45:07 custom_script: Running /jffs/scripts/wgclient-start (args: 1)
Дальше не отрабатывает. В чём может быть проблема? ПС: МСК МТС

@JugglerLKR
Copy link

МСК МТС

я потому костыль и сделал. пока работает. в идеале бы amneziawg ipk под асус собрать

@AirAlarm
Copy link

я потому костыль и сделал. пока работает. в идеале бы amneziawg ipk под асус собрать

Можете показать полностью код, куда добавлять его? Хочу протестировать

@JugglerLKR
Copy link

JugglerLKR commented Oct 17, 2024

не умею вставлять код в коммент

'''

#!/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"

'''

@Aleksei-Demin
Copy link

Благодарю, заработал Cloudflare WARP. Идея с amneziawg.ipk, кстати, крайне интересная. Особенно если будет возможность запускать и xray, тогда это будет просто пушка.

@JoyZzzzz
Copy link

Особенно если будет возможность запускать и xray, тогда это будет просто пушка.

Есть вот такие разработки
sing-box
https://github.com/Dr4tez/sing-box4asus/

Xray + Reality
https://github.com/zw963/asuswrt-merlin-v2ray

@koolvn
Copy link
Author

koolvn commented Oct 21, 2024

@JoyZzzzz К сожалению, я не использую Domain VPN Routing, поэтому ничего сказать не могу.

@romanlex Как будто особого смысла нет. Если соединение корректно установлено, то оно работает без проблем и ограничений по времени. Но если хочется, то можешь прописать в крон - хуже от этого не будет

@JugglerLKR Спасибо, это хорошее замечание. Сейчас обновлю скрипт - будет возможность выбирать кол-во сообщений, а так же их размер. (П.С. чтоб отправлять код нужно использовать три вот такие знака ` перед кодом и три после)

@GoBugsGo Это странно, а что за роутер? Какая прошивка?

@koolvn
Copy link
Author

koolvn commented Oct 21, 2024

ДОСТУПНА НОВАЯ ВЕРСИЯ СКРИПТА

  • Добавлены свистелки-перделки. Теперь можно регулировать кол-во отправляемых сообщений и их размер

@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