Skip to content

WireGuard — Xray-core

В Xray-core есть реализация WireGuard в пользовательском пространстве, работающая как протокол с обеих сторон. На Linux доступен необязательный быстрый путь через kernel-TUN — задайте noKernelTun: true, чтобы вернуться к устройству wireguard-go в пользовательском пространстве.

Настройки

settings для исходящего или входящего с "protocol": "wireguard":

ПолеТипПо умолчаниюДопустимые значенияОписание
noKernelTunboolfalsetrue | falseОтключить быстрый путь kernel-TUN (только Linux) и использовать устройство wireguard-go в пользовательском пространстве. Полезно для запуска без привилегий.
secretKeystring(required)<key>Локальный приватный ключ. Принимаются hex (64 символа), base64 (с выравниванием или без) и URL-safe base64 — см. ParseWireGuardKey в infra/conf/wireguard.go:148.
address[]string[10.0.0.1, fd59:...:0001][<CIDR or IP>]Адрес(а) локального интерфейса. Если не заданы, используются два bogon-IP (один IPv4 и один IPv6).
peers[]*WireGuardPeerConfig[][WireGuardPeerConfig]Удалённые пиры. Для стандартной схемы с одним пиром это список из одного элемента.
mtuint321420<bytes>MTU туннеля. 0 заменяется на 1420 (умолчание проводного формата WireGuard).
reserved[]byte(empty)<3 bytes>Переопределение трёхбайтового зарезервированного поля (используется некоторыми коммерческими реализациями WG). Должно быть пустым или ровно 3 байта.
domainStrategystringforceipforceip | forceipv4 | forceipv6 | forceipv4v6 | forceipv6v4Как разрешаются имена хостов конечных точек пиров. Формы с двойным суффиксом определяют, какое семейство пробуется первым (v4v6 = IPv4, затем откат к IPv6).

Исходный код: infra/conf/wireguard.go:59-69 · зафиксировано на v26.7.28 (5ca6f4b)

peers[]

ПолеТипПо умолчаниюДопустимые значенияОписание
publicKeystring(required)<key>Публичный ключ пира. Принимает те же форматы, что и `secretKey`.
preSharedKeystring(unset)<key>Необязательный PSK для дополнительной защиты рукопожатия.
endpointstring(required for outbound)<host:port>Адрес, по которому достижим пир. Допускается имя хоста; оно повторно разрешается в момент рукопожатия.
keepAliveuint320<seconds>Интервал persistent-keepalive WireGuard. 0 отключает keepalive.
allowedIPs[]string["0.0.0.0/0", "::0/0"][<CIDR>]CIDR источника/назначения, маршрутизируемые на этот пир. Если не задано — по умолчанию все маршруты.
leveluint320<uint32>Уровень политики для этого пира. Только входящий (серверная сторона) — каждый пир регистрируется как пользователь.
emailstring(unset)<string>Идентификатор пира в статистике / журналах. Только входящий (серверная сторона).

Исходный код: infra/conf/wireguard.go:17-26 · зафиксировано на v26.7.28 (5ca6f4b)

Примеры

Исходящий к одному пиру WireGuard:

json
{
  "outbounds": [
    {
      "tag": "wg-out",
      "protocol": "wireguard",
      "settings": {
        "secretKey": "<base64-private-key>",
        "address": ["10.0.0.2/32", "fd00:dead:beef::2/128"],
        "mtu": 1420,
        "peers": [
          {
            "publicKey": "<base64-peer-public-key>",
            "endpoint": "wg.example.com:51820",
            "allowedIPs": ["0.0.0.0/0", "::/0"],
            "keepAlive": 25
          }
        ],
        "domainStrategy": "forceipv4v6"
      }
    }
  ]
}

Исходящий с трёхбайтовым полем reserved (некоторые коммерческие провайдеры):

json
{
  "outbounds": [
    {
      "tag": "wg-cloak",
      "protocol": "wireguard",
      "settings": {
        "secretKey": "<base64>",
        "address": ["172.16.0.2/32"],
        "reserved": [123, 45, 67],
        "peers": [
          { "publicKey": "<base64>", "endpoint": "engage.cloudflareclient.com:2408" }
        ]
      }
    }
  ]
}

Примечания

  • Ключи внутренне нормализуются в hex. На входе принимаются hex (64 hex-символа), base64 с выравниванием и URL-safe base64 (infra/conf/wireguard.go:155-170).
  • address, если его не задать, по умолчанию получает bogon-IP, что годится для чисто исходящих схем, но ломает любой трафик, использующий интерфейс WireGuard как адрес источника. В любой нетривиальной конфигурации задавайте его явно.
  • mtu: 0 молча переписывается в 1420 на этапе сборки (infra/conf/wireguard.go:116-120).
  • reserved должно быть пустым или ровно 3 байта. Массив длиной 2 или 4 не проходит сборку (infra/conf/wireguard.go:122-124).
  • Флаг noKernelTun — единственный способ отказаться от быстрого пути kernel-TUN на Linux. Остальные платформы всегда используют wireguard-go в пользовательском пространстве.
  • В блоке входящего (серверная сторона) каждая запись peers[] регистрируется как пользователь: её email и level попадают в статистику/журналы и политику (infra/conf/wireguard.go:97-113). У исходящего оба поля игнорируются.

Сравнение с другими ядрами

  • sing-box начиная с 1.11+ перевёл WireGuard на модель конечных точек — новые формы полей (private_key, address, peers[], udp_timeout) см. в WireGuard — sing-box.
  • mihomo принимает упрощённую форму с одним пиром (верхнеуровневые server/port/public-key/allowed-ips) или полный список peers: и предоставляет блок amnezia-wg-option для совместимости с AmneziaWG. См. WireGuard — mihomo.

Исходный код: infra/conf/wireguard.go:17-69 · v26.7.28 (5ca6f4b)

Core Tutorial от Argsment