WireGuard — sing-box
Конечная точка, а не исходящий
В sing-box 1.11+ WireGuard настраивается как конечная точка, а не как исходящий. Блок располагается в корневом массиве endpoints[] с type: "wireguard" и упоминается в правилах маршрутизации так же, как любой именованный исходящий.
Параметры конечной точки
type: "wireguard" в endpoints[]:
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
system | bool | false | true | false | Использовать TUN-устройство операционной системы вместо пользовательского стека gVisor. Выше пропускная способность, но на большинстве платформ нужны повышенные привилегии. |
name | string | (auto) | <string> | Отображаемое имя конечной точки. Используется в статистике и движке маршрутизации. |
mtu | uint32 | 1408 | <bytes> | MTU туннеля. По умолчанию 1408 (на 12 байт меньше, чем 1420 у Xray, потому что sing-box учитывает накладные расходы заголовка IPv6 во внутреннем пакете). |
address | badoption.Listable[netip.Prefix] | (required) | [<CIDR>] | Локальные адреса туннеля, список `netip.Prefix`. Требуется хотя бы один элемент. |
private_key | string | (required) | <base64 key> | Локальный приватный ключ, 32 байта в кодировке base64. |
listen_port | uint16 | 0 (random) | <port> | UDP-порт для исходящих пакетов WireGuard. 0 выбирает случайный эфемерный порт. |
peers | []WireGuardPeer | [] | [WireGuardPeer] | Удалённые пиры. |
udp_timeout | badoption.Duration | 5m | <duration> | Тайм-аут простоя нижележащей UDP-сессии, используется таблицей сессий gVisor. |
workers | int | (CPU-based) | <int> | Число воркеров конвейера шифрования. 0 использует runtime.NumCPU(). |
Исходный код: option/wireguard.go:9-20 · зафиксировано на v1.13.15 (3708fa1)
Структура также встраивает DialerOptions для нижележащего UDP-сокета — bind_interface, routing_mark, detour и т. д.
peers[]
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
address | string | (unset) | <host> | Имя хоста или IP пира. Если указано имя хоста, оно разрешается в момент рукопожатия. |
port | uint16 | 51820 | <port> | UDP-порт пира. |
public_key | string | (required) | <base64 key> | Публичный ключ пира, 32 байта в кодировке base64. |
pre_shared_key | string | (unset) | <base64 key> | Необязательный pre-shared key (32 байта в base64) для дополнительного подмешивания в рукопожатие. |
allowed_ips | badoption.Listable[netip.Prefix] | [] | [<CIDR>] | CIDR-диапазоны источника/назначения, маршрутизируемые на этого пира. |
persistent_keepalive_interval | uint16 | 0 | <seconds> | Интервал persistent-keepalive WireGuard. 0 отключает keepalive-пакеты. |
reserved | []uint8 | (empty) | <3 bytes> | Переопределение трёхбайтового зарезервированного поля WireGuard, используемое некоторыми коммерческими провайдерами. |
Исходный код: option/wireguard.go:22-30 · зафиксировано на v1.13.15 (3708fa1)
Примеры
Один пир с системным TUN:
json
{
"endpoints": [
{
"type": "wireguard",
"tag": "wg-ep",
"system": true,
"name": "wg0",
"address": ["10.0.0.2/32", "fd00::2/128"],
"private_key": "<base64-private-key>",
"mtu": 1408,
"peers": [
{
"address": "wg.example.com",
"port": 51820,
"public_key": "<base64-peer-public-key>",
"allowed_ips": ["0.0.0.0/0", "::/0"],
"persistent_keepalive_interval": 25
}
]
}
],
"route": {
"rules": [
{ "domain": ["geosite-private"], "outbound": "wg-ep" }
]
}
}Устройство в пользовательском пространстве (без системного TUN) для запуска без привилегий:
json
{
"endpoints": [
{
"type": "wireguard",
"tag": "wg-userspace",
"system": false,
"address": ["172.16.0.2/24"],
"private_key": "<base64>",
"peers": [
{ "address": "1.2.3.4", "port": 51820, "public_key": "<base64>", "allowed_ips": ["0.0.0.0/0"] }
]
}
]
}Примечания
- В актуальном sing-box WireGuard — всегда конечная точка. Конфигурации времён до 1.11 с
outbound: { type: wireguard }не загрузятся — мигрируйте на модель конечных точек. system: trueиспользует TUN-устройство платформы напрямую. Это быстрее, но требует root / администратора.system: false(по умолчанию) использует пользовательский TCP/IP-стек gVisor — медленнее, зато без привилегий.- Ключи должны быть в base64 (32 «сырых» байта, затем base64). Hex-ключи (которые принимает Xray) здесь не поддерживаются.
- MTU по умолчанию —
1408, а не 1420 из формата на проводе: sing-box резервирует 12 байт под накладные расходы внутреннего IPv6-заголовка.
Сравнение с другими ядрами
- Xray-core сохраняет WireGuard как протокольный исходящий в
outbounds[]сprotocol: "wireguard". Принимает ключи в hex или base64, MTU по умолчанию — 1420. См. WireGuard — Xray-core. - mihomo тоже оставляет его исходящим с упрощённой формой одного пира (
server/port/public-key/allowed-ipsна верхнем уровне) и необязательным блокомamnezia-wg-option. См. WireGuard — mihomo.
Исходный код: option/wireguard.go:9-30 · v1.13.15 (3708fa1)
