Skip to content

Instantly share code, notes, and snippets.

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

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
Copy Markdown

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
Copy Markdown

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

@Venom96669
Copy link
Copy Markdown

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

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

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

@azharkov78
Copy link
Copy Markdown

Недостаточно. Нужно же ещё определить какой он там получился. Поэтому нужно перед 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
Copy Markdown

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
Copy Markdown

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
Copy Markdown

azharkov78 commented Aug 30, 2024

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

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

@Wyou-VK
Copy link
Copy Markdown

Wyou-VK commented Aug 30, 2024

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

@Eurgen
Copy link
Copy Markdown

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
Copy Markdown

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

@ropucyka
Copy link
Copy Markdown

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

@koolvn
Copy link
Copy Markdown

koolvn commented Aug 31, 2024

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

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

@HPo1nt
Copy link
Copy Markdown

HPo1nt commented Aug 31, 2024

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

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

@morzexxx
Copy link
Copy Markdown

morzexxx commented Aug 31, 2024

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

@Andrey52222
Copy link
Copy Markdown

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

@HPo1nt
Copy link
Copy Markdown

HPo1nt commented Aug 31, 2024

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

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

@Andrey52222
Copy link
Copy Markdown

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

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

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

@terloid
Copy link
Copy Markdown

terloid commented Sep 1, 2024

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

@crnomonethis079
Copy link
Copy Markdown

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

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

@HPo1nt
Copy link
Copy Markdown

HPo1nt commented Sep 1, 2024

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

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

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

@crnomonethis079
Copy link
Copy Markdown

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

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

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

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

@HPo1nt
Copy link
Copy Markdown

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
Copy Markdown

У вас на таком 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
Copy Markdown

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

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

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

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

@wiktorbgu
Copy link
Copy Markdown

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
Copy Markdown

HPo1nt commented Sep 2, 2024

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

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

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

@krusnik01
Copy link
Copy Markdown

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

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

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

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

@HPo1nt
Copy link
Copy Markdown

HPo1nt commented Sep 3, 2024

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

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

@Art-Vis
Copy link
Copy Markdown

Art-Vis commented Sep 3, 2024

Добрый вечер, подскажите пожалуйста, есть решение для iOS ?
А то постоянно, «получено данных: 92б».

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