Skip to content

Instantly share code, notes, and snippets.

@httpsx
Last active April 17, 2025 06:39
Show Gist options
  • Save httpsx/76a98ea28e6f3a4ffc947e768c0b6c01 to your computer and use it in GitHub Desktop.
Save httpsx/76a98ea28e6f3a4ffc947e768c0b6c01 to your computer and use it in GitHub Desktop.
WireGuard DPI обход РКН - Windows

Для обхода блокировки достаточно отправить 1 любой udp пакет, тем самым нарушим начальное определение протокола WireGuard
Способ с использованием Windows PowerShell. Без скачивания Nmap и подобного софта.

Шаг 0: Отключитесь от всех туннелей.

Шаг 1: Редактируем Клиент конфиг

Добавим в него "ListenPort", это позволит иметь статичный порт на котором будет работать WireGuard
Нажмите ПКМ на нужный "туннель" и выберите "Редактировать выбранный туннель..." Step1

После DNS добавляем новую строку

ListenPort = 56123

Step1-1

Нажимаем сохранить.

Warning

🔴 Важно! Не пытайтесь подключиться к серверу сразу после того как указали порт.

Шаг 2: Открываем "Windows PowerShell"

Необходимо изменить в скрипте данные сервера, к которому вы будете подключаться.
Их можно посмотреть в конфиге, [Peer] -> Endpoint
Как пример:

Step2

В моем примере $wgIP и $wgPort будут следующие:
$wgIP = "154.77.3.272"
$wgPORT = 51820

Script:

$wgListenPort = 56123
$wgIP = "DEST IP ADDRESS"
$wgPORT = DEST PORT

$EndPoints = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Parse([System.Net.Dns]::GetHostAddresses($wgIP)), $wgPORT) 
$Socket = New-Object System.Net.Sockets.UDPClient $wgListenPort
$SendMessage = $Socket.Send([Text.Encoding]::ASCII.GetBytes(":)"), 2, $EndPoints) 
$Socket.Close() 

После того, как изменили в скрипте $wgIP и $wgPORT, вставляем его в PowerShell и нажимаем Enter. Разрешите доступ Брандмауэру Windows если запросит.

Шаг 3: Подключаемся к WireGuard

Можете подключаться к своему WireGuard.

F.A.Q

  1. Что делать, если я попытался подключиться к серверу без PowerShell Скрипта?
  • Поменять ListenPort в конфиге клиента и поменять в скрипте значение $wgListenPort . Порт должен совпадать.
  • Либо подождать 5-10 минут, пока пройдет время блокировки порта. После этого запускаете сначало скрипт PowerShell - а затем пытаетесь подключиться к WireGuard
  1. Как определить что проблема именно в блокировке протокола WireGuard от РКН ?
  • Если в информации о переданных данных будет статично при подключение: "Получено 92 Б" или "Получено 148 Б" - Значит ваш провайдер заблокировал Handshake Response с протоколом wireguard. Данный гайд помогает обойти эту блокировку.
@xoste49
Copy link

xoste49 commented Oct 22, 2024

я так понял у всех резко wireguard отвалился?

@isdn-network
Copy link

я так понял у всех резко wireguard отвалился?
Похоже на то, по другому начали блочить. Решение отправлять мусор уже не эффективно.

@drizzle-mizzle
Copy link

Написал простенький PowerShell скрипт, автоматически редактирующий конфиги, назначая в них случайный ListenPort, и выполняющий отсылку пакета на сервер.
Делал для себя, так как столкнулся с проблемой, что порт всё равно довольно часто оказывается в блокировке, обычно после того, как ПК уходит в сон с активным подключением к ВПН, после чего просыпается с ним же.
Может кому-то тоже пригодится:

# Путь до папки с конфигами. Ниже указан стандартный путь, по которому WireSockUI копирует загруженные в него конфиги. 
$CONFIGS_PATH = "C:\Users\username\AppData\Roaming\WireSockUI\Configs"

# Новый случайный порт от 56100 до 56499
$NEW_LISTEN_PORT = Get-Random -Minimum 56100 -Maximum 56500

# Перебираем все ".conf" файлы из папки $CONFIGS_PATH
Get-ChildItem -Path $CONFIGS_PATH -Filter *.conf | ForEach-Object {
    $CONFIG_FILE = $_.FullName
    $content = Get-Content $CONFIG_FILE

    # Подменяем порт
    $updatedContent = $content -replace 'ListenPort\s*=.*', "ListenPort = $NEW_LISTEN_PORT"
    Set-Content -Path $CONFIG_FILE -Value $updatedContent

    # Достаём адрес сервера и отправляем пакет
    $ipMatch = Select-String -InputObject $content -Pattern '(?<=Endpoint\s*=\D*)(\d{1,4}\.\d{1,4}\.\d{1,4}\.\d{1,4})(?=:)'
    $WG_IP = $ipMatch.Matches.Groups[1].Value

    $portMatch = Select-String -InputObject $content -Pattern '(?<=Endpoint\s*=.*:)\d*'
    $WG_PORT = $portMatch.Matches.Groups[0].Value

    $EndPoints = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Parse([System.Net.Dns]::GetHostAddresses($WG_IP)), $WG_PORT) 
    $Socket = New-Object System.Net.Sockets.UDPClient $NEW_LISTEN_PORT
    $SendMessage = $Socket.Send([Text.Encoding]::ASCII.GetBytes(":)"), 2, $EndPoints) 
    $Socket.Close() 
}

Можно сохранить скрипт в файл (с расширением .ps1) и либо запускать его вручную при нужде, либо создать задачу в Планировщике Заданий, чтобы он выполнялся при определённых событиях, например при выходе из сна. Разумеется, автоматическое подключение в настройках WireSockUI при этом нужно выключить.

@den1n
Copy link

den1n commented Oct 25, 2024

Доработанный скрипт из поста, который автоматически получает все необходимые данные (IP, порт и прослушиваемый порт) из конфиг файла клиента WireGuard.

$configPath = 'C:\путь\к\конфиг\файлу\клиента\wireguard-client.conf'

$config = Get-Content 'wg0-client-work.conf' | Where-Object { $_ -match '=' } | ConvertFrom-StringData

$endpoint = $config.Endpoint.Split(':')[0]

$port = $config.Endpoint.Split(':')[1]

$entpoints = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Parse([System.Net.Dns]::GetHostAddresses($endpoint)), $port)

$socket = New-Object System.Net.Sockets.UDPClient $config.ListenPort

$socket.Send([Text.Encoding]::ASCII.GetBytes(":)"), 2, $entpoints)

$socket.Close()

@Filipp0vAP
Copy link

Доработанный скрипт из поста, который автоматически получает все необходимые данные (IP, порт и прослушиваемый порт) из конфиг файла клиента WireGuard.

$configPath = 'C:\путь\к\конфиг\файлу\клиента\wireguard-client.conf'

$config = Get-Content 'wg0-client-work.conf' | Where-Object { $_ -match '=' } | ConvertFrom-StringData

$endpoint = $config.Endpoint.Split(':')[0]

$port = $config.Endpoint.Split(':')[1]

$entpoints = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Parse([System.Net.Dns]::GetHostAddresses($endpoint)), $port)

$socket = New-Object System.Net.Sockets.UDPClient $config.ListenPort

$socket.Send([Text.Encoding]::ASCII.GetBytes(":)"), 2, $entpoints)

$socket.Close()

в вашем скрипте ошибка в 3 строчке, вместо 'wg0-client-work.conf' надо передавать переменную $configPath, которую мы объявили выше и в которой записан путь к конфигу.

@Filipp0vAP
Copy link

кстати виндовом клиенте, чтоб не запускать постоянно powershell отдельно можно сделать так же, только запускать powershell скрипт

[Interface]
...
PreUp = powershell -Command "$wgListenPort = 56123; $wgIP = '***EndpointIP***'; $wgPORT = 35501; $EndPoints = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Parse([System.Net.Dns]::GetHostAddresses($wgIP)), $wgPORT); $Socket = New-Object System.Net.Sockets.UDPClient $wgListenPort; $SendMessage = $Socket.Send([Text.Encoding]::ASCII.GetBytes(':)'), 2, $EndPoints); $Socket.Close()"

вдруг кому пригодиться)

нужно только строке PreUp поменять EndpointIP на свой и поменять порт на свой

Что бы это сработало нужно еще wg разрешить выполнение скриптов
вот тут подробнее об этом написано
https://github.com/WireGuard/wireguard-windows/blob/master/docs/adminregistry.md

@Cr0c81
Copy link

Cr0c81 commented Nov 2, 2024

перестал работать, хз по какой причине, всё также, возможно порт в бане, пробовал другие без результатов

Было такое. Попробуйте поменять значения

Jc = 4
Jmin = 8
Jmax = 32

(в зависимости от реализации механизма подключения - эти значения будут в разных местах) Главное чтобы Jmax было больше Jmin. И Jc в разумных пределах.. От 2 до 500..

Ну и порт очень желательно менять перед каждым подключением. Скрипт должен это учитывать.. Мне помогло.

В какой раздел конфига это писать? Interface или Peer?

@ferdinand-II
Copy link

перестал работать, хз по какой причине, всё также, возможно порт в бане, пробовал другие без результатов

Было такое. Попробуйте поменять значения

Jc = 4
Jmin = 8
Jmax = 32

(в зависимости от реализации механизма подключения - эти значения будут в разных местах) Главное чтобы Jmax было больше Jmin. И Jc в разумных пределах.. От 2 до 500..
Ну и порт очень желательно менять перед каждым подключением. Скрипт должен это учитывать.. Мне помогло.

В какой раздел конфига это писать? Interface или Peer?

Interface

@Vertybird
Copy link

Vertybird commented Nov 13, 2024

Арендовал VPS под ВПН. Пытаюсь подружить WireGuard с TunnlTo. После выполнения скрипта из поста сам WireGuard работает, но при загрузке конфига в TunnlTo соединение не проходит дальше рукопожатия, в логах пишет каждые 5 секунд сообщения типа:

2024-11-13 13:04:40 [TUN]: keep_alive_thread: Sending Handshake packet to WireGuard Server success

Соединение с интернетом падает, пока не вырублю тоннель. Есть мысли, как решить проблему? Может в TunnlTo какие то данные из WireGuard дописать? Нужно ограничить WireGuard для некоторых программ, чтобы айпи оставался российским.

@Anarhia93
Copy link

День добрый, последняя неделя отлетает WG.
Установлен на роутер, есть ли способ обойти?
Буду очень признателен за помощь.

@Kuray0
Copy link

Kuray0 commented Mar 21, 2025

обход не робит, что делать?

@ferdinand-II
Copy link

обход не робит, что делать?

сушить вёсла,лавочка прикрылась

@JoyZzzzz
Copy link

обход не робит, что делать?

Попробуйте другой способ. Например вот этот https://gist.github.com/koolvn/993d9c7eb2666dbf15bdccc7d3c4fe33

@Andrey52222
Copy link

Кто поднял wireguard на keenetic? Поделитесь методом пожалуйста

@Andrey52222
Copy link

Andrey52222 commented Apr 2, 2025

Кто поднял wireguard на keenetic? Поделитесь методом пожалуйста

Вот это помогло https://github.com/Ground-Zerro/Wireguard-DPI-blocking-bypass/releases/tag/v0.2.0

@mgryaznov
Copy link

Доброго времени суток. И все-таки, как аналогичное реализовать на телефоне с Android?

@mgryaznov
Copy link

Доброго времени суток. И все-таки, как аналогичное реализовать на телефоне с Android?

Сам разобрался.
DeepDeek помог) Переписал код на python и запустил его через Termux.

@MugenMan
Copy link

MugenMan commented Apr 2, 2025

на андройде работает 3 8 32, а на ios нет
писал так:
Jc = 126
Jmin = 99
Jmax = 1099
S1 = 10
S2 = 15
H1 = 1
H2 = 2
H3 = 3
H4 = 4

есть идеи? использую amneziawg

@ropucyka
Copy link

ropucyka commented Apr 2, 2025

Доброго времени суток. И все-таки, как аналогичное реализовать на телефоне с Android?

Сам разобрался. DeepDeek помог) Переписал код на python и запустил его через Termux.

Так покажи чё как

@mgryaznov
Copy link

Доброго времени суток. И все-таки, как аналогичное реализовать на телефоне с Android?

Сам разобрался. DeepDeek помог) Переписал код на python и запустил его через Termux.

Так покажи чё как

Код на питоне:

import socket

# Настройки (замените на свои!)
SERVER_IP = "x.x.x.x"
SERVER_PORT = xxxxx
LOCAL_PORT = 56123  # Порт из ListenPort

# Создаем UDP-сокет, привязанный к порту 56123
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", LOCAL_PORT))

try:
    # Отправляем "магический" пакет (содержимое не важно)
    sock.sendto(b":)", (SERVER_IP, SERVER_PORT))
    print("[+] UDP-пакет отправлен с порта 56123!")
except Exception as e:
    print(f"[-] Ошибка: {e}")
finally:
    sock.close()

На телефон ставим Termux, запускаем.
В консоли пишем:

pkg update
pkg install python
pip install scapy

Чтобы код можно было вставить извне в Termux:
pkg install termux-api
Копируем код в буфер, затем вставляем в буфер Termux:
termux-clipboard-get
Далее в Termux из буфера вставляем в файл:
termux-clipboard-get > send_udp.py
В дальнейшем исправить порт можно в nano:
nano send_udp.py

Последний этап, посылаем пакет:
python send_udp.py
Запускаем wireguard с добавленным ListenPort.

@kesha-eh
Copy link

kesha-eh commented Apr 4, 2025

Благодарю вас обоих.
Но если можно вас попросить сделать авто скрипт на питоне, который возьмёт конфиг вайра и сделает свой send_udp.py (вместо send_udp будет имя конфига вг.

@sa1tshaker
Copy link

для роутера есть какой то вариант такой? keenetic miktorik или openwrt

@degrodanya
Copy link

для роутера есть какой то вариант такой? keenetic miktorik или openwrt

нашёл что-нибудь?

@sa1tshaker
Copy link

для роутера есть какой то вариант такой? keenetic miktorik или openwrt

нашёл что-нибудь?

пока ничего достойного, какие то костыли

@ropucyka
Copy link

ropucyka commented Apr 8, 2025

Последний этап, посылаем пакет: python send_udp.py Запускаем wireguard с добавленным ListenPort.

О спасибо конечно, но лавочку уже закрыли. По крайней мере местно.

@mgryaznov
Copy link

Последний этап, посылаем пакет: python send_udp.py Запускаем wireguard с добавленным ListenPort.

О спасибо конечно, но лавочку уже закрыли. По крайней мере местно.

МТС Москва работает.

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