Skip to content

Instantly share code, notes, and snippets.

@httpsx
Last active November 6, 2025 05:30
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. Данный гайд помогает обойти эту блокировку.
@GazvipeR
Copy link

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

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

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

@DRON4eg
Copy link

DRON4eg commented Sep 24, 2025

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

@dmitrydvornichenko
Copy link

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

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

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

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

@koolvn
Copy link

koolvn commented Sep 25, 2025

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

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

@GazvipeR
Copy link

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

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

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

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

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

@mgryaznov
Copy link

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

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

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

@Andrey52222
Copy link

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

@Otto17
Copy link

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

Написал скрипт для 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

Otto17 commented Nov 3, 2025

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

@yamixdev
Copy link

yamixdev commented Nov 5, 2025

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

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

@Otto17
Copy link

Otto17 commented Nov 6, 2025

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

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