Skip to content

Instantly share code, notes, and snippets.

@httpsx
Last active August 12, 2026 04:23
Show Gist options
  • Select an option

  • Save httpsx/76a98ea28e6f3a4ffc947e768c0b6c01 to your computer and use it in GitHub Desktop.

Select an option

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. Данный гайд помогает обойти эту блокировку.
@LookRay

LookRay commented Oct 16, 2024

Copy link
Copy Markdown

Мой случай 162.159.192.1 работает а 162.159.193.x в бане

@atolismesh

atolismesh commented Oct 17, 2024

Copy link
Copy Markdown

Сloudfl до конца дня 17.10.24 проводит технические работы с серверами WARP

@molozhavenko

Copy link
Copy Markdown

А как на Андроиде подобный обход сделать?

@andreyr82

Copy link
Copy Markdown

На этой неделе обход внезапно перестал работать. Пытался менять эндпойнты и порты, пока не помогло. Провайдер Планета.

Тоже самое. Ростелеком. Ярославская область.

@DRON4eg

DRON4eg commented Oct 19, 2024

Copy link
Copy Markdown

кстати виндовом клиенте, чтоб не запускать постоянно 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 на свой и поменять порт на свой

@isdn-network

Copy link
Copy Markdown

На хостинге FirstByteRU не отрабатывает как положено. Запускаем скрипт, соединение держится ровно 5 icmp пакетов и валится.

@allmoney

Copy link
Copy Markdown

А где изначально брать эти параметры ASC? Можно взять любые чужие?

Попробуйте сначала эти interface Wireguard0 wireguard asc 120 23 911 0 0 1 2 3 4 Я брал значения отсюда https://github.com/ImMALWARE/bash-warp-generator

А где эту строку прописывать? Вместо "interface Wireguard0" в конфиге? Добавить просто дальше " wireguard asc 120 23 911 0 0 1 2 3 4"?

@HPo1nt

HPo1nt commented Oct 22, 2024

Copy link
Copy Markdown

А где эту строку прописывать? Вместо "interface Wireguard0" в конфиге? Добавить просто дальше " wireguard asc 120 23 911 0 0 1 2 3 4"?

Почитайте на официальном форуме кинетика

@xoste49

xoste49 commented Oct 22, 2024

Copy link
Copy Markdown

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

@isdn-network

Copy link
Copy Markdown

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

@drizzle-mizzle

Copy link
Copy Markdown

Написал простенький 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

den1n commented Oct 25, 2024

Copy link
Copy Markdown

Доработанный скрипт из поста, который автоматически получает все необходимые данные (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
Copy Markdown

Доработанный скрипт из поста, который автоматически получает все необходимые данные (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
Copy Markdown

кстати виндовом клиенте, чтоб не запускать постоянно 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

Cr0c81 commented Nov 2, 2024

Copy link
Copy Markdown

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

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

Jc = 4
Jmin = 8
Jmax = 32

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

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

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

@ferdinand-II

Copy link
Copy Markdown

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

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

Jc = 4
Jmin = 8
Jmax = 32

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

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

Interface

@Vertybird

Vertybird commented Nov 13, 2024

Copy link
Copy Markdown

Арендовал 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
Copy Markdown

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

@Kuray0

Kuray0 commented Mar 21, 2025

Copy link
Copy Markdown

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

@ferdinand-II

Copy link
Copy Markdown

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

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

@JoyZzzzz

Copy link
Copy Markdown

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

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

@Andrey52222

Copy link
Copy Markdown

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

@Andrey52222

Andrey52222 commented Apr 2, 2025

Copy link
Copy Markdown

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

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

@mgryaznov

Copy link
Copy Markdown

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

@mgryaznov

Copy link
Copy Markdown

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

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

@MugenMan

MugenMan commented Apr 2, 2025

Copy link
Copy Markdown

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

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

@ropucyka

ropucyka commented Apr 2, 2025

Copy link
Copy Markdown

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

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

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

@mgryaznov

Copy link
Copy Markdown

Доброго времени суток. И все-таки, как аналогичное реализовать на телефоне с 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

kesha-eh commented Apr 4, 2025

Copy link
Copy Markdown

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

@sa1tshaker

Copy link
Copy Markdown

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

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