Skip to content

Instantly share code, notes, and snippets.

@httpsx
Last active November 15, 2024 17:23
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

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

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

@m33ph
Copy link

m33ph commented Oct 16, 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
}

Сегодня наглухо отлетел wg с warp на микроте. Через амнезию на пеке работает. Раньше вручную пробивался на порт, работало, в последний раз больше месяца соединение держалось. Сейчас handshake не происходит ни при попытках пробиться вручную, ни при использовании этого скрипта. Очен грустна, помогите, пожалуйста.

@saberana
Copy link

saberana commented Oct 16, 2024

Да, амнезия работает если сменить endpoint на 192, но через wiresock листен порт не подключается теперь.

@nojmannp
Copy link

Да, амнезия работает если сменить endpoint на 192, но через wiresock листен порт не подключается теперь.

Можно по подробнее, что именно в ендпоинте менять на 192?

@wiktorbgu
Copy link

У WARP адреса
162.159.192.x
162.159.193.x
где x от 1 до 9
пробуйте разные IP через клиента AmneziaWG, может как ни один не подключиться, так и можете найти рабочий адрес, зависит от провайдера и его блокировок.

@nojmannp
Copy link

У WARP адреса 162.159.192.x 162.159.193.x где x от 1 до 9 пробуйте разные IP через клиента AmneziaWG, может как ни один не подключиться, так и можете найти рабочий адрес, зависит от провайдера и его блокировок.

Завелось, благодарю!

@m33ph
Copy link

m33ph commented Oct 16, 2024

У WARP адреса 162.159.192.x 162.159.193.x где x от 1 до 9 пробуйте разные IP через клиента AmneziaWG, может как ни один не подключиться, так и можете найти рабочий адрес, зависит от провайдера и его блокировок.

Спасибо, помогло сменить адрес эндпоинта

@LookRay
Copy link

LookRay commented Oct 16, 2024

Мой случай 162.159.192.1 работает а 162.159.193.x в бане

@atolismesh
Copy link

atolismesh commented Oct 17, 2024

Сloudfl до конца дня 17.10.24 проводит технические работы с серверами WARP

@molozhavenko
Copy link

А как на Андроиде подобный обход сделать?

@andreyr82
Copy link

На этой неделе обход внезапно перестал работать. Пытался менять эндпойнты и порты, пока не помогло. Провайдер Планета.

Тоже самое. Ростелеком. Ярославская область.

@DRON4eg
Copy link

DRON4eg commented Oct 19, 2024

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

[Interface]
...
PreUp = powershell -Command "$wgListenPort = 56123; $wgIP = '***EndpointIP***'; $wgPORT = 35501; $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()"

вдруг кому пригодиться)

нужно только строке PreUp поменять EndpointIP на свой и поменять порт на свой

@isdn-network
Copy link

На хостинге FirstByteRU не отрабатывает как положено. Запускаем скрипт, соединение держится ровно 5 icmp пакетов и валится.

@allmoney
Copy link

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

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

А где эту строку прописывать? Вместо "interface Wireguard0" в конфиге? Добавить просто дальше " wireguard asc 120 23 911 0 0 1 2 3 4"?

@HPo1nt
Copy link

HPo1nt commented Oct 22, 2024

А где эту строку прописывать? Вместо "interface Wireguard0" в конфиге? Добавить просто дальше " wireguard asc 120 23 911 0 0 1 2 3 4"?

Почитайте на официальном форуме кинетика

@xoste49
Copy link

xoste49 commented Oct 22, 2024

я так понял у всех резко wireguard отвалился?

@isdn-network
Copy link

я так понял у всех резко wireguard отвалился?
Похоже на то, по другому начали блочить. Решение отправлять мусор уже не эффективно.

@drizzle-mizzle
Copy link

Написал простенький PowerShell скрипт, автоматически редактирующий конфиги, назначая в них случайный ListenPort, и выполняющий отсылку пакета на сервер.
Делал для себя, так как столкнулся с проблемой, что порт всё равно довольно часто оказывается в блокировке, обычно после того, как ПК уходит в сон с активным подключением к ВПН, после чего просыпается с ним же.
Может кому-то тоже пригодится:

# Путь до папки с конфигами. Ниже указан стандартный путь, по которому WireSockUI копирует загруженные в него конфиги. 
$CONFIGS_PATH = "C:\Users\username\AppData\Roaming\WireSockUI\Configs"

# Новый случайный порт от 56100 до 56499
$NEW_LISTEN_PORT = Get-Random -Minimum 56100 -Maximum 56500

# Перебираем все ".conf" файлы из папки $CONFIGS_PATH
Get-ChildItem -Path $CONFIGS_PATH -Filter *.conf | ForEach-Object {
    $CONFIG_FILE = $_.FullName
    $content = Get-Content $CONFIG_FILE

    # Подменяем порт
    $updatedContent = $content -replace 'ListenPort\s*=.*', "ListenPort = $NEW_LISTEN_PORT"
    Set-Content -Path $CONFIG_FILE -Value $updatedContent

    # Достаём адрес сервера и отправляем пакет
    $ipMatch = Select-String -InputObject $content -Pattern '(?<=Endpoint\s*=\D*)(\d{1,4}\.\d{1,4}\.\d{1,4}\.\d{1,4})(?=:)'
    $WG_IP = $ipMatch.Matches.Groups[1].Value

    $portMatch = Select-String -InputObject $content -Pattern '(?<=Endpoint\s*=.*:)\d*'
    $WG_PORT = $portMatch.Matches.Groups[0].Value

    $EndPoints = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Parse([System.Net.Dns]::GetHostAddresses($WG_IP)), $WG_PORT) 
    $Socket = New-Object System.Net.Sockets.UDPClient $NEW_LISTEN_PORT
    $SendMessage = $Socket.Send([Text.Encoding]::ASCII.GetBytes(":)"), 2, $EndPoints) 
    $Socket.Close() 
}

Можно сохранить скрипт в файл (с расширением .ps1) и либо запускать его вручную при нужде, либо создать задачу в Планировщике Заданий, чтобы он выполнялся при определённых событиях, например при выходе из сна. Разумеется, автоматическое подключение в настройках WireSockUI при этом нужно выключить.

@den1n
Copy link

den1n commented Oct 25, 2024

Доработанный скрипт из поста, который автоматически получает все необходимые данные (IP, порт и прослушиваемый порт) из конфиг файла клиента WireGuard.

$configPath = 'C:\путь\к\конфиг\файлу\клиента\wireguard-client.conf'

$config = Get-Content 'wg0-client-work.conf' | Where-Object { $_ -match '=' } | ConvertFrom-StringData

$endpoint = $config.Endpoint.Split(':')[0]

$port = $config.Endpoint.Split(':')[1]

$entpoints = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Parse([System.Net.Dns]::GetHostAddresses($endpoint)), $port)

$socket = New-Object System.Net.Sockets.UDPClient $config.ListenPort

$socket.Send([Text.Encoding]::ASCII.GetBytes(":)"), 2, $entpoints)

$socket.Close()

@Filipp0vAP
Copy link

Доработанный скрипт из поста, который автоматически получает все необходимые данные (IP, порт и прослушиваемый порт) из конфиг файла клиента WireGuard.

$configPath = 'C:\путь\к\конфиг\файлу\клиента\wireguard-client.conf'

$config = Get-Content 'wg0-client-work.conf' | Where-Object { $_ -match '=' } | ConvertFrom-StringData

$endpoint = $config.Endpoint.Split(':')[0]

$port = $config.Endpoint.Split(':')[1]

$entpoints = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Parse([System.Net.Dns]::GetHostAddresses($endpoint)), $port)

$socket = New-Object System.Net.Sockets.UDPClient $config.ListenPort

$socket.Send([Text.Encoding]::ASCII.GetBytes(":)"), 2, $entpoints)

$socket.Close()

в вашем скрипте ошибка в 3 строчке, вместо 'wg0-client-work.conf' надо передавать переменную $configPath, которую мы объявили выше и в которой записан путь к конфигу.

@Filipp0vAP
Copy link

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

[Interface]
...
PreUp = powershell -Command "$wgListenPort = 56123; $wgIP = '***EndpointIP***'; $wgPORT = 35501; $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()"

вдруг кому пригодиться)

нужно только строке PreUp поменять EndpointIP на свой и поменять порт на свой

Что бы это сработало нужно еще wg разрешить выполнение скриптов
вот тут подробнее об этом написано
https://github.com/WireGuard/wireguard-windows/blob/master/docs/adminregistry.md

@Cr0c81
Copy link

Cr0c81 commented Nov 2, 2024

перестал работать, хз по какой причине, всё также, возможно порт в бане, пробовал другие без результатов

Было такое. Попробуйте поменять значения

Jc = 4
Jmin = 8
Jmax = 32

(в зависимости от реализации механизма подключения - эти значения будут в разных местах) Главное чтобы Jmax было больше Jmin. И Jc в разумных пределах.. От 2 до 500..

Ну и порт очень желательно менять перед каждым подключением. Скрипт должен это учитывать.. Мне помогло.

В какой раздел конфига это писать? Interface или Peer?

@ferdinand-II
Copy link

перестал работать, хз по какой причине, всё также, возможно порт в бане, пробовал другие без результатов

Было такое. Попробуйте поменять значения

Jc = 4
Jmin = 8
Jmax = 32

(в зависимости от реализации механизма подключения - эти значения будут в разных местах) Главное чтобы Jmax было больше Jmin. И Jc в разумных пределах.. От 2 до 500..
Ну и порт очень желательно менять перед каждым подключением. Скрипт должен это учитывать.. Мне помогло.

В какой раздел конфига это писать? Interface или Peer?

Interface

@Vertybird
Copy link

Vertybird commented Nov 13, 2024

Арендовал VPS под ВПН. Пытаюсь подружить WireGuard с TunnlTo. После выполнения скрипта из поста сам WireGuard работает, но при загрузке конфига в TunnlTo соединение не проходит дальше рукопожатия, в логах пишет каждые 5 секунд сообщения типа:

2024-11-13 13:04:40 [TUN]: keep_alive_thread: Sending Handshake packet to WireGuard Server success

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

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