TL;DR:不要同时改 TUN、系统代理、DNS 和系统 VPN。先保存日志,把入口缩到一个,再逐项打开。能复现,才知道是哪一层冲突。
sing-box 桌面端最麻烦的故障不是「启动失败」,而是启动成功后部分应用没网、浏览器能用但终端不能用、关闭后系统仍然连不上。SFA、第三方 GUI 和手写配置都会遇到同一类问题:多个组件同时接管本机网络。
先判断冲突位置
| 现象 | 优先检查 | 典型原因 |
|---|---|---|
| 开启后全局断网 | TUN 与路由 | 默认路由被改写,返回流量走错 |
| 浏览器可用,终端不可用 | 系统代理 | 终端没有读取系统代理环境 |
| 只有域名访问失败 | DNS | DNS 入站没启动或被其它服务占用 |
| 关闭客户端仍无网络 | 系统残留 | 代理端口、虚拟网卡或 DNS 没恢复 |
| 某个软件单独失败 | 应用网络栈 | 应用自己带代理或固定 DNS |
先做表格里的粗分,不要马上改配置。粗分错了,后面的日志会越看越乱。
需要保留的日志
把日志级别临时调到 info 或 debug,重启一次客户端,复制从启动到故障出现的片段。重点找这些词:
tun: started
route: default interface
dns: exchange failed
bind: address already in use
permission denied
auto route
strict route
bind: address already in use 说明端口被占;permission denied 多半是系统权限;dns: exchange failed 要继续看 DNS 上游和本机监听。不要把整份配置、订阅 URL、密码、token 一起发到公开 issue。
入口一次只留一个
排障时按这个顺序关:
- 关闭系统 VPN 配置或其它网络过滤工具。
- 关闭系统代理,只保留 sing-box 本地端口。
- 关闭 TUN,只用
mixed、socks或http入站测试。 - 浏览器手动填本机端口,确认核心可以转发。
- 再打开 TUN,先不开
strict_route,观察路由表变化。
如果第 4 步正常,第 5 步断网,问题就在 TUN、路由或权限,不在节点参数。需要现成多端配置时,可以使用兼容 Clash / Singbox / V2Ray 的订阅,但排障仍要先确认本机入口是否干净。
Windows、macOS、Linux 的差异
Windows 常见问题是虚拟网卡和管理员权限。客户端没有足够权限时,TUN 可能启动一半,日志显示路由添加失败。先用管理员身份启动一次,确认是不是权限问题,再决定是否安装服务模式。
macOS 更容易被系统 VPN 配置、网络位置和 DNS 缓存影响。关闭客户端后,如果系统代理仍指向 127.0.0.1:7890 之类端口,浏览器会继续报错。去系统设置里确认代理开关,而不是只看客户端按钮。
Linux 要看 NetworkManager、systemd-resolved、iptables/nftables。auto_route 写入的规则可能和容器、Docker、局域网路由冲突。排障时先记录 ip route、ip rule、resolvectl status 的变化。
DNS 不要和 TUN 混在一起猜
很多人看到网页打不开就先改规则,其实是 DNS 没返回。检查三点:
- DNS 入站是否实际监听在配置里的地址。
- 上游 DNS 是否能从当前网络访问。
- 规则里是否把 DNS 请求又送回了同一个代理链路。
如果日志里反复出现 DNS 超时,先临时换成本机可访问的普通上游,等网络恢复后再加复杂分流。
回滚模板
最小可用配置只保留一个本机入口、一个出站和基础日志。确认能转发后,再按顺序加:规则、DNS、TUN、自动路由、严格路由。每加一步都保存一份配置,文件名写清楚日期和改动。
01-mixed-only.yaml
02-add-rules.yaml
03-add-dns.yaml
04-add-tun.yaml
05-add-strict-route.yaml
这样下次出问题可以直接回到上一个版本,而不是重新猜。
相关阅读
FAQ
为什么浏览器能打开,App 不能打开? 可能浏览器读取了系统代理,App 没读;也可能 App 自带代理设置。先用同一个测试地址分别从浏览器和终端访问。
TUN 模式是不是一定比系统代理好? 不是。TUN 覆盖范围更广,但也更容易碰到权限、路由和 DNS 冲突。普通桌面浏览场景,系统代理更容易维护。
关闭客户端后需要重启电脑吗? 不一定。先检查系统代理、DNS 和虚拟网卡。只有确认残留状态无法手动恢复时,再重启网络服务或系统。