Files
2026-09-17 01:42:16 +08:00

9.7 KiB
Raw Permalink Blame History

WireGuard

Реализация протокола WireGuard в пространстве пользователя для установления туннеля WireGuard с удалённым узлом, инкапсулирующая перенаправленные в это исходящее подключение TCP/UDP-запросы в IP-пакеты и отправляющая их через туннель WireGuard.

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

OutboundConfigurationObject

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

{
  "outbounds": [
    {
      // ...
      "protocol": "wireguard",
      // [!field focus]
      "settings": {
        "secretKey": "CLIENT_PRIVATE_KEY",
        "address": ["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"],
        "peers": [
          {
            "endpoint": "example.com:2408",
            "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.

address: [ string ]

Список локальных IP-адресов интерфейса WireGuard. При наличии нескольких адресов выбирается автоматически в зависимости от пира.

Значение по умолчанию — ["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"].

noKernelTun: true | false

Принудительно отключает системный TUN независимо от результатов автоматического определения. Значение по умолчанию — false; в средах LXC или Docker может потребоваться значение true.

::: details О kernel TUN Способ восстановления IP-пакетов WireGuard обратно в TCP/UDP-нагрузку в Xray. По умолчанию Xray определяет автоматически: в Linux, если процесс Xray имеет привилегию CAP_NET_ADMIN, создаётся TUN-интерфейс и используется сетевой стек ядра; на других платформах или при недостаточных правах используется работающий внутри процесса сетевой стек gVisor. При значении true используется только сетевой стек gVisor и TUN-интерфейс не создаётся. Использование TUN обычно обеспечивает более высокую производительность.

Описанное автоматическое определение не всегда работает точно. Например, некоторые среды LXC могут не позволять использовать TUN даже при наличии привилегии CAP_NET_ADMIN, из-за чего исходящее подключение не будет работать; в таком случае установка noKernelTun в true решает проблему.

Этот параметр определяет только способ обработки внутренних IP-пакетов. Сам протокол WireGuard по-прежнему обрабатывается пользовательской реализацией Xray и не связан с модулем WireGuard ядра.

При использовании 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 для подключения.

remoteDNS: [ string ]

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

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

PeersObject

{
  "endpoint": "example.com:2408",
  "publicKey": "SERVER_PUBLIC_KEY",
  "preSharedKey": "PRE_SHARED_KEY",
  "keepAlive": 0,
  "allowedIPs": ["0.0.0.0/0", "::/0"]
}

endpoint: address

Адрес и порт сервера, может быть IP-адресом или доменным именем. Обязательное поле.

publicKey: string

Открытый ключ пира, используемый для проверки. Обязательное поле.

При создании пары ключей с помощью xray wg здесь указывается выведенный Password (PublicKey).

preSharedKey: string

Дополнительный симметричный ключ шифрования. Необязательное поле. Он должен совпадать с ключом в конфигурации сервера.

keepAlive: int

Интервал отправки клиентом этому серверу пакетов persistent keepalive, в секундах, для поддержания возможных сопоставлений NAT или состояния межсетевого экрана во время простоя. Требуется включать только в особых случаях и только на стороне клиента; значение по умолчанию — 0, то есть пакеты не отправляются.

allowedIPs: [ string ]

Запросы, которые должны пересылаться через этот пир, в формате CIDR. Значение по умолчанию — ["0.0.0.0/0", "::/0"], то есть весь целевой трафик IPv4 и IPv6 пересылается через этот сервер. При совпадении нескольких пиров выбор осуществляется по принципу наибольшего совпадения префикса (longest prefix match).