Skip to content

Instantly share code, notes, and snippets.

@httpsx
Last active April 25, 2026 13:17
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. Данный гайд помогает обойти эту блокировку.
@khokmoon
Copy link
Copy Markdown

@arzam16 На OpenWRT я добавил строку для обработки pre-up в функцию if_call в /sbin/ifup:
И создал скрипт 41-antidpi в /etc/hotplug.d/iface:

[ pre-up = "$ACTION" ] && {
	if_type=`uci -q get network.$INTERFACE.proto`
	if [ "$if_type" == "wireguard" ]; then
		ip_addr=`uci -q get network.@wireguard_$INTERFACE[0].endpoint_host`
		port=`uci -q get network.@wireguard_$INTERFACE[0].endpoint_port`
		sourceport=`uci -q get network.$INTERFACE.listen_port`
		head -n 20 /dev/random | socat - UDP:$ip_addr:$port,sourceport=$sourceport
		sleep 1
	fi
}

привет. прописал все как у тебя, делаю service network restart выдает ошибки:
/sbin/hotplug-call: /etc/hotplug.d/iface/41-antidpi: line 10: syntax error: unexpected "}" (expecting "then")
не подскажешь где ковырять?

@ggb-st
Copy link
Copy Markdown

ggb-st commented Apr 26, 2025

Сегодня перестал работать. Что случилось? Я изменил ListenPort и в powershell, и в wireguard, но данные все равно не приходят.

Извините за плохой русский, это было переведено

@ABBAD0H
Copy link
Copy Markdown

ABBAD0H commented Apr 28, 2025

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

@ggb-st
Copy link
Copy Markdown

ggb-st commented Apr 28, 2025

Сегодня перестал работать. Что случилось? Я изменил ListenPort и в powershell, и в wireguard, но данные все равно не приходят.

Извините за плохой русский, это было переведено

Я исправил свою проблему, запуская это при каждой перезагрузке:
sudo sysctl -w net.ipv4.ip_forward=1

@FreeSkif
Copy link
Copy Markdown

FreeSkif commented May 2, 2025

В последнее время немного жалею, что повелся на микротик. OpenVpn как-то с отвалами работает, WG не получает (Rx - байты буквально). Способа подружить простенький микрот с WG и прочими так и не нашел.
Буду благодарен за подсказки.

@sergey-v9
Copy link
Copy Markdown

@FreeSkif эти скрипты не помогают?
https://gist.github.com/wiktorbgu/1f2dfe99837d8f2803483be95814d2e5
https://gist.github.com/xdenb43/9adb3cae277ec422dc30196f0d998403

у меня какой-то похожий скрипт на ростелеком стабильно вылечивает подключение к wireguard

@scbdq
Copy link
Copy Markdown

scbdq commented May 15, 2025

друзья, привет! подскажите, пожалуйста, как на iOS исправить эту проблему?

https://github.com/ImMALWARE/bash-warp-generator нашел такое решение, но у меня раз через раз работает

@GazvipeR
Copy link
Copy Markdown

Раньше работало, но сегодня вдруг стало выдавать такую ошибку в power shell, подскажите, пожалуйста, как решить

New-Object : Исключение при вызове ".ctor" с "1" аргументами: "Обычно разрешается только одно использование адреса соке
та (протокол/сетевой адрес/порт)"
строка:6 знак:11
+ $Socket = New-Object System.Net.Sockets.UDPClient $wgListenPort
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

Невозможно вызвать метод для выражения со значением NULL.
строка:7 знак:1
+ $SendMessage = $Socket.Send([Text.Encoding]::ASCII.GetBytes(":)"), 2, ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Невозможно вызвать метод для выражения со значением NULL.
строка:8 знак:1
+ $Socket.Close()
+ ~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

@sertraline
Copy link
Copy Markdown

Сегодня столкнулся с очень интересной ситуацией. Допустим мы имеем Сервер 1 и Сервер 2. Они находятся в разных датацентрах и про существование друг друга не знают. Так вот ситуация была такова что я подключался к впн на Сервере 1, а меня подключало к Серверу 2. Получается так что если вы изначально пингуете один сервер, подключаетесь к впн Сервера 1, затем отключаетесь и пытаетесь подключиться тем же методом к Серверу 2, ТСПУ перенаправит вас на Сервер 1 если вы используете тот же ListenPort. Более того, даже если вы пингуете порт 51820, ТСПУ в ответе отдаст вам порт 51819 который использовался на Сервере 1.

Демонстрация наглядно:
image

Что происходит:

  1. Пингуем TCP на сервер 66.78.*.*:51820
  2. Приходит ответ RCVD с сервера 66.78.*.*:51820 Всё правильно.
  3. Пингуем UDP на сервер 66.78.*.*:51820
  4. Приходит ответ RCVD с совершенно другого датацентра 80.71.*.* с портом 51819.

@Mirone04
Copy link
Copy Markdown

для роутера есть какой вариант такой? Keenetic Miktorik или OpenWRT

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

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

Есть что-то новое?

@sertraline
Copy link
Copy Markdown

Еще интересная информация - по крайней мере в моем регионе блокировки выборочные. Подключение к датацентру в Германии (хецнер) - ОК, без костылей и плясок работает из коробки. Подключение к США (Вашингтон) - ОК. Подключение к Нидерландам блокируется, подключение к Румынии блокируется. Возникает подозрение что блокируются только регионы/датацентры на которых хостят популярные впн сервисы.

@Antmar3000
Copy link
Copy Markdown

Блочат конфиги для мобильного интернета, как раз описанная в посте ситуация "принято 92 Б"
Есть какие-то варианты это обойти на андроид?

@Cr0c81
Copy link
Copy Markdown

Cr0c81 commented Aug 11, 2025

Блочат конфиги для мобильного интернета, как раз описанная в посте ситуация "принято 92 Б" Есть какие-то варианты это обойти на андроид?

https://gist.github.com/httpsx/76a98ea28e6f3a4ffc947e768c0b6c01?permalink_comment_id=5524959#gistcomment-5524959
пробовал?

@GazvipeR
Copy link
Copy Markdown

перестало работать на Windows, есть ещё способы обойти ?

@dmitrydvornichenko
Copy link
Copy Markdown

dmitrydvornichenko commented Sep 19, 2025

перестало работать на Windows, есть ещё способы обойти ?

@GazvipeR
Попробуй слать не два байта, а побольше, и не фиксированный смайлик, а ченить рандомное.
У меня данный способ работает. И еще проверь, всё ли ты сделал правильно?
Сделай всё с самого начала. Поменяй листенпорт, пошли джанк пакет, активируй туннель.

@GazvipeR
Copy link
Copy Markdown

перестало работать на Windows, есть ещё способы обойти ?

@GazvipeR Попробуй слать не два байта, а побольше, и не фиксированный смайлик, а ченить рандомное. У меня данный способ работает. И еще проверь, всё ли ты сделал правильно? Сделай всё с самого начала. Поменяй листенпорт, пошли джанк пакет, активируй туннель.

ничего не помогает))
Может ли быть такое, что что-то с виндой ? Потому что раньше уже такое было, я делал восстановление системы на пару недель назад и всё снова работало. Но сейчас у меня нет точки восстановления и никак не сделать, 2 дня уже гадаю что могло случиться в системе))

@DRON4eg
Copy link
Copy Markdown

DRON4eg commented Sep 24, 2025

это не с виндой связано, видимо под закрутили гайки и отслеживают более глубоко

@dmitrydvornichenko
Copy link
Copy Markdown

перестало работать на Windows, есть ещё способы обойти ?

@GazvipeR Попробуй слать не два байта, а побольше, и не фиксированный смайлик, а ченить рандомное. У меня данный способ работает. И еще проверь, всё ли ты сделал правильно? Сделай всё с самого начала. Поменяй листенпорт, пошли джанк пакет, активируй туннель.

ничего не помогает)) Может ли быть такое, что что-то с виндой ? Потому что раньше уже такое было, я делал восстановление системы на пару недель назад и всё снова работало. Но сейчас у меня нет точки восстановления и никак не сделать, 2 дня уже гадаю что могло случиться в системе))

Это очень просто тестится.
Попробуй раздать инет с мобилы и подключиться.
Если с мобильного инета подключается, а с домашнего - нет, значит провайдер обновил DPI

@koolvn
Copy link
Copy Markdown

koolvn commented Sep 25, 2025

Это очень просто тестится.
Попробуй раздать инет с мобилы и подключиться.
Если с мобильного инета подключается, а с домашнего - нет, значит провайдер обновил DPI

Есть ещё большая вероятность, что впн сервер развёрнут на хостинге, ip-шники которого блочат.
У меня есть серваки в Oracle Cloud, Freakhosting и др. и к ним я могу только с домашенго интернета подключаться, а с мобильного не работает.
К Google Cloud без проблем отовсюду подключается.

@GazvipeR
Copy link
Copy Markdown

перестало работать на Windows, есть ещё способы обойти ?

@GazvipeR Попробуй слать не два байта, а побольше, и не фиксированный смайлик, а ченить рандомное. У меня данный способ работает. И еще проверь, всё ли ты сделал правильно? Сделай всё с самого начала. Поменяй листенпорт, пошли джанк пакет, активируй туннель.

ничего не помогает)) Может ли быть такое, что что-то с виндой ? Потому что раньше уже такое было, я делал восстановление системы на пару недель назад и всё снова работало. Но сейчас у меня нет точки восстановления и никак не сделать, 2 дня уже гадаю что могло случиться в системе))

Это очень просто тестится. Попробуй раздать инет с мобилы и подключиться. Если с мобильного инета подключается, а с домашнего - нет, значит провайдер обновил DPI

что с мобилки, что домашний интернет через витуху, что через wifi, не работает

@mgryaznov
Copy link
Copy Markdown

А я тут пересел на Amnezia на своем VPS и теперь горя не знаю. WG трафик заворачивается в http подобный и никаких блокировок.

@Rkdevelopp
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.

У меня не сработало. Оператор Мегафон. Наверное, прикрыли.

@Andrey52222
Copy link
Copy Markdown

Последнее время на keenetic перестал работат AmneziaWG, есть у кого решение как возобновить работу впн ?

@Otto17
Copy link
Copy Markdown

Otto17 commented Nov 3, 2025

Написал скрипт для Mikrotik (отлаживал на RouterOS 7.20), у меня не блокируется провайдером мой IP с WiReGuard, поэтому в реальных условиях проверить не могу, проверьте, у кого реально происходит блокировка на 92 или 148 байтах.

Скрипт работает так:

  • Если интерфейс включен - сначала выключит его, подождёт 3 секунды для полного отключения, затем включит с обходом DPI
  • Если интерфейс выключен - сразу включит с обходом DPI

Заменить "wgInterface" на название своего WireGuard интерфейса, "wgPeer" на название своего пира, указать в "wgEndpoint" IP и порт "wgPort" WireGuard сервера.

Скрипт "WG_DPI_Bypass":

# Скрипт запуска WireGuard с обходом DPI

:local wgInterface "VPS_WireGuard"
:local wgPeer "VPS_Client" 
:local wgEndpoint "77.77.77.77"
:local wgPort "51820"

# Функция обхода DPI
:local bypassDPI do={
    # Добавляем правило для модификации первых пакетов
    /ip/firewall/mangle/add \
        chain=postrouting \
        dst-address=$1 \
        protocol=udp \
        dst-port=$2 \
        action=change-ttl \
        new-ttl=set:64 \
        limit=1,0:packet \
        comment="WG_DPI_bypass" \
        disabled=no
    
    :delay 100ms
    
    # Включаем интерфейс
    /interface/wireguard/enable $3
    
    :delay 2s
    
    # Удаляем временное правило
    /ip/firewall/mangle/remove [find comment="WG_DPI_bypass"]
}

# Проверяем состояние интерфейса
:if ([/interface/wireguard/get $wgInterface disabled] = false) do={
    # Если интерфейс включен - сначала выключаем
    :log info "WireGuard включен. Выключаем интерфейс..."
    /interface/wireguard/disable $wgInterface
    
    # Ждём полного отключения
    :delay 3s
    
    # Теперь запускаем с обходом DPI
    :log info "Запуск WireGuard с обходом DPI..."
    $bypassDPI $wgEndpoint $wgPort $wgInterface
    :log info "WireGuard с обходом DPI успешно запущен!"
} else={
    # Если интерфейс уже выключен - сразу запускаем с обходом
    :log info "WireGuard выключен. Запуск с обходом DPI..."
    $bypassDPI $wgEndpoint $wgPort $wgInterface
    :log info "WireGuard с обходом DPI успешно запущен!"
}

Можно использовать планировщик:

/system/scheduler/add \
    name="WG_DPI_Bypass" \
    on-event="/system/script/run WG_DPI_Bypass" \
    start-time=startup \
    interval=0 \
    comment="\CE\E1\F5\EE\E4 DPI \E2 WireGuard"

@koshparenkorallen-beep
Copy link
Copy Markdown

Написал скрипт для Mikrotik (отлаживал на RouterOS 7.20), у меня не блокируется провайдером мой IP с WiReGuard, поэтому в данных условиях проверить не могу, проверить, у кого реально происходит блокировка на 92 или 148 байтах.

Скрипт так работает:

  • Если интерфейс включен - сначала выключает его, подождет 3 секунды для полного отключения, затем включает с обходом DPI
  • Если интерфейс выключен - сразу включается с обходом DPI

Замените " wgInterface " на название своего интерфейса WireGuard, " wgPeer " на имя своего пира, укажите в " wgEndpoint " IP и порт " wgPort " сервера WireGuard.

Скрипт "WG_DPI_Bypass":

# Скрипт запуска WireGuard с обходом DPI

:local wgInterface "VPS_WireGuard"
:local wgPeer "VPS_Client" 
:local wgEndpoint "77.77.77.77"
:local wgPort "51820"

# Функция обхода DPI
:local bypassDPI do={
    # Добавляем правило для модификации первых пакетов
    /ip/firewall/mangle/add \
        chain=postrouting \
        dst-address=$1 \
        protocol=udp \
        dst-port=$2 \
        action=change-ttl \
        new-ttl=set:64 \
        limit=1,0:packet \
        comment="WG_DPI_bypass" \
        disabled=no
    
    :delay 100ms
    
    # Включаем интерфейс
    /interface/wireguard/enable $3
    
    :delay 2s
    
    # Удаляем временное правило
    /ip/firewall/mangle/remove [find comment="WG_DPI_bypass"]
}

# Проверяем состояние интерфейса
:if ([/interface/wireguard/get $wgInterface disabled] = false) do={
    # Если интерфейс включен - сначала выключаем
    :log info "WireGuard включен. Выключаем интерфейс..."
    /interface/wireguard/disable $wgInterface
    
    # Ждём полного отключения
    :delay 3s
    
    # Теперь запускаем с обходом DPI
    :log info "Запуск WireGuard с обходом DPI..."
    $bypassDPI $wgEndpoint $wgPort $wgInterface
    :log info "WireGuard с обходом DPI успешно запущен!"
} else={
    # Если интерфейс уже выключен - сразу запускаем с обходом
    :log info "WireGuard выключен. Запуск с обходом DPI..."
    $bypassDPI $wgEndpoint $wgPort $wgInterface
    :log info "WireGuard с обходом DPI успешно запущен!"
}

Можно использовать планировщик:

/system/scheduler/add \
    name="WG_DPI_Bypass" \
    on-event="/system/script/run WG_DPI_Bypass" \
    start-time=startup \
    interval=0 \
    comment="\CE\E1\F5\EE\E4 DPI \E2 WireGuard"

не завелось (
отключилось у меня все в обед сегодня. Билайн. Может еще у кого то есть идеи?

@Otto17
Copy link
Copy Markdown

Otto17 commented Nov 3, 2025

Ожидал, что мала вероятность успеха, на микротике особо не разгуляешься в этом плане.
Когда ранее создавал на VPS сервере WireGuard туннель, сталкивался с блокировкой, но я пошёл изначально другим путём, списался с тех. поддержкой и попросил сменить мне IP из другого диапазона подсетей, это сработало.
Но вот последнюю неделю РКН что-то мутят нездоровое, периодические кратковременные отвалы WireGuard, AnyDesk и некоторых сайтов...
Сегодня столкнулся с новинкой из вида блокировок в WireGuard. Подключаюсь клиентом, вроде всё ОК, но как скорость по VPN поднимается примерно до 20 Мбит/с, бац и отвал, переподключаешься, опять ОК, на низких скоростях работает, а при превышении скорости отвал, попробовал способ из этой статьи - сразу помогло.

@yamixdev
Copy link
Copy Markdown

yamixdev commented Nov 5, 2025

Ожидал, что мала вероятность успеха, на микротике особо не разгуляешься в этом плане. Когда ранее создавал на VPS сервере WireGuard туннель, сталкивался с блокировкой, но я пошёл изначально другим путём, списался с тех. поддержкой и попросил сменить мне IP из другого диапазона подсетей, это сработало. Но вот последнюю неделю РКН что-то мутят нездоровое, периодические кратковременные отвалы WireGuard, AnyDesk и некоторых сайтов... Сегодня столкнулся с новинкой из вида блокировок в WireGuard. Подключаюсь клиентом, вроде всё ОК, но как скорость по VPN поднимается примерно до 20 Мбит/с, бац и отвал, переподключаешься, опять ОК, на низких скоростях работает, а при превышении скорости отвал, попробовал способ из этой статьи - сразу помогло.

Нужно помочь с кодом?

@Otto17
Copy link
Copy Markdown

Otto17 commented Nov 6, 2025

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

@Lxrdknows77
Copy link
Copy Markdown

Lxrdknows77 commented Jan 2, 2026

Такая же проблема. Провайдер на Windows ПК + Iphone МТС сотовый, handshake проходит, а потом висит на нескольких Байт передано получено и без доступа к сети и ни один хост внутри пиров WireGuard не пингуется. Похоже на блокировку. Есть какие то варианты фикса? Сменить порт? Хостинг freakhosting, сервер Германия.

Так же в логах туннеля, даже после успешного подключения и хендшейка, идет флуд такими сообщениями:

2026-01-02 14:30:42.379047: [TUN] [vpn] Retrying handshake with peer 1 (31.56.39.X:51820) because we stopped hearing back after 15 seconds
2026-01-02 14:30:46.399126: [TUN] [vpn] Handshake for peer 1 (31.56.39.X:51820) did not complete after 5 seconds, retrying (try 2)
2026-01-02 14:30:46.399126: [TUN] [vpn] Sending handshake initiation to peer 1 (31.56.39.x:51820)

@Filipp0vAP
Copy link
Copy Markdown

Коллеги, подскажите, кто сталкивался

Успешно применял эту тактику но недавно перестали работать некоторые локации сервиса surfhark
Причем другие локации от этого же сервиса запускаются с этим обходом. Конкретно у меня отлетела Турция из-за чего очень обидно.
Возмонжо бан по ip. Кто нибудь решал такую проблему?

Спасибо!

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