Refactor WireGuard

This commit is contained in:
Meow
2026-09-14 09:21:42 +08:00
parent 46c680b71b
commit 7aa9bea0df
16 changed files with 432 additions and 252 deletions
+1 -1
View File
@@ -62,7 +62,7 @@
У Dokodemo door есть два основных варианта использования: прозрачное проксирование (см. ниже) и перенаправление портов.
Иногда некоторые сервисы не поддерживают прямое проксирование, такое как Socks5, а использование Tun или Tproxy является излишним, и эти сервисы взаимодействуют только с одним IP-адресом и одним портом (например: iperf, сервер Minecraft, конечная точка Wireguard), тогда можно использовать произвольную дверь.
Иногда некоторые сервисы не поддерживают прямое проксирование, такое как Socks5, а использование Tun или Tproxy является излишним, и эти сервисы взаимодействуют только с одним IP-адресом и одним портом (например: iperf, сервер Minecraft, конечная точка WireGuard), тогда можно использовать произвольную дверь.
Например, следующая конфигурация (предполагается, что исходящее соединение по умолчанию является допустимым прокси):
+75 -34
View File
@@ -1,9 +1,9 @@
# Wireguard
# WireGuard
Реализация протокола Wireguard в пользовательском пространстве.
Реализация протокола WireGuard в пространстве пользователя для установления туннеля WireGuard с удалённым узлом и приёма входящего через этот туннель трафика.
::: danger
**Протокол Wireguard не предназначен для обхода блокировок. Использование его на внешнем уровне может привести к блокировке сервера из-за характерных признаков.**
**Протокол WireGuard не предназначен специально для обхода блокировок. При использовании на внешнем уровне его характерные признаки могут привести к блокировке сервера.**
:::
## InboundConfigurationObject
@@ -16,16 +16,20 @@
{
// ...
"protocol": "wireguard",
// [!code focus:10]
// [!code focus:14]
"settings": {
"secretKey": "PRIVATE_KEY",
"secretKey": "SERVER_PRIVATE_KEY",
"peers": [
{
"publicKey": "PUBLIC_KEY",
"allowedIPs": [""]
"publicKey": "CLIENT_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"],
"email": "love@xray.com",
"level": 0
}
],
"mtu": 1420 // необязательно, по умолчанию 1420
"mtu": 1420
}
}
]
@@ -34,48 +38,85 @@
> `secretKey`: string
Приватный ключ. Обязательное поле.
Закрытый ключ сервера. Обязательное поле.
Пару ключей сервера можно создать командой `xray wg`. Укажите здесь полученный `PrivateKey`; выведенный вместе с ним `Password (PublicKey)` является открытым ключом сервера. Если Xray используется в качестве клиента WireGuard, открытый ключ сервера следует указать в `outbounds[].settings.peers[].publicKey`.
> `peers`: \[ [PeersObject](#peersobject) \]
Список клиентов WireGuard, каждый элемент которого содержит конфигурацию одного клиента. Если настроено несколько клиентов, Xray сопоставляет адрес источника расшифрованного внутреннего IP-пакета с `allowedIPs` каждого клиента, чтобы определить, какому клиенту принадлежит трафик.
::: details Сетевая модель входящего подключения Xray WireGuard
В обычной сети WireGuard, включая соединения «точка — точка», «точка — сеть» и «сеть — сеть», обе стороны участвуют в IP-маршрутизации через сетевые интерфейсы третьего уровня.
В отличие от такой схемы, входящее подключение Xray WireGuard не создаёт TUN-интерфейс в системе, а серверу не требуется назначать внутренний IP-адрес туннеля. Расшифрованные внутренние IP-пакеты обрабатываются встроенным сетевым стеком: содержащийся в них TCP- и UDP-трафик преобразуется в прокси-соединения и передаётся системе маршрутизации Xray вместо дальнейшей пересылки исходных IP-пакетов.
Клиент может отправлять как собственный трафик, так и трафик сетей за ним, выступая в роли шлюза. Сервер Xray не является доступным клиентам узлом третьего уровня внутри туннеля и не передаёт исходные IP-пакеты системному ядру для дальнейшей маршрутизации или NAT.
`allowedIPs` используется при обработке пакетов в обоих направлениях: при приёме WireGuard проверяет адрес источника расшифрованного внутреннего IP-пакета, а Xray использует этот адрес для определения клиента; при отправке ответных пакетов WireGuard выбирает соответствующего клиента по внутреннему адресу назначения.
:::
> `mtu`: int
Размер фрагментации уровня tun в Wireguard.
MTU внутренних IP-пакетов в туннеле WireGuard. Значение по умолчанию — 1420.
<details>
<summary>Метод расчета MTU</summary>
Структура пакета Wireguard выглядит следующим образом:
::: details Расчёт MTU
Структура пакета WireGuard:
```
- 20-байтный IPv4-заголовок или 40-байтный IPv6-заголовок
- 8-байтный UDP-заголовок
- 4 байта — тип
- 4 байта — индекс ключа
- 8 байт — nonce
- N байт — зашифрованные данные
- 16 байт — аутентификационный тег
- 20-byte IPv4 header or 40 byte IPv6 header
- 8-byte UDP header
- 4-byte type
- 4-byte key index
- 8-byte nonce
- N-byte encrypted data
- 16-byte authentication tag
```
`N байт — зашифрованные данные` — это и есть значение MTU, которое зависит от того, используется ли IPv4 или IPv6. Значение может быть 1440 (IPv4) или 1420 (IPv6). В особых условиях значение может быть дополнительно уменьшено (например, для PPPoE — минус 8 байт).
`N-byte encrypted data` — требуемое значение MTU. В зависимости от того, использует ли endpoint IPv4 или IPv6, оно может составлять 1440 (IPv4) или 1420 (IPv6). В особых сетевых условиях значение при необходимости следует дополнительно уменьшить, например ещё на 8 байт для домашнего подключения через PPPoE.
:::
</details>
> `peers`: \[ [Peers](#peers) \]
Список серверов peers, каждая запись представляет конфигурацию одного сервера.
### Peers
### PeersObject
```json
{
"publicKey": "PUBLIC_KEY",
"allowedIPs": ["0.0.0.0/0"] // необязательно, по умолчанию ["0.0.0.0/0", "::/0"]
"publicKey": "CLIENT_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"],
"email": "love@xray.com",
"level": 0
}
```
> `publicKey`: string
Публичный ключ для верификации.
Открытый ключ клиента, используемый для проверки. Обязательное поле.
> `allowedIPs`: string array
Если Xray используется в качестве клиента WireGuard, здесь следует указать `Password (PublicKey)`, соответствующий закрытому ключу клиента в `outbounds[].settings.secretKey`.
Разрешенные исходные IP-адреса.
> `preSharedKey`: string
Дополнительный симметричный ключ шифрования. Необязательное поле. Он должен совпадать с ключом в конфигурации клиента.
> `keepAlive`: int
Интервал отправки сервером этому клиенту пакетов persistent keepalive, в секундах. Значение по умолчанию — `0`, то есть пакеты не отправляются.
> `allowedIPs`: \[ string \]
Задаёт IP-адреса или подсети, которые этому клиенту разрешено использовать в качестве адреса источника. Каждый элемент указывается в формате CIDR.
Значение `address` исходящего подключения клиента должно входить в `allowedIPs` соответствующего пира на сервере. Например, если `outbounds[].settings.address` клиента равно `["10.0.0.2"]`, здесь можно указать `["10.0.0.2/32"]`.
В `allowedIPs` можно указывать не только внутренний IP-адрес клиента, но и сети, трафик которых маршрутизируется через этот пир. Например, если сторонний клиент WireGuard служит шлюзом для `192.168.10.0/24`, эту сеть можно добавить сюда; на самом клиенте также необходимо настроить маршрутизацию и включить пересылку IP-пакетов.
При наличии только одного клиента поле можно опустить; значение по умолчанию — `["0.0.0.0/0", "::/0"]`. Если настроено несколько клиентов, необходимо явно указать непересекающиеся значения `allowedIPs`, иначе надёжно различать клиентов будет невозможно.
> `email`: string
Необязательный адрес электронной почты пользователя для различения трафика разных пользователей. Отображается в журналах и статистике.
> `level`: number
Уровень пользователя. Для соединений применяется [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню. Значение по умолчанию — 0.