mirror of
https://github.com/XTLS/Xray-docs-next.git
synced 2026-10-13 01:38:22 +03:00
159 lines
14 KiB
Markdown
159 lines
14 KiB
Markdown
# WireGuard
|
||
|
||
Реализация протокола WireGuard в пространстве пользователя для установления туннеля WireGuard с удалённым узлом и отправки исходящего трафика через этот туннель.
|
||
|
||
::: danger
|
||
**Протокол WireGuard не предназначен специально для обхода блокировок. При использовании на внешнем уровне его характерные признаки могут привести к блокировке сервера.**
|
||
:::
|
||
|
||
## OutboundConfigurationObject
|
||
|
||
`OutboundConfigurationObject` соответствует элементу `settings` в [`OutboundObject`](../outbound.md).
|
||
|
||
```json
|
||
{
|
||
"outbounds": [
|
||
{
|
||
// ...
|
||
"protocol": "wireguard",
|
||
// [!code focus:18]
|
||
"settings": {
|
||
"secretKey": "CLIENT_PRIVATE_KEY",
|
||
"address": [
|
||
"10.0.0.1",
|
||
"fd59:7153:2388:b5fd:0000:0000:0000:0001",
|
||
"and more..."
|
||
],
|
||
"peers": [
|
||
{
|
||
"endpoint": "SERVER_ADDR",
|
||
"publicKey": "SERVER_PUBLIC_KEY"
|
||
}
|
||
],
|
||
"noKernelTun": false,
|
||
"mtu": 1420,
|
||
"reserved": [0, 0, 0],
|
||
"domainStrategy": "ForceIP"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
> `secretKey`: string
|
||
|
||
Закрытый ключ клиента. Обязательное поле.
|
||
|
||
Пару ключей клиента можно создать командой `xray wg`. Укажите здесь полученный `PrivateKey`; выведенный вместе с ним `Password (PublicKey)` является открытым ключом клиента. Если Xray используется в качестве сервера WireGuard, открытый ключ клиента следует указать в `inbounds[].settings.peers[].publicKey`.
|
||
|
||
> `address`: \[ string \]
|
||
|
||
Задаёт локальные адреса источника для внутренних IP-пакетов, создаваемых исходящим подключением WireGuard, то есть внутренние IP-адреса клиента в туннеле. Можно указать один или несколько адресов IPv4 или IPv6.
|
||
|
||
Значение по умолчанию — `["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"]`.
|
||
|
||
Xray автоматически выбирает адрес источника нужного семейства в зависимости от адреса назначения. Если настроено несколько адресов одного семейства, подходящий адрес выбирается по внутренним правилам.<br>
|
||
Конфигурация входящего подключения на сервере WireGuard должна разрешать эти адреса, и каждый из них должен быть уникальным в конфигурации входящего подключения WireGuard на сервере.
|
||
|
||
> `noKernelTun`: true | false
|
||
|
||
Отключает использование TUN. Значение по умолчанию — `false`; в средах LXC или Docker может потребоваться значение `true`.
|
||
|
||
::: details Нужно ли включать `noKernelTun`?
|
||
При значении `false` Xray автоматически выбирает способ обработки внутренних IP-пакетов: в Linux, если процесс Xray имеет привилегию `CAP_NET_ADMIN`, создаётся TUN-интерфейс и используется сетевой стек ядра; на других платформах или при недостаточных правах используется работающий внутри процесса сетевой стек gVisor. При значении `true` используется только сетевой стек gVisor и TUN-интерфейс не создаётся. Использование TUN обычно обеспечивает более высокую производительность.
|
||
|
||
Этот параметр определяет только способ обработки внутренних IP-пакетов. Сам протокол WireGuard по-прежнему обрабатывается пользовательской реализацией Xray и не связан с модулем WireGuard ядра.
|
||
|
||
Описанное автоматическое определение не всегда работает точно. Например, некоторые среды LXC могут не позволять использовать TUN даже при наличии привилегии `CAP_NET_ADMIN`, из-за чего исходящее подключение не будет работать. В таком случае установите значение `true`.
|
||
|
||
При использовании TUN задействуется таблица маршрутизации IPv6 с номером 10230. Каждое следующее исходящее подключение WireGuard последовательно использует следующую таблицу: например, второе подключение использует таблицу 10231 и так далее.
|
||
|
||
Если на том же компьютере запустить второй экземпляр Xray, нумерация таблиц не продолжится: второй экземпляр также попытается использовать таблицу 10230. Поскольку она уже занята первым экземпляром Xray, подключение установить не удастся. Если запуск нескольких экземпляров необходим, используйте этот параметр для отключения TUN.
|
||
:::
|
||
|
||
> `mtu`: int
|
||
|
||
MTU внутренних IP-пакетов в туннеле WireGuard. Значение по умолчанию — 1420.
|
||
|
||
::: details Расчёт MTU
|
||
Структура пакета WireGuard:
|
||
|
||
```
|
||
- 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-byte encrypted data` — требуемое значение MTU. В зависимости от того, использует ли endpoint IPv4 или IPv6, оно может составлять 1440 (IPv4) или 1420 (IPv6). В особых сетевых условиях значение при необходимости следует дополнительно уменьшить, например ещё на 8 байт для домашнего подключения через PPPoE.
|
||
:::
|
||
|
||
> `reserved` \[ byte \]
|
||
|
||
Три зарезервированных байта протокола WireGuard. По умолчанию все три равны 0; при необходимости укажите требуемые значения.
|
||
|
||
> `peers`: \[ [PeersObject](#peersobject) \]
|
||
|
||
Список серверов WireGuard, каждый элемент которого содержит конфигурацию одного сервера. Если настроено несколько серверов, Xray сопоставляет IP-адрес назначения с `allowedIPs` каждого сервера по префиксу и направляет трафик на совпавший сервер. Таким образом, разные сети назначения можно обслуживать через разные серверы WireGuard.
|
||
|
||
::: details Модель пакетов исходящего подключения Xray WireGuard
|
||
TCP- и UDP-соединения, поступающие в исходящее подключение WireGuard, преобразуются сетевым стеком во внутренние IP-пакеты. Внутренний адрес источника выбирается из `address`, а внутренним адресом назначения становится IP-адрес назначения проксируемого трафика.
|
||
|
||
Xray сопоставляет внутренний адрес назначения с `allowedIPs` каждого пира по префиксу. Совпавший пир шифрует и инкапсулирует пакет, после чего внешний UDP-пакет отправляется на `endpoint` этого пира. Таким образом, `address` задаёт внутренние адреса источника клиента, `allowedIPs` служит таблицей маршрутов назначения для выбора пира, а `endpoint` является адресом сервера для внешнего соединения.
|
||
:::
|
||
|
||
::: tip
|
||
Каждый сервер WireGuard должен разрешать все адреса из `address`, семейство которых совпадает с семейством адресов в его `allowedIPs`: если `allowedIPs` содержит только сети IPv4, необходимо разрешить все IPv4-адреса из `address`; если только сети IPv6 — все IPv6-адреса; если присутствуют сети обоих семейств — все указанные адреса.
|
||
|
||
Если в качестве сервера WireGuard используется Xray, перечислите эти адреса в `inbounds[].settings.peers[].allowedIPs`.
|
||
:::
|
||
|
||
> `domainStrategy`: "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4" | "ForceIP"
|
||
|
||
Управляет стратегией разрешения доменных имён, когда адрес сервера WireGuard или адрес назначения проксируемого трафика является доменным именем.
|
||
|
||
В отличие от большинства прокси-протоколов, WireGuard не позволяет передавать доменные имена в качестве назначения. Поэтому, если входящее назначение задано доменным именем, перед отправкой его необходимо разрешить в IP-адрес. Значения этого поля соответствуют стратегиям `Force` в [sockopt.domainStrategy](../transports/sockopt.md#sockoptobject). Значение по умолчанию — `ForceIP`.
|
||
|
||
В `sockopt.domainStrategy` есть такие параметры, как `UseIP`, но здесь они недоступны: WireGuard должен получить пригодный IP-адрес и не может вернуться к доменному имени при ошибке разрешения `UseIP`.<br>
|
||
Примечание: при применении к проксируемому трафику этот параметр также ограничен настройкой `address`. Например, если задано `ForceIPv6v4`, но в `address` нет адреса IPv6, записи AAAA не будут разрешаться, даже если они существуют для домена назначения.
|
||
|
||
### PeersObject
|
||
|
||
```json
|
||
{
|
||
"endpoint": "SERVER_ADDR",
|
||
"publicKey": "SERVER_PUBLIC_KEY",
|
||
"preSharedKey": "PRE_SHARED_KEY",
|
||
"keepAlive": 0,
|
||
"allowedIPs": ["0.0.0.0/0", "::/0"]
|
||
}
|
||
```
|
||
|
||
> `endpoint`: address
|
||
|
||
Адрес сервера. Обязательное поле.
|
||
|
||
Формат URL:порт, например `engage.cloudflareclient.com:2408`<br>
|
||
Формат IP:порт, например `162.159.192.1:2408` или `[2606:4700:d0::a29f:c001]:2408`
|
||
|
||
> `publicKey`: string
|
||
|
||
Открытый ключ сервера, используемый для проверки. Обязательное поле.
|
||
|
||
Если Xray используется в качестве сервера WireGuard, здесь следует указать `Password (PublicKey)`, соответствующий закрытому ключу сервера в `inbounds[].settings.secretKey`.
|
||
|
||
> `preSharedKey`: string
|
||
|
||
Дополнительный симметричный ключ шифрования. Необязательное поле. Он должен совпадать с ключом в конфигурации сервера.
|
||
|
||
> `keepAlive`: int
|
||
|
||
Интервал отправки клиентом этому серверу пакетов persistent keepalive, в секундах. Они поддерживают возможные сопоставления NAT или состояние межсетевого экрана в периоды простоя. Включайте этот параметр только при необходимости и только на стороне клиента. Значение по умолчанию — `0`, то есть пакеты не отправляются.
|
||
|
||
> `allowedIPs`: string array
|
||
|
||
Задаёт IP-сети назначения, пересылаемые через этот сервер. Каждый элемент указывается в формате CIDR. При наличии только одного сервера поле можно опустить: значение по умолчанию — `["0.0.0.0/0", "::/0"]`, то есть через сервер направляется весь трафик к адресам IPv4 и IPv6. Если настроено несколько серверов, необходимо явно задать `allowedIPs` для каждого из них и распределить сети назначения между соответствующими серверами; Xray выбирает сервер путём сопоставления префикса IP-адреса назначения.
|