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

завел wireguard на клиенте keenetic

Это же совсем другая история.. :-)

У меня сейчас пара клиентов (родственников) работают через кенетики. Как-то оно само оживает.
После установки соединения секунд 20-30 пингов нет.. Потом оживает.
Но это очень волнительно.

Как бы на стороне кенетика автоматизировать отправку nping , с минимальными усилиями..
(т.к. это придется делать удаленно)

@KoKauH
Copy link

KoKauH commented Aug 29, 2024

все было хорошо все работало, босс заходит с РФ к нам в Казахстан по впн и работал в 1с.
теперь проблема зайти не может, наткнулся на статью, сделал все как писалось.

Добавил порт ListenPort = 56779 после DNS правда оставил только MTU

запустил скрит PS, дал разрешение брандмауэр, после этого пробую подключится
и получаю сначала "Получено 92 Б"
потом
"Получено 148 Б"

Клиент ПК - win10
Сервер ubuntu 22.04.3 LTS (порт сервера 51830)

что еще можно предпринять, подскажите)

@Chupakabra303
Copy link

Chupakabra303 commented Aug 29, 2024

Mikrotik или iOS будут?

Есть инструкция как это прикрутить к микротик?

mikrotik что-то типа того

/tool traffic-generator packet-template add \
    name=fuckdpi ip-src=<SRC_IP> \
    udp-src-port=<SRC_PORT> \
    ip-dst=<DST_IP>  \
    udp-dst-port=<DST_PORT> \
    ip-protocol=udp \
    data=random \
    data-byte=1
/tool traffic-generator quick \
    tx-template=fuckdpi \
    duration=1

не факт что заработает но пакет отправится
ну и естественно надо чтобы wg там же запускался

@DayDve @pikasyme @Chupakabra303 @KOTKOKOCC

уважаемые, не оставьте нуба в беде)) можно поподробнее: где смотреть эти src и dst ip и порты?

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

@Venom96669
Copy link

Venom96669 commented Aug 29, 2024

что еще можно предпринять, подскажите)

Поставить на win10 вот эту версию WG:
https://github.com/amnezia-vpn/amneziawg-windows-client/releases

Загрузить в неё тот же конфиг, что и в обычную WG.
Только добавить:

[Interface]
...
Jc = 4
Jmin = 8
Jmax = 32

Дальше подключаться через amneziawg ..

@sergshev
Copy link

Mikrotik или iOS будут?

Есть инструкция как это прикрутить к микротик?

mikrotik что-то типа того

/tool traffic-generator packet-template add \
    name=fuckdpi ip-src=<SRC_IP> \
    udp-src-port=<SRC_PORT> \
    ip-dst=<DST_IP>  \
    udp-dst-port=<DST_PORT> \
    ip-protocol=udp \
    data=random \
    data-byte=1
/tool traffic-generator quick \
    tx-template=fuckdpi \
    duration=1

не факт что заработает но пакет отправится
ну и естественно надо чтобы wg там же запускался

@DayDve @pikasyme @Chupakabra303 @KOTKOKOCC
уважаемые, не оставьте нуба в беде)) можно поподробнее: где смотреть эти src и dst ip и порты?

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

А я сижу думаю, зачем проверка на 192.168.0.0 :)

@ropucyka
Copy link

Так что сами пакеты трафика WireGuard DPI разве не определяет? Только рукопожатие?

@Venom96669
Copy link

Так что сами пакеты трафика WireGuard DPI разве не определяет? Только рукопожатие?

Это сильно проще.
Анализировать не "каждый пакет", а только "несколько первых пакетов при установке соединения".
Возможно - не хватает мощьностей для глубокого анализа каждого пакета.

А возможно - просто понемногу "закручивают гайки". Тестируют..

@azharkov78
Copy link

Недостаточно. Нужно же ещё определить какой он там получился. Поэтому нужно перед get listen-port добавить сброс в 0. Но у меня подобный скрипт не оживляет WG. Данные не принимаются (rx=0).

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

:foreach i in=[find where disabled=no] do={
  :local LocalTx [get $i tx]
  :local LocalRx [get $i rx]
  :local LastHandshake [get $i last-handshake]
  :if (([:tostr $LastHandshake] = "") or (($LastHandshake > [:totime "2m"]) 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
}

У меня он отрабатывает. Но при этом меняет порт для удаленного подключения с телефона из РФ. Надо бы как-то добавить исключения

@vlsi
Copy link

vlsi commented Aug 29, 2024

Но при этом меняет порт для удаленного подключения

У вас на таком peer указано is-responder=yes?
Думаю, логично, если скрипт будет игнорировать такие.
Поправил в том же комментарии: https://gist.github.com/httpsx/76a98ea28e6f3a4ffc947e768c0b6c01?permalink_comment_id=5170553#gistcomment-5170553

Ещё можно каким-нибудь комментарием игнорировать peer'ы.

@pablobablo
Copy link

pablobablo commented Aug 29, 2024

Спасибо! Проверил - работает.
То же самое но скрипт для Linux/MacOs

wgIP="111.222.333.444"
wgPORT=51820
wgListenPort=56123
echo -n ":)" | nc -u -p $wgListenPort $wgIP $wgPORT -w 1

@azharkov78
Copy link

azharkov78 commented Aug 30, 2024

У вас на таком peer указано is-responder=yes?

Сейчас указал. Это пир, который создает сам Mikrotik, когда создаешь "backtohome" :)
Не работает, предыдущая отрабатывает. Может фильтр по имени сделать? что-то вроде name not local*
А если убрать is-responder, то помогает секунды на 4

@Wyou-VK
Copy link

Wyou-VK commented Aug 30, 2024

Добрые люди!
А скажите как заставить на asuswrt этот скрипт крутить?

@Eurgen
Copy link

Eurgen commented Aug 30, 2024

У вас на таком peer указано is-responder=yes?

Сейчас указал. Это пир, который создает сам Mikrotik, когда создаешь "backtohome" :) Не работает, предыдущая отрабатывает. Может фильтр по имени сделать? что-то вроде name not local* А если убрать is-responder, то помогает секунды на 4

Попробуйте заменить строку:

:if (($isResponder = "no" or $isResponder = "") and (([:tostr $LastHandshake] = "") or (($LastHandshake > [:totime "2m"]) and ($Rx->[:tostr $i] = $LocalRx)))) do={
на
:if (($isResponder != true) and (([:tostr $LastHandshake] = "") or (($LastHandshake > [:totime "2m"]) and ($Rx->[:tostr $i] = $LocalRx)))) do={

@Altair200333
Copy link

У меня способ больше не работает, хотя недавно помогало. Смена порта и даже сообщения не помогает, передача виснет на 828b (иногда и в kb уходит и встаёт)

@ropucyka
Copy link

А чем со смартфона пакеты отправить можно?

@koolvn
Copy link

koolvn commented Aug 31, 2024

Добрые люди! А скажите как заставить на asuswrt этот скрипт крутить?

https://gist.github.com/koolvn/993d9c7eb2666dbf15bdccc7d3c4fe33

@HPo1nt
Copy link

HPo1nt commented Aug 31, 2024

А чем со смартфона пакеты отправить можно?

На 4пда советовали hiddify со скриптом варпа.

@morzexxx
Copy link

morzexxx commented Aug 31, 2024

Интересная мысль пришла мне в голову. Если ТСПУ анализируют начало всех соединений (несклько байт) давайте может начнем массово создавать эти соединения и посмотрим что будет? Кто нить может написать такой скрипт?) Что если устроить "бесконечное начало"?

@Andrey52222
Copy link

Подскажите как на кинетик со скриптом все это дело провернуть?

@HPo1nt
Copy link

HPo1nt commented Aug 31, 2024

Подскажите как на кинетик со скриптом все это дело провернуть?

Обновляетесь на 4.2 бета 2, а потом вводите команду ASC в CLI. У меня так варп заработал. Подробнее об этом на форуме кинетика написано.

@Andrey52222
Copy link

Подскажите как на кинетик со скриптом все это дело провернуть?

Обновляетесь на 4.2 бета 2, а потом вводите команду ASC в CLI. У меня так варп заработал. Подробнее об этом на форуме кинетика написано.

Спасибо! Помог)
Жаль только что скорость втрое упала

@terloid
Copy link

terloid commented Sep 1, 2024

warp со скриптом работает, а proton нет. Победил кто нибудь последнего?

@crnomonethis079
Copy link

завел wireguard на клиенте keeneti

Подскажи, пожалуйста, как настроить на keenetic. Ни где не могу найти нормальную инструкцию. Не сильно шарю в этом.

@HPo1nt
Copy link

HPo1nt commented Sep 1, 2024

завел wireguard на клиенте keeneti

Подскажи, пожалуйста, как настроить на keenetic. Ни где не могу найти нормальную инструкцию. Не сильно шарю в этом.

https://telegra.ph/Nastrojka-Amnezia-WireGuard-na-routere-s-KeeneticOS-BLACKTEMPLESPACE-08-19

@crnomonethis079
Copy link

завел wireguard на клиенте keeneti

Подскажи, пожалуйста, как настроить на keenetic. Ни где не могу найти нормальную инструкцию. Не сильно шарю в этом.

https://telegra.ph/Nastrojka-Amnezia-WireGuard-na-routere-s-KeeneticOS-BLACKTEMPLESPACE-08-19

Так вроде кто-то выше писал, что скорость падает от этой настройки, не?

@HPo1nt
Copy link

HPo1nt commented Sep 2, 2024

завел wireguard на клиенте keeneti

Подскажи, пожалуйста, как настроить на keenetic. Ни где не могу найти нормальную инструкцию. Не сильно шарю в этом.

https://telegra.ph/Nastrojka-Amnezia-WireGuard-na-routere-s-KeeneticOS-BLACKTEMPLESPACE-08-19

Так вроде кто-то выше писал, что скорость падает от этой настройки, не?

Скорость упала потому что человек перешёл с телефона/компьютера на проксирование через роутер. Эта настройка делает то же самое, чему посвящена вся эта тема, а именно посылает шум перед хэндшейком, чтобы обойти обнаружение DPI.

@azharkov78
Copy link

У вас на таком peer указано is-responder=yes?

Сейчас указал. Это пир, который создает сам Mikrotik, когда создаешь "backtohome" :) Не работает, предыдущая отрабатывает. Может фильтр по имени сделать? что-то вроде name not local* А если убрать is-responder, то помогает секунды на 4

Попробуйте заменить строку:

:if (($isResponder = "no" or $isResponder = "") and (([:tostr $LastHandshake] = "") or (($LastHandshake > [:totime "2m"]) and ($Rx->[:tostr $i] = $LocalRx)))) do={
на
:if (($isResponder != true) and (([:tostr $LastHandshake] = "") or (($LastHandshake > [:totime "2m"]) and ($Rx->[:tostr $i] = $LocalRx)))) do={

Да, так работает. Но странно, Скрипт отработал, 3-4 секунды и снова трафика нет.

@krusnik01
Copy link

завел wireguard на клиенте keeneti

Подскажи, пожалуйста, как настроить на keenetic. Ни где не могу найти нормальную инструкцию. Не сильно шарю в этом.

https://telegra.ph/Nastrojka-Amnezia-WireGuard-na-routere-s-KeeneticOS-BLACKTEMPLESPACE-08-19

А как сделать без AmneziaWG подобное на KeeneticOS?

@wiktorbgu
Copy link

wiktorbgu commented Sep 2, 2024

Будущие обновления будут тут: https://gist.github.com/wiktorbgu/1f2dfe99837d8f2803483be95814d2e5

Чуть подправил скрипт , чтобы лишний раз не бегал по клиентским пирам, которые подключаются к этому роутеру,
а только где роутер как клиент.
Работает убойно! 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
}

@HPo1nt
Copy link

HPo1nt commented Sep 2, 2024

https://telegra.ph/Nastrojka-Amnezia-WireGuard-na-routere-s-KeeneticOS-BLACKTEMPLESPACE-08-19

А как сделать без AmneziaWG подобное на KeeneticOS?

Вам не обязательно на уровне сервера ставить амнезию, просто укажите параметры ASC в кинетике для любого конфига wireguard и сможете обойти DPI.

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