Skip to content

WireGuard — Xray-core ​

Xray-core 自带用户态 WireGuard 实现,可同时充当协议两端。在 Linux 上还可选启用内核 TUN 快路径 —— 通过 noKernelTun: true 重新切回用户态 wireguard-go 设备。

设置 ​

"protocol": "wireguard" 出站或入站的 settings:

字段类型默认值允许值描述
noKernelTunboolfalsetrue | false禁用内核 TUN 快路径(仅 Linux),改用用户态 wireguard-go 设备。在无权限运行时有用。
secretKeystring(required)<key>本地私钥。接受 hex(64 字符)、base64(带或不带 padding)以及 URL-safe base64 —— 见 infra/conf/wireguard.go:150 的 ParseWireGuardKey。
address[]string[10.0.0.1, fd59:...:0001][<CIDR or IP>]本地接口地址。省略时使用两个 bogon IP(一个 IPv4、一个 IPv6)。
peers[]*WireGuardPeerConfig[][WireGuardPeerConfig]远端 peer。标准的单 peer 场景为一元素列表。
mtuint321420<bytes>隧道 MTU。0 会被替换为 1420(WireGuard 协议默认值)。
reserved[]byte(empty)<3 bytes>三字节 reserved 字段覆盖(部分商业 WG 实现使用)。必须为空或恰好 3 字节。
domainStrategystringforceipforceip | forceipv4 | forceipv6 | forceipv4v6 | forceipv6v4peer endpoint 主机名的解析方式。四字母后缀控制首选哪个家族(v4v6 = 先试 IPv4 再回落 IPv6)。
remoteDNS[]string[1.1.1.1, 1.0.0.1, 2606:4700:4700::1111, 2606:4700:4700::1001][<IP>, …] | ["local"]仅出站。目标为域名时通过隧道查询的 DNS 服务器;随后由 domainStrategy 从应答中选择地址族。条目必须是 IP 字面量。仅含一个 "local" 条目时改用 Xray 自身的 DNS 模块解析。应答按其 TTL 缓存。

源码: infra/conf/wireguard.go:59-70 · 锚定版本 v26.9.9 (52a412d)

peers[] ​

字段类型默认值允许值描述
publicKeystring(required)<key>peer 公钥。可接受的格式与 secretKey 相同。
preSharedKeystring(unset)<key>可选 PSK,为握手提供额外的安全性。
endpointstring(required for outbound)<host:port>联系 peer 的目标地址。允许使用主机名,握手时会重新解析。
keepAliveuint320<seconds>WireGuard persistent-keepalive 间隔。0 表示禁用 keepalive。
allowedIPs[]string["0.0.0.0/0", "::0/0"][<CIDR>]路由到该 peer 的源 / 目的 CIDR。省略时默认全路由。
leveluint320<uint32>该 peer 的策略等级。仅入站(服务端)生效 —— 每个 peer 都会注册为一个用户。
emailstring(unset)<string>统计 / 日志中显示的 peer 标识。仅入站(服务端)生效。

源码: infra/conf/wireguard.go:17-26 · 锚定版本 v26.9.9 (52a412d)

示例 ​

到单个 WireGuard peer 的出站:

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"
      }
    }
  ]
}

带 3 字节 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 字符)、带 padding base64 与 URL-safe base64(infra/conf/wireguard.go:157-172)。
  • 若省略 address,会使用 bogon IP —— 对仅出站场景没问题,但任何使用 WireGuard 接口作为源地址的流量都会失败。在任何非平凡配置中都应当显式设置该字段。
  • mtu: 0 在构建时静默改写为 1420(infra/conf/wireguard.go:117-121)。
  • reserved 必须 为空或恰好 3 字节。长度为 2 或 4 的数组会构建失败(infra/conf/wireguard.go:123-125)。
  • noKernelTun 是 Linux 上禁用内核 TUN 快路径的唯一方式。其他平台始终使用用户态 wireguard-go。
  • 在入站(服务端)块中,每个 peers[] 条目都会注册为一个用户:其 email 与 level 会进入统计 / 日志与策略(infra/conf/wireguard.go:98-114)。在出站中这两个字段会被忽略。

跨内核说明 ​

  • sing-box 把 WireGuard 配置为 端点 —— 字段形态(private_key、address、peers[]、udp_timeout)见 WireGuard — sing-box。
  • mihomo 接受简化的单 peer 形式(顶层 server / port / public-key / allowed-ips)或完整的 peers: 列表,并提供 amnezia-wg-option 块用于 AmneziaWG 兼容。参见 WireGuard — mihomo。

源码: infra/conf/wireguard.go:17-70 · v26.9.9 (52a412d)

由 Argsment 出品的 Core Tutorial