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