sing-box TUN 模式开启方法:全平台步骤、四层验证与断网回滚
简答:开关亮了却上不了网时,先不要反复切换模式:确认客户端与权限,备份配置,再按“虚拟接口→路由→DNS→日志”四层验证。Windows 和 Linux 可使用官方桌面客户端,Android 与 Apple 平台通常通过系统 VPN 权限提供 TUN;手写 JSON 时,首次验证建议将 strict_route 设为 false。
定义:sing-box TUN 模式是通过虚拟网络接口接收系统 IP 流量,再交给 sing-box 的路由、DNS 和出站处理的透明代理方式。
先试这一步:判断客户端、权限和配置类型
本文是第三方使用指南,不代表任何客户端或网络服务的官方页面。sing-box 官方列出的图形客户端包括 Android、Apple 平台,以及同时支持 Windows 和 Linux 的 sing-box for Desktop;桌面客户端支持管理本地或远程配置,并提供 TUN 透明代理功能。可先查看官方图形客户端列表和sing-box for Desktop 说明确认自己的客户端类型。
| 你的情况 | 先做什么 | 成功标准 |
|---|---|---|
| 客户端已有 TUN、VPN 或增强模式开关 | 导入配置,开启开关并批准系统权限 | 日志不出现权限或接口创建错误,应用可以发起请求 |
| 只有 JSON 配置和命令行核心 | 先复制配置备份,再运行 sing-box check -c ./config.json | 检查命令返回成功或没有错误输出 |
| 开启后全部断网 | 立即关闭 TUN,恢复系统代理,再检查路由回环和 DNS | 关闭 TUN 后系统网络恢复 |
开始前记录当前系统代理、默认网卡名称和 DNS 设置,关闭其他 VPN、代理软件、广告拦截 VPN 以及可能占用虚拟网卡的程序。配置文件至少复制一份,例如 Linux 或 macOS 执行 cp ./config.json ./config.backup.json,Windows PowerShell 执行 Copy-Item .\config.json .\config.backup.json。
TUN 和系统代理有什么区别?
系统代理通常是 HTTP 代理设置,只有主动读取系统代理的应用才会使用;官方客户端原理说明指出,许多非 HTTP 的 TCP 程序不会检查系统代理,UDP 和 ICMP 也可能绕过它。TUN 则通过虚拟接口接收更广泛的 IP 流量,因此更适合需要覆盖多个应用的场景。具体原理可参考sing-box 官方客户端代理说明。
但 TUN 只负责接收和转发流量,并不自动保证节点、DNS、路由和出站都正确。若 TUN 已开启但日志没有请求,问题通常在接口或路由;若有请求但域名解析失败,应优先检查 DNS;若 DNS 正常而连接失败,再检查出站、MTU、防火墙和节点配置。
Windows:用官方桌面客户端开启 TUN
- 确认客户端。官方 sing-box for Desktop 支持 Windows 10 及以上版本,具体架构和发行包以当前桌面客户端页面为准。第三方图形客户端的菜单名称可能不同,应以实际界面为准。
- 以管理员权限启动。右键客户端选择“以管理员身份运行”,或用管理员 PowerShell 启动。创建虚拟网卡、写入路由或启用严格网络过滤时,普通权限可能出现
Create TUN device failed或Access is denied。 - 导入配置并开启 TUN。在客户端导入本地或远程 Profile,开启 TUN、VPN 或增强模式。若同时存在“系统代理”和“TUN”两个开关,第一次只开启 TUN,避免同时修改两个变量。
- 检查接口和路由。PowerShell 执行
Get-NetAdapter,查看是否出现新的虚拟适配器;再执行route print,确认默认路由或目标分流路由发生变化。接口名称、路由数量和是否出现 Wintun 适配器会因客户端与配置不同而变化,不要写死名称。 - 检查 DNS 和日志。执行
nslookup example.com,记录输出中的 DNS Server;同时在客户端日志中发起一次网页请求。最终判定不是“开关变绿”,而是日志出现请求记录,并且请求进入预期出站。
官方 TUN 文档说明,Windows 的 strict_route 可减少普通多网卡 DNS 解析造成的泄漏,但也可能使 VirtualBox 等应用在部分情况下无法工作。因此首次验证建议设为 false;确认联网后,再根据实际需求测试 true。相关字段说明见官方 Tun 配置文档。
macOS、iOS、Android:按系统授权开启
Apple 和 Android 图形客户端使用系统提供的网络扩展或 VPN 能力,不能把 Windows 的接口名称、网卡字段和权限步骤原样照搬。官方图形客户端页面将 iOS、macOS、Apple tvOS 归入 sing-box for Apple platforms,将 Android 单独列为 sing-box for Android,入口和可用字段以当前客户端页面为准。
macOS
- 导入本地或远程 Profile,确认配置或客户端模式包含 TUN。
- 点击启动、VPN 或网络扩展开关,在系统弹窗中批准网络扩展。
- 如果使用独立版,按客户端提示安装或启用 Helper Service;如果使用商店版,授权路径以当前系统设置和应用界面为准。
- 打开终端执行
ifconfig查看接口,再执行netstat -rn查看路由,并结合客户端日志验证请求是否进入出站。
iOS
- 导入 Profile,点击启动或 VPN 开关。
- 在系统弹窗中允许添加 VPN 配置。
- 用浏览器发起请求,同时查看客户端日志;若出现
DNS Resolve Failed,先检查 DNS;若出现permission denied,到系统 VPN 设置确认授权。 - 不要把桌面端的
interface_name、Linuxauto_redirect等字段逐项复制到 iOS,移动平台部分接口由系统管理。
Android
- 导入配置并选择要运行的 Profile。
- 点击启动,批准 Android 系统 VPN 权限。Android 图形客户端通常通过
VpnService提供 TUN,不需要手动创建名为tun0的接口。 - 停止其他 VPN、广告拦截 VPN 或热点共享工具,避免多个 VPN 服务争用系统能力。
- 如使用按应用代理,检查客户端提供的应用选择、
include_package或exclude_package设置;这些能力以客户端支持项为准。 - 关闭客户端后,到 Android 系统 VPN 页面确认连接已断开,避免残留 VPN 状态。
平台归属和官方客户端名称可核对官方图形客户端列表;Android 的平台限制和特性可参考Android 客户端特性说明,Apple 平台则参考Apple 平台说明。
Linux:备份、校验,再使用带代理出站的配置
Linux 可以使用官方桌面客户端,也可以直接运行命令行核心。官方桌面客户端支持 Linux x64、arm64 和 armv7l;若用命令行运行,前台进程用 Ctrl+C 停止,systemd 服务才使用 systemctl stop,两种启动方式不要混用。
先备份并检查配置:
cp ./config.json ./config.backup.json
sing-box check -c ./config.json
下面示例展示 TUN、DNS、sniff、hijack-dns、路由和代理出站之间的关系。示例中的 proxy-out 是占位标签,proxy.example.com、端口和认证信息必须替换为你已有且可用的出站参数;没有替换前不要启动。为了便于阅读,配置按字段分段展示:
{
"log": { "level": "info" },
"dns": {
"servers": [
{ "tag": "local-dns", "type": "local" }
]
},
"inbounds": [
{
"type": "tun",
"tag": "tun-in",
"address": ["172.18.0.1/30"],
"auto_route": true,
"strict_route": false,
"dns_mode": "hijack",
"dns_address": ["172.18.0.2"]
}
],
"outbounds": [
{
"type": "socks",
"tag": "proxy-out",
"server": "proxy.example.com",
"server_port": 1080,
"username": "replace-me",
"password": "replace-me"
},
{ "type": "direct", "tag": "direct" }
],
"route": {
"auto_detect_interface": true,
"rules": [
{ "action": "sniff" },
{ "protocol": "dns", "action": "hijack-dns" }
],
"final": "proxy-out"
}
}这里的关键点有四个:auto_route 把默认路由交给 TUN;auto_detect_interface 用于避免出站连接再次回到 TUN;final 明确指向 proxy-out,因此普通流量不会错误地只走直连;DNS 规则前先执行 sniff,再匹配 protocol: dns,避免使用没有匹配条件的无条件 hijack-dns 规则。官方文档将 sniff 定义为协议嗅探动作,将 hijack-dns 定义为把 DNS 请求交给 sing-box DNS 模块,详见官方 Rule Action 文档。
dns_mode 和 dns_address 在官方 Tun 文档中标注为 sing-box 1.14.0 起提供;如果旧核心返回 unknown field 或 decode config error,先保留备份,删除这两个字段后重新执行 sing-box check,或升级到实际支持它们的核心。官方文档还标注:stack 在 1.15.0 已弃用,并计划在 1.17.0 移除;1.15.0 起 sing-tun 使用自身 TCP/IP 栈,因此新配置不应主动加入旧的 stack 字段。具体版本以当前核心检查结果和官方变更日志为准。
Linux 上官方建议在启用 auto_route 时考虑 auto_redirect,它依赖 nftables、内核能力和权限;首次验证可先不添加,确认基本连通后再单独测试。若使用 systemd,示例命令为 sudo systemctl restart sing-box,停止为 sudo systemctl stop sing-box;若前台运行,则只按 Ctrl+C 停止。
四层验证:确认流量确实进入 TUN 和目标出站
| 层级 | 命令或操作 | 判定结论 |
|---|---|---|
| 虚拟接口 | Windows:Get-NetAdapter;Linux:ip link;macOS:ifconfig | 出现启用中的 TUN、VPN 或网络扩展接口,说明接口层已创建 |
| 路由 | Windows:route print;Linux:ip route;macOS:netstat -rn | 目标流量的路由指向 TUN 或系统 VPN 路径,说明路由层已接管 |
| DNS | nslookup example.com,或系统等价命令 | 能完成解析,并记录实际使用的 DNS Server;失败时先排查 DNS |
| 应用与日志 | curl -I https://example.com,同时查看 sing-box 日志 | 出现请求记录、出站选择或成功响应,才可证明应用流量进入 sing-box |
四层分别只能证明接口、路由、DNS 和应用请求中的一部分,不能用“开关已打开”替代验证。假如接口存在但没有日志,请检查应用是否走了其他网络路径;假如日志有请求但 DNS 失败,先检查 DNS;假如 DNS 正常但 TCP 连接失败,再检查出站参数、MTU、防火墙和节点配置。
报错对照:从启动失败到开启后断网
| 报错或现象 | 可能原因 | 处理与撤销 |
|---|---|---|
Create TUN device failed | 权限不足、已有 VPN 占用、系统扩展未批准或客户端不支持当前平台 | 停止其他 VPN;Windows 用管理员权限启动;macOS、iOS、Android 重新批准网络或 VPN 权限;关闭 TUN 后确认系统恢复 |
Access is denied 或 permission denied | 创建接口、写入路由或启用网络扩展所需权限不足 | Windows 使用管理员权限;Linux 按需使用 sudo;Apple 和 Android 到系统设置重新授权 |
DNS Resolve Failed | DNS 服务器不可达、DNS 劫持规则未命中或版本不接受字段 | 先关闭 TUN 恢复网络,执行 nslookup example.com;再检查 sniff、protocol: dns、dns_mode 和 dns_address |
unknown field 或 decode config error | 当前核心不支持配置中的字段,或新旧 DNS 格式不兼容 | 恢复备份,删除报错字段后运行 sing-box check;不要在未检查版本的情况下整份覆盖配置 |
| 开启后全部断网 | strict_route、默认路由、DNS 或出站回环配置不适合当前环境 | 立即关闭 TUN;前台运行按 Ctrl+C,systemd 才执行 sudo systemctl stop sing-box;恢复备份后逐项改动 |
| 端口冲突或已有服务占用 | 其他代理、VPN、DNS 服务或旧的 sing-box 进程仍在运行 | Windows 执行 Get-NetTCPConnection -State Listen;Linux/macOS 执行 ss -lntup 或 lsof -nP -iTCP -sTCP:LISTEN;确认进程后停止对应服务,不要直接结束未知系统进程 |
| 部分应用不通 | 应用使用独立 DNS、绑定特定网卡、不读取系统代理,或受严格路由影响 | 用浏览器和 curl 对比,查看日志;先保持 strict_route: false,再逐项测试应用分流 |
回滚时优先恢复原配置和系统代理,不要直接刷新整套防火墙。Linux 如果启用了 systemd、nftables 或自定义路由,必须按原启动方式清理;不确定规则来源时,先记录 ip route、ip rule 和服务状态,再处理残留。
建议的完整操作顺序
- 确认自己使用的是官方图形客户端、第三方图形客户端还是命令行核心。
- 记录系统代理、默认网卡、DNS 和当前出站配置。
- 关闭其他 VPN、代理和虚拟网卡软件。
- 备份配置,并执行
sing-box check。 - 优先用客户端自带的 TUN 或 VPN 开关;手写配置首次将
strict_route设为false。 - Linux 配置中为普通流量设置真实代理出站,确保
route.final指向该标签,而不是误用direct。 - 先检查接口和路由,再检查 DNS,最后查看日志和
curl请求。 - 确认基本联网后,再单独测试
strict_route、auto_redirect、按应用分流或更复杂的 DNS 规则。
如果仍无法定位,保留脱敏后的平台、客户端类型、核心版本、完整报错、sing-box check 输出和启动方式,再针对单一变量排查。TUN 是否成功与节点、订阅或出站本身是否有效,是两个需要分别验证的问题。
常见问题
sing-box 开启 TUN 后还需要打开系统代理吗?
通常不需要同时开启。TUN 和系统代理是两种不同的流量接管方式,建议先只启用 TUN,确认接口、DNS 和日志请求正常后,再决定是否需要系统代理。
为什么 TUN 开关已经打开,但网页仍然无法访问?
开关亮起只说明客户端尝试启用了 TUN,不代表 DNS、路由、出站和节点都正常。请按接口、路由、DNS、日志四层检查,并确认没有其他 VPN 占用系统网络能力。
strict_route 应该设置为 true 还是 false?
首次验证建议使用 false,先确认基本联网和 DNS 正常;需要更严格地限制未匹配流量或减少 Windows 多网卡 DNS 泄漏时,再根据实际环境测试 true。官方文档提醒,Windows 严格路由可能影响部分 VirtualBox 等应用。
Linux 配置为什么不能把 final 写成 direct?
如果目标是验证代理出站,final 写成 direct 只会证明 TUN 能接收并直连流量,不能证明请求经过代理。应将 final 指向你已有的真实代理出站标签,例如示例中的 proxy-out,并替换服务器、端口和认证信息。
旧核心提示 dns_mode 或 dns_address unknown field 怎么办?
官方 Tun 文档将这两个字段标注为 sing-box 1.14.0 起提供。请先保留备份,删除不兼容字段后重新运行 sing-box check,或升级到实际支持它们的核心;不要直接覆盖原配置。
stack 字段还要不要写?
官方文档将 stack 标注为 sing-box 1.15.0 弃用,并说明计划在 1.17.0 移除;1.15.0 起 sing-tun 使用自身 TCP/IP 栈。新配置通常不应主动加入 stack,旧配置则以当前核心检查结果为准。