Skip to content

TUIC — sing-box

sing-box 实现 TUIC v5 —— 现代的 UUID + 密码形式。历史上的 v4 "token" 形式不支持。TUIC 始终运行在 QUIC 上,因此内嵌的 tls 块是必需的。

入站

type: "tuic" 入站:

字段类型默认值允许值描述
users[]TUICUser[][TUICUser]可接受的用户。每个条目携带一对 UUID + 密码。
congestion_controlstringcubiccubic | new_reno | bbrQUIC 拥塞控制算法。在此设置只影响服务端发出的方向;客户端自行选择。
auth_timeoutbadoption.Duration3s<duration>等待客户端完成鉴权帧的最长时间,超时即关闭 QUIC 连接。
zero_rtt_handshakeboolfalsetrue | false接受 0-RTT TLS 握手。换取略快的连接建立,但首个 0-RTT 载荷窗口缺少重放攻击防护。
heartbeatbadoption.Duration10s<duration>服务端发送 QUIC PING 帧以保持 NAT 映射的间隔。

源码: option/tuic.go:5-13 · 锚定版本 v1.13.11 (553cfa1)

该结构体内嵌 ListenOptionsInboundTLSOptionsContainer必须 配置 TLS。

users[]

字段类型默认值允许值描述
namestring(unset)<string>统计与日志中使用的显示名。
uuidstring(required)<UUID>客户端 UUID。
passwordstring(required)<string>客户端密码。

源码: option/tuic.go:15-19 · 锚定版本 v1.13.11 (553cfa1)

出站

type: "tuic" 出站:

字段类型默认值允许值描述
uuidstring(required)<UUID>服务器接受的用户 UUID。
passwordstring(required)<string>用户密码。
congestion_controlstringcubiccubic | new_reno | bbr客户端到服务端方向的 QUIC 拥塞控制算法。
udp_relay_modestringnativenative | quicUDP 隧道方式。`native` 使用 QUIC 数据报;`quic` 把每个 UDP 包包装在专用 QUIC 流中。`native` 更快;`quic` 在丢弃 QUIC 数据报的中间盒上更稳。
udp_over_streamboolfalsetrue | false使用为不支持数据报的 QUIC 栈引入的 UDP-over-stream 帧。需协商;两端必须一致。
zero_rtt_handshakeboolfalsetrue | false重连时使用 0-RTT TLS 握手。
heartbeatbadoption.Duration10s<duration>QUIC PING 间隔。
networkNetworkList(tcp+udp)tcp | udp | 限定为仅 TCP 或仅 UDP。

源码: option/tuic.go:21-33 · 锚定版本 v1.13.11 (553cfa1)

同时内嵌 DialerOptionsServerOptionsOutboundTLSOptionsContainer

示例

入站:

json
{
  "inbounds": [
    {
      "type": "tuic",
      "tag": "tuic-in",
      "listen": "::",
      "listen_port": 443,
      "users": [
        { "name": "alice", "uuid": "a3482e88-686a-4a58-8126-99c9df64b7bf", "password": "<password>" }
      ],
      "congestion_control": "bbr",
      "auth_timeout": "3s",
      "heartbeat": "10s",
      "tls": {
        "enabled": true,
        "alpn": ["h3"],
        "certificate_path": "/etc/ssl/cert.pem",
        "key_path": "/etc/ssl/key.pem"
      }
    }
  ]
}

出站:

json
{
  "outbounds": [
    {
      "type": "tuic",
      "tag": "tuic-out",
      "server": "example.com",
      "server_port": 443,
      "uuid": "a3482e88-686a-4a58-8126-99c9df64b7bf",
      "password": "<password>",
      "congestion_control": "bbr",
      "udp_relay_mode": "native",
      "zero_rtt_handshake": false,
      "heartbeat": "10s",
      "tls": { "enabled": true, "server_name": "example.com", "alpn": ["h3"] }
    }
  ]
}

说明

  • udp_relay_mode: native 是推荐默认。只有在跨越会用 DPI 丢弃 QUIC 数据报的中间盒时才切到 quic
  • zero_rtt_handshake: true重连 时启用 0-RTT。首次连接仍走 完整握手。该优化在频繁重新解析 / 重连的移动网络上效果最明显。
  • auth_timeout服务端 强制。若入站在该窗口内未看到鉴权帧, QUIC 连接会被静默关闭。
  • udp_over_stream 是兼容性旋钮 —— TUIC 协议本身没有偏差;只是两端 必须一致。

跨内核说明

  • Xray-core 不支持 TUIC。参见 TUIC — Xray-core
  • mihomo 使用 kebab-case 字段名(congestion-controllerudp-relay-mode),保留对旧 token 形式的兼容,并暴露更多 QUIC 调优旋钮(窗口大小、MTU 发现、BBR profile)。它还提供顶层 tuic-server 块作为声明入站的替代方式。参见 TUIC — mihomo

源码: option/tuic.go:5-33 · v1.13.11 (553cfa1)

由 Argsment 出品的 Core Tutorial