TUN 接管失败要先分清两件事:系统流量有没有进 TUN,DNS 查询有没有进 sing-box。只看客户端界面显示“已启动”不够,TUN 可以启动成功,系统默认路由、DNS 53 端口和最终 outbound 仍然各走各的。

截至 2026-05-22,sing-box changelog 显示最新稳定版是 1.13.11;官方文档同时列出 1.14.0 线的 dns_modedns_address 等新增字段。排错时先确认自己跑的是哪个版本,别把 1.14 文档字段直接塞进 1.13 配置。

先判断:接管失败卡在哪一层?

现象更可能卡点第一处证据优先动作
TUN 开启后所有网站仍按原网络访问auto_route 没写入默认路由系统路由表没有 TUN 默认路由查 TUN inbound 的 auto_route
开启后断网,日志里反复出现连接失败出站接口回环或物理接口选错outbound 连接又打回 TUNroute.auto_detect_interface / default_interface
浏览器能访问,规则分流完全不命中DNS 没进入 sing-boxDNS 查询不出现在 sing-box 日志dns_modehijack-dns
FakeIP 有返回,但 route 按 IP 兜底域名回写链断了reverse_mapping 没有对应域名查 DNS server、FakeIP range、缓存
未命中规则的连接去了意外出口route.final 留空或写错日志显示命中第一个 outbound显式写 route.final
只有 Windows 多网卡环境异常strict_route、系统 DNS 或虚拟网卡冲突同时存在 Wi-Fi、以太网、VPN/VirtualBox 网卡临时关虚拟网卡并观察 DNS

这张表按“入口 → DNS → route → outbound”排序。入口层没确认之前,不要急着改规则集;DNS 没接进来之前,FakeIP 和域名规则也不会稳定命中。

auto_route 真正接管默认路由了吗?

auto_route 的作用是让 sing-box 自动设置到 TUN 的默认路由。官方 TUN 文档同时提醒:为了避免 TUN 下的路由回环,要设置 route.auto_detect_interfaceroute.default_interfaceoutbound.bind_interface 其中一种。

最小检查顺序如下:

sing-box version
sing-box check -c config.json
sing-box run -c config.json

然后在系统里看默认路由是否变化。Linux 可看 ip route,macOS 可看 route -n get default,Windows 可看 route print。如果 TUN 已启动但默认路由仍指向原网关,问题优先在 auto_route、系统权限或客户端包装层,不在订阅内容。

还有两个字段经常被忽略:route_addressroute_exclude_address。它们在 1.10.0 后替代旧的 inet4_route_addressinet6_route_addressinet4_route_exclude_addressinet6_route_exclude_address。如果你把目标网段写进了 exclude,TUN 看起来开启,实际流量会被排除。

auto_detect_interface、default_interface 和 bind_interface 该留哪一个?

这三个字段都和“出站连接走哪张物理网卡”有关,不是越多越好。排错时只保留一个主控制点。

字段放在哪里适合场景冲突提醒
route.auto_detect_interfaceroute笔记本经常在 Wi-Fi、网线、热点之间切换如果 outbound 已写 bind_interface,它不会生效
route.default_interfaceroute固定服务器、软路由或单网卡设备开了 auto_detect_interface 后会被忽略
outbound.bind_interface单个 outbound只想让某个 outbound 绑定指定网卡多 outbound 配置时容易漏写或写错
route.default_markroute,Linux onlyLinux 策略路由、容器或旁路由环境outbound 已写 routing_mark 时会被忽略

如果你正在排“打开 TUN 后所有请求超时”,先把接口控制简化成一种。常见错误是全局开了 auto_detect_interface,某个 outbound 又绑定了旧网卡名;电脑一换 Wi-Fi 名称或虚拟网卡顺序,连接就落到不存在或不该走的接口。

strict_route 该开还是关?

strict_route 只有在 auto_route 场景下才有排错价值。它不是“增强速度”的开关,而是更严格地处理不支持或未覆盖的网络。

Windows 上,官方文档写明 strict_route 可帮助阻止非 TUN 接口上的 53 端口 DNS 请求,减少多网卡 DNS 行为带来的偏差。代价是某些虚拟网卡或局域网软件可能出问题,文档举到 VirtualBox 这类应用。

Linux 上,strict_route 关闭且没有 auto_redirect 时,ICMP 不会经过 TUN;开启后,不支持的网络可能直接不可达。旁路由、容器、Docker bridge、局域网打印机这类环境,最好先写清 route_exclude_address,再决定是否开严格路由。

设备环境建议起点为什么
普通 Windows 笔记本,多网卡或虚拟网卡少auto_route: true + strict_route: true先减少系统 DNS 从非 TUN 接口出去的变量
Windows 装了 VirtualBox、WSL、公司 VPN 客户端先不开 strict_route,逐项验证虚拟网卡和 WFP 过滤可能互相影响
Linux 桌面单网卡auto_route: true,再看是否需要 auto_redirect默认路由和 nftables 行为要一起看
OpenWrt / 旁路由先写排除网段,再开严格策略局域网设备、网关和 DNS 服务器不能被误导入 TUN
Android VPN 模式关注 route.override_android_vpn官方文档提示 Android VPN 优先级会影响 TUN

DNS hijack 为什么会让 route 看起来“不生效”?

很多 TUN route 故障其实是 DNS 没进 sing-box。浏览器访问域名时,先发生 DNS 查询;如果查询被系统 DNS、路由器 DNS 或另一个客户端处理,sing-box 后面的 dns.rules、FakeIP、reverse_mapping 和域名 route 规则就拿不到完整证据。

1.14.0 文档给 TUN 增加了 dns_modedisablednativehijack。其中 hijack 等于设置接口 DNS,并额外处理 53 端口 DNS 流量。dns_address 如果没有设置,sing-box 会从 TUN address 派生地址并自动做 DNS 处理;如果你手动设置了 dns_address,文档提示自动 hijack 不再应用,需要显式配置 hijack-dns route rule。

1.13 稳定版用户不要直接照抄 dns_mode。更可靠的排查办法是看当前版本是否支持这个字段;不支持时,用 route rule action 里的 hijack-dns 把 DNS 请求交给 sing-box DNS 模块。

一个排错用的逻辑片段可以长这样,字段要按你的版本文档调整:

{
  "route": {
    "rules": [
      {
        "protocol": "dns",
        "action": "hijack-dns"
      }
    ],
    "final": "proxy"
  }
}

关键不在于复制这段,而是确认 DNS 请求出现在 sing-box 日志里。只有 DNS 先进入 sing-box,后面的 FakeIP、域名规则和 route.final 才有判断依据。

FakeIP、reverse_mapping 和 dns.rules 怎么对上?

sing-box 1.12.0 之后,FakeIP 是一个 DNS server 类型,写在 dns.servers 里,示例使用 type: "fakeip" 和独立 tag。官方 FakeIP 页面给出的默认 IPv4 段是 198.18.0.0/15,IPv6 示例是 fc00::/18

FakeIP 常见断链点有三类:

配置点错误写法表现正确检查
dns.servers[].tagDNS rule 指向不存在的 servertag 拼写逐字一致
dns.rules[].action仍按旧字段写 server,导入后行为异常新文档要求 DNS rule 定义 action
reverse_mappingroute 只能看到 FakeIP,回不到域名开启后用同一域名复测日志
FakeIP range与内网、容器网段或保留地址冲突避免和局域网、Docker、虚拟网卡网段重叠
缓存文件重启后规则或映射状态不一致检查 cache/store 相关路径权限

reverse_mapping 的作用是保留 IP 到域名的映射,让路由阶段能从 FakeIP 找回原始域名。官方 DNS 文档也提醒,它在 macOS 这类系统 DNS 已经介入的环境可能有问题。换句话说,macOS 上不要只看 FakeIP 是否返回,还要看 route 日志里是否真的出现原始域名。

route.final 留空为什么危险?

官方 route 文档写得很直接:final 是默认 outbound tag;如果为空,会使用第一个 outbound。排错时这会制造假象:你以为流量按规则走了,实际只是未命中规则后落到了第一个 outbound。

final 显式写出来,至少能让日志更可读:

{
  "route": {
    "auto_detect_interface": true,
    "final": "proxy"
  },
  "outbounds": [
    { "type": "selector", "tag": "proxy", "outbounds": ["direct", "remote"] },
    { "type": "direct", "tag": "direct" }
  ]
}

这段只是示意,真实配置里的 proxydirectremote 必须和 outbounds tag 完全一致。启动失败提示 no such outbound,通常就是 route rule 或 final 引用了不存在的 tag。

如果同一份配置要在 Clash / Singbox / V2Ray 客户端之间迁移,订阅返回格式、出站 tag 和规则语义会有差异。多人维护多端配置时,可以把兼容 Clash / Singbox / V2Ray 的订阅作为同一套输入基线;但 TUN 接管是否成功,仍然要回到本机路由表和 sing-box 日志确认。

日志要开到什么级别才看得出问题?

sing-box log 文档列出的级别包括 tracedebuginfowarnerrorfatalpanic。排 TUN route 接管失败,先用 debug;只有需要看更细的匹配细节时,再短时间切到 trace

{
  "log": {
    "level": "debug",
    "output": "box.log",
    "timestamp": true
  }
}

注意:官方文档说明配置 output 后,日志不会继续写到 console。很多人以为“开了日志但没输出”,其实是日志已经进文件了。

建议抓这几类关键词:

日志线索说明下一步
route 命中某条 rule说明连接进入 route 决策对照 rule index 和 outbound tag
dns 查询没有出现DNS 没进 sing-boxdns_mode / hijack-dns / 系统 DNS
no such outboundtag 引用不存在route.rules[].outboundroute.final
bindinterfacedefault interface出站接口被指定或探测查物理网卡名称是否变化
permissionoperation not permitted系统权限不足查管理员权限、VPN 权限或防火墙
fakeipreverse_mappingFakeIP 链路参与了决策查域名是否能回写到 route

最小复现配置怎么做?

不要直接拿完整订阅排 TUN。完整配置里可能同时有远程规则集、FakeIP、嗅探、策略组、接口绑定、DNS 分流和多个 outbound,变量太多。

更好的办法是临时做一个最小复现:一个 TUN inbound,一个 DNS 入口,一个 direct outbound,一个远端 outbound,一个显式 final。先确认 TUN 接管,再把规则集逐个加回来。

排错记录建议写成一行:

字段示例
sing-box 版本1.13.111.14.0-alpha.x
系统Windows 11 24H2 / macOS 15 / Ubuntu 24.04
TUN 入口auto_route=true, strict_route=false
接口策略route.auto_detect_interface=true
DNS 策略dns_mode=hijackaction=hijack-dns
失败域名固定一个测试域名,不要每次更换
失败时间带 timestamp 的 debug 日志时间

同一个动作能稳定复现,才值得改配置。今天开 TUN、明天换订阅、后天改 DNS,最后很难判断到底是哪一项修好或弄坏了。

修好后怎么验证?

修复不是看界面变绿,而是看四个证据同时成立:

  1. 系统默认路由指向 TUN,或目标网段明确进入 TUN。
  2. DNS 查询出现在 sing-box 日志里,而不是只在系统或路由器日志里。
  3. 连接日志命中预期 route rule;未命中时落到显式 route.final
  4. 出站连接绑定到预期物理接口,没有回到 TUN 或错误虚拟网卡。

复测时用同一个域名、同一个浏览器、同一张网络。不要刚改完 strict_route 就同时切 Wi-Fi,也不要一边清缓存一边换配置文件。TUN 类问题最怕“看起来好了”,但日志证据对不上。

资料来源

相关阅读

FAQ

sing-box TUN 开了为什么浏览器还是走原来的网络?

常见原因是 auto_route 没写入默认路由,或出站流量没有绑定物理网卡,导致请求绕回原接口。先看系统路由表,再看 route.auto_detect_interface

auto_route 和 auto_detect_interface 是一回事吗?

不是。auto_route 负责把默认路由导向 TUN,route.auto_detect_interface 负责让出站连接绑定当前默认物理网卡,主要用于避免 TUN 回环。

strict_route 打开后为什么有些局域网设备访问不了?

strict_route 会让不支持或未覆盖的网络更严格地不可达。Windows 上还能减少多网卡 DNS 泄漏,但 VirtualBox、旁路由或局域网访问要先检查排除网段。

DNS hijack 没生效会造成什么现象?

域名解析仍由系统 DNS 或路由器处理,sing-box 的 DNS 规则、FakeIP 和 reverse_mapping 就拿不到完整链路,表现为 route 规则看似正确但域名流量不命中。

route.final 留空会怎样?

官方文档说明 final 为空时会使用第一个 outbound。排错时最好显式写出兜底 outbound,避免未命中规则的流量被送到错误出口。

sing-box 1.13 能直接使用 dns_mode 吗?

不要直接照抄。官方 changelog 在 1.14 alpha 线加入 dns_modedns_address;如果你还在 1.13 稳定版,应按当前版本支持的 DNS 与 route rule 写法配置。