Wireguard

Стандартная реализация протокола Wireguard.

Предупреждение

Протокол Wireguard не предназначен для обхода блокировок. Использование его на внешнем уровне может привести к блокировке сервера из-за характерных признаков.

OutboundConfigurationObject

{
  "secretKey": "PRIVATE_KEY",
  "address": [
    // необязательно, по умолчанию ["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"]
    "IPv4_CIDR",
    "IPv6_CIDR",
    "and more..."
  ],
  "peers": [
    {
      "endpoint": "ENDPOINT_ADDR",
      "publicKey": "PUBLIC_KEY"
    }
  ],
  "noKernelTun": false,
  "mtu": 1420, // необязательно, по умолчанию 1420
  "reserved": [1, 2, 3],
  "workers": 2, // необязательно, по умолчанию runtime.NumCPU()
  "domainStrategy": "ForceIP"
}

Подсказка

На данный момент протокол Wireguard в режиме outbound не поддерживает настройку streamSettings.

secretKey: string

Личный ключ пользователя. Обязательное поле.

address: string array

Wireguard запускает локальный виртуальный сетевой интерфейс tun. Поддерживается использование одного или нескольких IP-адресов, включая IPv6.

noKernelTun: true | false

По умолчанию система проверяет, работает ли она на Linux и имеет ли пользователь права NET_CAP_ADMIN, чтобы решить, использовать ли системный виртуальный интерфейс. Если он не используется, применяется gvisor. Системный виртуальный интерфейс обеспечивает более высокую производительность. Обратите внимание, что это относится только к обработке IP-пакетов и не связано с ядром Wireguard.

Эта проверка может быть неточной. Например, некоторые виртуализации lxc могут изначально не иметь прав на TUN, что приведет к невозможности работы outbound. В таких случаях можно вручную отключить использование системного интерфейса.

При использовании системного интерфейса IPv6 резервирует таблицу маршрутов с номером 10230. Для каждого нового Wireguard outbound таблица увеличивается на 1 (10231, 10232 и т.д.).

Если на одной машине запускается второй экземпляр Xray, он попытается использовать таблицу 10230, что вызовет конфликт с первым экземпляром. В таких случаях необходимо отключить использование системного интерфейса.

mtu: int

MTU нижнего уровня tun в Wireguard.

Метод расчета MTU

Структура пакета Wireguard:

- 20-байтный заголовок IPv4 или 40-байтный заголовок IPv6
- 8-байтный заголовок UDP
- 4 байта — тип
- 4 байта — индекс ключа
- 8 байт — nonce
- N байт — зашифрованные данные
- 16 байт — аутентификационный тег

N байт — зашифрованные данные — это значение MTU. Для IPv4 оно равно 1440, для IPv6 — 1420. В особых условиях значение может быть уменьшено (например, для PPPoE — минус 8 байт).

reserved [ number ]

Зарезервированные байты Wireguard, заполняются при необходимости.

workers: int

Количество потоков Wireguard. По умолчанию равно количеству ядер процессора.

peers: [ Peers ]

Список серверов Wireguard. Каждая запись представляет конфигурацию одного сервера.

domainStrategy: "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4" | "ForceIP"

В отличие от большинства прокси-протоколов, Wireguard не позволяет передавать доменные имена в качестве целей. Если в качестве цели передается доменное имя, оно разрешается в IP-адрес через встроенный DNS Xray. Подробнее см. поле domainStrategy для outbound Freedom. По умолчанию используется ForceIP.

Примечание: В настройках Freedom доступны опции, такие как UseIP, которые здесь отсутствуют, так как Wireguard требует наличия действительного IP-адреса.

    "dns": {
        "servers": [
            "https://1.1.1.1/dns-query",
            {
                "address": "https://1.1.1.1/dns-query",
                "domains": [
                    "geosite:openai"
                ],
                "skipFallback": true,
                "queryStrategy": "UseIPv6" // Запрос только AAAA-записей
            }
        ],
        "queryStrategy": "UseIP" // Запрос A и AAAA одновременно. Если не указано, используется значение по умолчанию UseIP.
    },

Peers

{
  "endpoint": "ENDPOINT_ADDR",
  "publicKey": "PUBLIC_KEY",
  "preSharedKey": "PRE_SHARED_KEY", // необязательно, по умолчанию "0000000000000000000000000000000000000000000000000000000000000000"
  "keepAlive": 0, // необязательно, по умолчанию 0
  "allowedIPs": ["0.0.0.0/0"] // необязательно, по умолчанию ["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

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

preSharedKey: string

Дополнительный симметричный ключ шифрования.

keepAlive: int

Интервал отправки пакетов heartbeat, в секундах. Значение по умолчанию — 0 (отсутствие heartbeat).

allowedIPs: string array

Wireguard пропускает только трафик с определенных IP-адресов.