Skip to content

WireGuard — sing-box

Конечная точка, а не исходящий

В sing-box 1.11+ WireGuard настраивается как конечная точка, а не как исходящий. Блок располагается в корневом массиве endpoints[] с type: "wireguard" и упоминается в правилах маршрутизации так же, как любой именованный исходящий.

Параметры конечной точки

type: "wireguard" в endpoints[]:

ПолеТипПо умолчаниюДопустимые значенияОписание
systemboolfalsetrue | falseИспользовать TUN-устройство операционной системы вместо пользовательского стека gVisor. Выше пропускная способность, но на большинстве платформ нужны повышенные привилегии.
namestring(auto)<string>Отображаемое имя конечной точки. Используется в статистике и движке маршрутизации.
mtuuint321408<bytes>MTU туннеля. По умолчанию 1408 (на 12 байт меньше, чем 1420 у Xray, потому что sing-box учитывает накладные расходы заголовка IPv6 во внутреннем пакете).
addressbadoption.Listable[netip.Prefix](required)[<CIDR>]Локальные адреса туннеля, список `netip.Prefix`. Требуется хотя бы один элемент.
private_keystring(required)<base64 key>Локальный приватный ключ, 32 байта в кодировке base64.
listen_portuint160 (random)<port>UDP-порт для исходящих пакетов WireGuard. 0 выбирает случайный эфемерный порт.
peers[]WireGuardPeer[][WireGuardPeer]Удалённые пиры.
udp_timeoutbadoption.Duration5m<duration>Тайм-аут простоя нижележащей UDP-сессии, используется таблицей сессий gVisor.
workersint(CPU-based)<int>Число воркеров конвейера шифрования. 0 использует runtime.NumCPU().

Исходный код: option/wireguard.go:9-20 · зафиксировано на v1.13.15 (3708fa1)

Структура также встраивает DialerOptions для нижележащего UDP-сокета — bind_interface, routing_mark, detour и т. д.

peers[]

ПолеТипПо умолчаниюДопустимые значенияОписание
addressstring(unset)<host>Имя хоста или IP пира. Если указано имя хоста, оно разрешается в момент рукопожатия.
portuint1651820<port>UDP-порт пира.
public_keystring(required)<base64 key>Публичный ключ пира, 32 байта в кодировке base64.
pre_shared_keystring(unset)<base64 key>Необязательный pre-shared key (32 байта в base64) для дополнительного подмешивания в рукопожатие.
allowed_ipsbadoption.Listable[netip.Prefix][][<CIDR>]CIDR-диапазоны источника/назначения, маршрутизируемые на этого пира.
persistent_keepalive_intervaluint160<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)

Core Tutorial от Argsment