Skip to content

Instantly share code, notes, and snippets.

@httpsx
Last active October 13, 2024 23:20
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. Данный гайд помогает обойти эту блокировку.
@wiktorbgu
Copy link

wiktorbgu commented Sep 2, 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
}

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

@krusnik01
Copy link

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

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

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

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

@HPo1nt
Copy link

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

Art-Vis commented Sep 3, 2024

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

@JoyZzzzz
Copy link

JoyZzzzz commented Sep 4, 2024

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

Используйте клиент AmneziaWG

@JoyZzzzz
Copy link

JoyZzzzz commented Sep 4, 2024

@GPSMapper @koolvn

у меня скрипт рабоатет нормально, вы не забыли ему chmod +x сделать?

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

@Chupakabra303
Copy link

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

Я нет. Похоже его по ip адресам блочат. Работает только over warp, такой вот слоеный пирог.
Я знал, что рано или поздно мы перейдем и на эту дрянь

@dialbat
Copy link

dialbat commented Sep 5, 2024

fuckdpi

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

@JoyZzzzz
Copy link

JoyZzzzz commented Sep 5, 2024

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

Я нет. Похоже его по ip адресам блочат. Работает только over warp, такой вот слоеный пирог. Я знал, что рано или поздно мы перейдем и на эту дрянь

Я запустил без проблем ProtonVPN с WG конфигом в клиенте AmneziaWG с добавлением
Jc = 3
Jmin = 8
Jmax = 32

@Chupakabra303
Copy link

Chupakabra303 commented Sep 5, 2024

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

Я нет. Похоже его по ip адресам блочат. Работает только over warp, такой вот слоеный пирог. Я знал, что рано или поздно мы перейдем и на эту дрянь

Я запустил без проблем ProtonVPN с WG конфигом в клиенте AmneziaWG с добавлением Jc = 3 Jmin = 8 Jmax = 32

Ну если совсем точно выразиться. У меня не заработали в микротик бесплатные сервера в Нидерландах и США, а вот японские работали, но с диким пингом и лагами. У Вас?

@JoyZzzzz
Copy link

JoyZzzzz commented Sep 5, 2024

Ну если совсем точно выразиться. У меня не заработали в микротик бесплатные сервера в Нидерландах и США, а вот японские работали, но с диким пингом и лагами. У Вас?

У меня роутер Asus с простым wireguard + скрипт для отсылки мусора при соединении и Proton free с локацией в Нидерландах. А на компьютере клиент AmneziaWG. Пинги в районе 50.
И тут в коментах было описание как на микротиках сделать остылку мусора для обхода блокировок.

@Art-Vis
Copy link

Art-Vis commented Sep 6, 2024

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

Я нет. Похоже его по ip адресам блочат. Работает только over warp, такой вот слоеный пирог. Я знал, что рано или поздно мы перейдем и на эту дрянь

Я запустил без проблем ProtonVPN с WG конфигом в клиенте AmneziaWG с добавлением Jc = 3 Jmin = 8 Jmax = 32

Ну если совсем точно выразиться. У меня не заработали в микротик бесплатные сервера в Нидерландах и США, а вот японские работали, но с диким пингом и лагами. У Вас?

Я сменил 4 сервера, и только на 5 заработал WG.
Просто IP в блоке.

@koolvn
Copy link

koolvn commented Sep 6, 2024

@JoyZzzzz попробуй использовать последнюю версию скрипта
https://gist.github.com/koolvn/993d9c7eb2666dbf15bdccc7d3c4fe33#file-wgclient-start

@DisKass
Copy link

DisKass commented Sep 6, 2024

Если от клиента уходит серверу первый пакет на 92б, то может можно посылать мусорный пакет наоборот от сервера любому клиенту, который хоть что-то прислал? Или важно, чтобы именно первый ушедший пакет был не wg'шный?

@morzexxx
Copy link

morzexxx commented Sep 8, 2024

Всем всем всем у кого AmneziaWG не работает по причине Windows 7. Ставите и патчите этим патчером файл C:\Program Files\AmneziaWG\amneziawg.exe
Далее экспорт-импорт конфигов, добавляете в Interface волшебные 3 строчки с вариациями (меняйте эти числа, не нужно их повторять) и наслаждаемся!

@JoyZzzzz
Copy link

JoyZzzzz commented Sep 8, 2024

@koolvn

попробуй использовать последнюю версию скрипта

Новыая версия хорошо отрабатывает и коннектиться быстро.
Но заметил небольшое неудобство которое скорее всего связанно с самой прошивкой Asus. Если у WG подключения нет активных клиентов и трафика, то похоже скрипт не срабатывает. При появлении локального пользователя WG, то все нормально начинает работать.

@alexunderboots
Copy link

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

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

: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 "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
}

на 7.12 не отрабатывает (((

@alexunderboots
Copy link

:local EndpointAddressIP $EndpointAddress
:local EndpointAddressIP [get $i current-endpoint-address]

Верхняя строчка наверное лишняя

@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 И все! ) вот так вот просто. Это добавит мусор в начале подключения и все снова будет работать! )

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

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