Skip to content

Instantly share code, notes, and snippets.

@httpsx
Last active July 17, 2025 06:15
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. Данный гайд помогает обойти эту блокировку.
@fivl26
Copy link

fivl26 commented Sep 11, 2024

Посмотрите мой скрипт выше, я его привел к виду, где косвенные параметры получаются из настроек WG и пира. Остается только задать название интерфейса WG и интернет-интерфейса (нужен для извлечения ip адреса интернет-интерфейса). От последнего можно было бы избавиться тоже, но у меня на интернет-интерфейсе висит еще второй ip (192.168.... не спрашивайте зачем). Поэтому в моем скрипте мутноватая схема извлечения ip интернет-интерфейса, но должно работать и у всех. Ну и конечно когда меняете настройки нужно удалить вручную шаблон пакета, т.к. в моем скрипте он создается 1 раз, и большинство настроек в нем потом не меняется: /tool/traffic-generator/packet-template/remove packet-template-wg

@Chupakabra303 а в чём может быть проблема? запускаю скрипт вручную, порт меняется, пакет создаётся, но соединение из-под блока не выходит. Могут ли быть проблемы в момент отправки мусорного пакета? Как удостовериться, что он отправляется?

@DanzoGit
Copy link

От души 💖 Скрипт помог.

@VladimirPavlyuk
Copy link

Спасибо!
Помогло.

@CremeBru1ee
Copy link

Огромное спасибо! У меня тут маленькая проблемка. Каждый день блочится порт и скрипт надо по новой прописывать, с новым портом. Это нормально? Или как можно сделать так чтобы работало постоянно?

@Venom96669
Copy link

Venom96669 commented Sep 24, 2024

Каждый день блочится порт и скрипт надо по новой прописывать, с новым портом.

У меня бывало такое поведение, после выхода ПК из спящего режима.
WG соединение продолжало использоваться, на старом порту..
Но уже без "мусорных пакетов". т.к. с точки зрения WG - новое соединение не устанавливается..

Решил - добавлением автоматического отключения WG перед "засыпанием"..
В Ubuntu 24.04, в каталоге /usr/lib/systemd/system-sleep
Нужно создать файлик..
И вставить в него:

#!/bin/sh
case "$1" in
  post)
    nmcli con down wireguard
    exit 0
    ;;
  pre)
    nmcli con down wireguard; sleep 2;
    exit 0
    ;;
esac

С тех пор - порт ни разу не пришлось менять..

На других OS, реализация будет отличаться. Но сама проблемма, вероятно, в этом же..

@CremeBru1ee
Copy link

Каждый день блочится порт и скрипт надо по новой прописывать, с новым портом.

У меня бывало такое поведение, после выхода ПК из спящего режима. WG соединение продолжало использоваться, на старом порту.. Но уже без "мусорных пакетов". т.к. с точки зрения WG - новое соединение не устанавливается..

Решил - добавлением автоматического отключения WG перед "засыпанием".. В Ubuntu 24.04, в каталоге /usr/lib/systemd/system-sleep Нужно создать файлик.. И вставить в него:

#!/bin/sh
case "$1" in
  post)
    nmcli con down wireguard
    exit 0
    ;;
  pre)
    nmcli con down wireguard; sleep 2;
    exit 0
    ;;
esac

С тех пор - порт ни разу не пришлось менять..

На других OS, реализация будет отличаться. Но сама проблемма, вероятно, в этом же..

Большое спасибо за ответ и способ решения проблемы, но я сижу на виндоус и совершенно не разбираюсь что надо прописывать на ней :(

@GuiltyChaos
Copy link

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

@Venom96669
Copy link

Venom96669 commented Oct 1, 2024

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

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

Jc = 4
Jmin = 8
Jmax = 32

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

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

@GuiltyChaos
Copy link

D

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

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

Jc = 4
Jmin = 8
Jmax = 32

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

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

не робит. увеличивал, порты менял, неа. Видимо крымские провайдеры стали ещё более чмырями чем раньше

@Venom96669
Copy link

не робит. увеличивал, порты менял, неа. Видимо крымские провайдеры стали ещё более чмырями чем раньше

Тогда нужно переходить на полную версию Amnezia .
Помимо первых 3-х параметров (Jc,Jmin,Jmax), там есть еще много чего.
Но для этого на стороне сервера тоже должен быть Amnezia..

@Aswer
Copy link

Aswer commented Oct 9, 2024

Установитье клиент AmneziaWG . Импортируйте туда тот же туннель, что и в обычном wireguard. Потом в настройках этого туннеля заполните параметры:

Just packet count: 3
Just packet minimum size: 8
Just packet maximum size: 32

И после этого запустите подключение.
Мне помогло.

Для тех кто под Windows (совсем просто): Ставите вместо привычного Wireguard (можно и вместе) amneziawg-windows-client. Импортируете все ваши конфиги как они есть (экпорт в zip из Wireguard). В нужном кофиге в секции interface добавляете всего 3 строчки: Jc = 4 Jmin = 2 Jmax = 10 И все! ) вот так вот просто. Это добавит мусор в начале подключения и все снова будет работать! )

действительно помогло, актуально на данную дату

@m33ph
Copy link

m33ph commented Oct 16, 2024

Чуть подправил скрипт , чтобы лишний раз не бегал по клиентским пирам, которые подключаются к этому роутеру, а только где роутер как клиент. Работает убойно! Proton и Warp пробивает)

Upd.: увеличил время в фильтре до 2м30с как защита от ложных срабатываний у медленных подключений. Считаю выполнение скрипта раз в 2 минуты средним нормальным значением. Так же добавил в скрипт закомментированную строку с возможность исключения какого-либо wg интерфейса из проверки.

Update for ROS >= 7.17: у пиров изменили свойство is-responder на responder! добавил закоментированную строку в скрипт. Если при выполнении скрипта на этапе генерации трафика выходит ошибка в лог, то: выполнить команду /system/device-mode/print если получаем mode: advanced и при этом в выводе нету traffic-gen: yes, выполняем команду /system/device-mode/update traffic-gen=yes и следуем инструкциям. Официальная справка по device-mode.

:global Tx
:global Rx
/interface/wireguard/peers

# Для версии ROS >= 7.17
#:foreach i in=[find where disabled=no and responder!=yes] do={

# Исключить подключение wireguard-client по имени интерфейса чтобы скрипт его никогда не трогал
#:foreach i in=[find where disabled=no and is-responder!=yes and interface!="wireguard-client"] do={

:foreach i in=[find where disabled=no and is-responder!=yes] do={
  :local LocalTx [get $i tx]
  :local LocalRx [get $i rx]
  :local LastHandshake [get $i last-handshake]
  :if (([:tostr $LastHandshake] = "") or (($LastHandshake > [:totime "2m30s"]) and ($Rx->[:tostr $i] = $LocalRx))) do={
    :local rawHeader [:rndstr length=4 from=123456789abcdef]
    :local EndpointAddress [get $i endpoint-address]
    :local EndpointAddressIP $EndpointAddress
    :local EndpointAddressIP [get $i current-endpoint-address]
    :local name [get $i name]
    :local wgDstPort [get $i current-endpoint-port]
    :local interface [get $i interface]
    
    # Сбрасываем исходящий порт на уровне интерфейса
    /interface wireguard set $interface listen-port=0
    :local srcport [/interface/wireguard/get $interface listen-port];

    :log info ("WG name is $name, EndpointAddress $EndpointAddress , LastHandshake $LastHandshake, LastTx " . $Tx->[:tostr $i] . ", CurrentTx $LocalTx, LastRx " . $Rx->[:tostr $i] . ", CurrentRx $LocalRx")
    :log info ("WG Currentinterface $interface, srcport $srcport, EndpointAddressIP $EndpointAddressIP, DstPort $wgDstPort")
    :log info ("Generating spam for RKN")
    set $i disabled=yes
    /tool traffic-generator stream remove [find]
    /tool traffic-generator packet-template remove [find]
    :delay 1
    /tool/traffic-generator/packet-template/add header-stack=mac,ip,udp,raw ip-dst=$EndpointAddressIP name=packet-template-wg raw-header=$rawHeader special-footer=no udp-dst-port=$wgDstPort udp-src-port=$srcport
    :delay 1
    /tool traffic-generator stream add disabled=no mbps=1 name=stream1 id=3 packet-size=1450 pps=0 tx-template=packet-template-wg
    :delay 1
    /tool traffic-generator quick duration=4
    :delay 1

    :log info ("Starting WG $EndpointAddress")
    set $i endpoint-address=$EndpointAddress
    set $i disabled=no
  }
  :set ($Tx->[:tostr $i]) $LocalTx
  :set ($Rx->[:tostr $i]) $LocalRx
}

Сегодня наглухо отлетел wg с warp на микроте. Через амнезию на пеке работает. Раньше вручную пробивался на порт, работало, в последний раз больше месяца соединение держалось. Сейчас handshake не происходит ни при попытках пробиться вручную, ни при использовании этого скрипта. Очен грустна, помогите, пожалуйста.

@saberana
Copy link

saberana commented Oct 16, 2024

Да, амнезия работает если сменить endpoint на 192, но через wiresock листен порт не подключается теперь.

@nojmannp
Copy link

Да, амнезия работает если сменить endpoint на 192, но через wiresock листен порт не подключается теперь.

Можно по подробнее, что именно в ендпоинте менять на 192?

@wiktorbgu
Copy link

У WARP адреса
162.159.192.x
162.159.193.x
где x от 1 до 9
пробуйте разные IP через клиента AmneziaWG, может как ни один не подключиться, так и можете найти рабочий адрес, зависит от провайдера и его блокировок.

@nojmannp
Copy link

У WARP адреса 162.159.192.x 162.159.193.x где x от 1 до 9 пробуйте разные IP через клиента AmneziaWG, может как ни один не подключиться, так и можете найти рабочий адрес, зависит от провайдера и его блокировок.

Завелось, благодарю!

@m33ph
Copy link

m33ph commented Oct 16, 2024

У WARP адреса 162.159.192.x 162.159.193.x где x от 1 до 9 пробуйте разные IP через клиента AmneziaWG, может как ни один не подключиться, так и можете найти рабочий адрес, зависит от провайдера и его блокировок.

Спасибо, помогло сменить адрес эндпоинта

@LookRay
Copy link

LookRay commented Oct 16, 2024

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

@atolismesh
Copy link

atolismesh commented Oct 17, 2024

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

@molozhavenko
Copy link

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

@andreyr82
Copy link

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

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

@DRON4eg
Copy link

DRON4eg commented Oct 19, 2024

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

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

@allmoney
Copy link

А где изначально брать эти параметры 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
Copy link

HPo1nt commented Oct 22, 2024

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

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

@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, которую мы объявили выше и в которой записан путь к конфигу.

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