Files
XTLS_Xray-docs-next/docs/ru/config/outbounds/wireguard.md
T

16 KiB

WireGuard

Реализация протокола WireGuard в пространстве пользователя для установления туннеля WireGuard с удалённым узлом и отправки исходящего трафика через этот туннель.

::: danger Протокол WireGuard не предназначен специально для обхода блокировок. При использовании на внешнем уровне его характерные признаки могут привести к блокировке сервера. :::

OutboundConfigurationObject

OutboundConfigurationObject соответствует элементу settings в OutboundObject.

{
  "outbounds": [
    {
      // ...
      "protocol": "wireguard",
      // [!code focus:25]
      "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",
            "allowedIPs": ["0.0.0.0/0", "::/0"]
            // ...
          }
        ],
        "noKernelTun": false,
        "mtu": 1420,
        "reserved": [0, 0, 0],
        "remoteDNS": [
          "1.1.1.1",
          "1.0.0.1",
          "2606:4700:4700::1111",
          "2606:4700:4700::1001"
        ]
      }
    }
  ]
}

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 автоматически выбирает адрес источника нужного семейства в зависимости от адреса назначения. Если настроено несколько адресов одного семейства, подходящий адрес выбирается по внутренним правилам.
Конфигурация входящего подключения на сервере 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 ]

Список серверов 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. :::

remoteDNS: [ string ]

Используется для разрешения целевых доменных имён проксируемого трафика. Каждый элемент должен быть IP-адресом. Значение по умолчанию — ["1.1.1.1", "1.0.0.1", "2606:4700:4700::1111", "2606:4700:4700::1001"].

DNS-запросы отправляются через туннель WireGuard; IP-адрес каждого сервера должен входить в allowedIPs одного из пиров и быть доступен через туннель.

::: details remoteDNS и targetStrategy В отличие от других исходящих подключений, целью внутри туннеля WireGuard должен быть IP-адрес. Если целью проксируемого запроса является доменное имя, параметр targetStrategy исходящего подключения определяет, какой DNS используется для его разрешения:

  • AsIs: используется remoteDNS.
  • UseIP*: сначала используется встроенный DNS Xray, а при ошибке разрешения выполняется переход на remoteDNS.
  • ForceIP*: используется встроенный DNS Xray; ошибка разрешения сразу приводит к ошибке подключения.

Результаты UseIP* или ForceIP* должны содержать хотя бы один IP-адрес того же семейства, что и один из адресов в address; иначе соединение завершится ошибкой. Несовпадение семейств адресов не считается ошибкой разрешения и не запускает никакой переход на резервный вариант.

Что выбрать? remoteDNS работает сразу, без дополнительной настройки, и отправляет запросы через туннель WireGuard, что обычно позволяет получить результаты CDN, соответствующие расположению выхода из туннеля. Для достижения того же результата с помощью встроенного DNS Xray обычно требуется дополнительно настроить DNS-серверы и правила маршрутизации. Однако если встроенный DNS ранее уже разрешил целевое доменное имя — например, при использовании схемы RealIP с TUN/TProxy либо при включённом сниффинге и значении routing.domainStrategy, отличном от AsIs, — рекомендуется использовать встроенный DNS Xray, чтобы избежать дополнительной задержки RTT из-за повторного разрешения. :::

PeersObject

{
  "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
Формат 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 ]

Задаёт IP-сети назначения, пересылаемые через этот сервер. Каждый элемент указывается в формате CIDR. При наличии только одного сервера поле можно опустить: значение по умолчанию — ["0.0.0.0/0", "::/0"], то есть через сервер направляется весь трафик к адресам IPv4 и IPv6. Если настроено несколько серверов, необходимо явно задать allowedIPs для каждого из них и распределить сети назначения между соответствующими серверами; Xray выбирает сервер путём сопоставления префикса IP-адреса назначения.