WireGuard — Xray-core
В Xray-core есть реализация WireGuard в пользовательском пространстве, работающая как протокол с обеих сторон. На Linux доступен необязательный быстрый путь через kernel-TUN — задайте noKernelTun: true, чтобы вернуться к устройству wireguard-go в пользовательском пространстве.
Настройки
settings для исходящего или входящего с "protocol": "wireguard":
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
noKernelTun | bool | false | true | false | Отключить быстрый путь kernel-TUN (только Linux) и использовать устройство wireguard-go в пользовательском пространстве. Полезно для запуска без привилегий. |
secretKey | string | (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] | Удалённые пиры. Для стандартной схемы с одним пиром это список из одного элемента. |
mtu | int32 | 1420 | <bytes> | MTU туннеля. 0 заменяется на 1420 (умолчание проводного формата WireGuard). |
reserved | []byte | (empty) | <3 bytes> | Переопределение трёхбайтового зарезервированного поля (используется некоторыми коммерческими реализациями WG). Должно быть пустым или ровно 3 байта. |
domainStrategy | string | forceip | forceip | forceipv4 | forceipv6 | forceipv4v6 | forceipv6v4 | Как разрешаются имена хостов конечных точек пиров. Формы с двойным суффиксом определяют, какое семейство пробуется первым (v4v6 = IPv4, затем откат к IPv6). |
Исходный код: infra/conf/wireguard.go:59-69 · зафиксировано на v26.7.28 (5ca6f4b)
peers[]
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
publicKey | string | (required) | <key> | Публичный ключ пира. Принимает те же форматы, что и `secretKey`. |
preSharedKey | string | (unset) | <key> | Необязательный PSK для дополнительной защиты рукопожатия. |
endpoint | string | (required for outbound) | <host:port> | Адрес, по которому достижим пир. Допускается имя хоста; оно повторно разрешается в момент рукопожатия. |
keepAlive | uint32 | 0 | <seconds> | Интервал persistent-keepalive WireGuard. 0 отключает keepalive. |
allowedIPs | []string | ["0.0.0.0/0", "::0/0"] | [<CIDR>] | CIDR источника/назначения, маршрутизируемые на этот пир. Если не задано — по умолчанию все маршруты. |
level | uint32 | 0 | <uint32> | Уровень политики для этого пира. Только входящий (серверная сторона) — каждый пир регистрируется как пользователь. |
email | string | (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)
