sing-box TUN 全局代理:让不走系统代理的软件也走节点

sing-box TUN 全局代理:让不走系统代理的软件也走节点

背景:为什么开了代理还有软件不走节点

如果你用过 sing-box 的客户端,大概率配过 mixed 入站:它在本机起一个 HTTP/SOCKS5 代理端口,再让浏览器、聊天软件去连这个端口。这种方式叫系统代理,前提是软件愿意读系统代理设置。

现实是很多软件不听话:

  • 部分桌面软件、游戏启动器、命令行工具根本不读系统代理设置;
  • UDP 流量、QUIC(基于 UDP 的新一代传输协议)经常绕开 HTTP 代理;
  • DNS 查询默认走系统 DNS,可能先于代理暴露你真正要访问的域名。

TUN 模式换了一个层级解决问题:sing-box 在系统里创建一张虚拟网卡,把本机全部流量先接管进来,再按路由规则决定每条流量走节点、直连还是拦截。软件不需要任何配合,因为它根本不知道流量的下一跳被换了。

前置知识:你已经有一份能跑通的 sing-box 客户端配置(至少有一个可用的出站节点),会编辑 JSON 配置文件。下面的敏感值全部用占位符,换成你自己的。

最小配置:一份能直接用的 TUN 入站

在原有配置里加一个 tun 入站,并补上配套的 DNS 和路由规则。核心就这几处:

{
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "interface_name": "tun0",
      "address": "172.19.0.1/30",
      "auto_route": true,
      "strict_route": true,
      "stack": "system",
      "endpoint_independent_nat": true
    }
  ],
  "dns": {
    "servers": [
      { "tag": "remote-dns", "address": "https://dns.google/dns-query", "detour": "proxy" },
      { "tag": "local-dns", "address": "223.5.5.5", "detour": "direct" }
    ],
    "rules": [
      { "outbound": "any", "server": "local-dns", "disable_cache": true },
      { "rule_set": "geosite-cn", "server": "local-dns" }
    ],
    "final": "remote-dns"
  },
  "route": {
    "rules": [
      { "protocol": "dns", "outbound": "dns-out" },
      { "ip_is_private": true, "outbound": "direct" },
      { "rule_set": "geosite-cn", "outbound": "direct" }
    ],
    "final": "proxy",
    "auto_detect_interface": true
  }
}

几个关键字段说清楚,不用死记,理解了才好排错:

  • auto_route:让 sing-box 自动改系统路由表,把流量引向虚拟网卡。关掉它,TUN 网卡建起来了也没流量进来。
  • strict_route:强制走 sing-box 的路由表,避免系统原有默认路由抢跑。开了它,规则外的流量才真正按你的 final 走。
  • stack:处理数据包的协议栈。system 用系统原生协议栈,性能最好、兼容性最稳;gvisor 是用户态协议栈,不挑系统但性能略低;mixed 是两者混合。先用 system,出问题再换 gvisor 对照。
  • endpoint_independent_nat:让同一内网地址的不同目标端口共用映射,游戏、语音这类多连接应用不断线就靠它。
  • DNS 两条线:国内域名走本地 DNS 直连,国外域名走远程 DNS 且经过节点。DNS 一旦全走直连,就会出现“流量走了节点、域名先泄露”的尴尬;一旦全走节点,国内网站解析反而变慢。

路由规则的写法和直连/拦截的判定逻辑,可以对照站内这篇:sing-box 路由规则完全指南;DNS 分流踩过的坑见:sing-box DNS 分流排错。

各平台的启动前提

TUN 要动路由表和虚拟网卡,权限要求比 mixed 高一档,这是正常的,不是配置错了:

  • Linux:用 root 运行,或给二进制文件 cap_net_admin 能力(setcap cap_net_admin=+ep,路径换成你自己的 sing-box 位置)。桌面发行版用 root 跑最省事,服务器上建议用能力位而不是长期 root。
  • Windows / macOS:以管理员身份运行 sing-box 或图形客户端,首次运行按系统提示确认创建虚拟网卡。
  • Android / iOS:图形客户端里打开 TUN 开关时,系统会弹 VPN 授权框,点允许即可,不用手动改路由。

启动后先验证两件事再谈速度:访问一个境外网站能打开,且 DNS 泄露测试 显示的 DNS 服务器不是你本地运营商的。两项都过,TUN 才算真正接管。

和 mixed 入站怎么选

场景推荐
只给浏览器、聊天软件配代理mixed 就够,改动最小
游戏、终端工具、不读系统代理的软件也要走节点TUN
只想让个别软件走节点,其他全部直连mixed + 按软件设代理
全盘接管、按域名/规则分流TUN + 路由规则

两者可以共存:mixed 和 tun 入站同时开,浏览器走 mixed,别的软件走 TUN,互不干扰。出站分组(自动测速、故障切换)那套逻辑对两者都生效,做法见:节点挂了不断线的做法。

排错清单:按顺序查,别乱改

1. 启动就报错权限不足

先确认是不是权限问题:Linux 看报错里有没有 operation not permitted,有就是缺 cap_net_admin 或没用 root;Windows/macOS 就是没以管理员身份运行。权限问题修好之前,改任何规则都没用。

2. 开了 TUN 直接断网

先关 strict_route 重启试一次。如果恢复,说明是路由表冲突:本机已有 VPN、虚拟机网桥或另一张 TUN 网卡在抢默认路由。先停掉其他 VPN 再开 strict_route,不要两个接管者同时在场。

3. 浏览器能开,个别软件打不开

先把 stack 从 system 换成 gvisor 对照。如果换栈就好,是系统协议栈和该软件的发包方式不合;如果都不行,检查是不是该软件的域名或 IP 被规则送进了直连或拦截,临时把 final 改成节点对照一次。

4. 国内网站变慢或打不开

九成是 DNS 规则问题:国内域名被送去远程 DNS,或远程 DNS 没走节点导致解析结果是境外 IP。按上面“DNS 两条线”的规则核对一遍,重点看 geosite-cn 那条规则集有没有正确加载。

5. 节点服务器 IP 被自己绕进去

你的节点服务器地址必须直连,不能再走 TUN 里的节点,否则流量会自己绕自己。做法是在路由规则里给服务器 IP 加一条直连规则,排在其他规则前面。规则顺序的坑之前单独写过:sing-box 路由顺序排错。

一句话总结

系统代理是“请软件配合”,TUN 是“在网卡层直接接管”。只给浏览器用,前者够了;要让所有软件、UDP 和 DNS 都按同一套规则走,就上 TUN,配好 auto_route、strict_route 和 DNS 两条线,剩下的就是按上面清单逐项排错。

想从零搭一套客户端配置,先看站内这篇:sing-box 完全指南。官方文档在 sing-box 官网,入站字段的完整说明以官方为准。