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

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