速飞云 — 香港高速节点 · 稳定不限速

sing-box TUN 模式开启方法:全平台步骤、四层验证与断网回滚

更新于 2026-11-14 · sufeiyun.shop

简答:开关亮了却上不了网时,先不要反复切换模式:确认客户端与权限,备份配置,再按“虚拟接口→路由→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 开启前快速判断
你的情况先做什么成功标准
客户端已有 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

  1. 确认客户端。官方 sing-box for Desktop 支持 Windows 10 及以上版本,具体架构和发行包以当前桌面客户端页面为准。第三方图形客户端的菜单名称可能不同,应以实际界面为准。
  2. 以管理员权限启动。右键客户端选择“以管理员身份运行”,或用管理员 PowerShell 启动。创建虚拟网卡、写入路由或启用严格网络过滤时,普通权限可能出现 Create TUN device failed 或 Access is denied。
  3. 导入配置并开启 TUN。在客户端导入本地或远程 Profile,开启 TUN、VPN 或增强模式。若同时存在“系统代理”和“TUN”两个开关,第一次只开启 TUN,避免同时修改两个变量。
  4. 检查接口和路由。PowerShell 执行 Get-NetAdapter,查看是否出现新的虚拟适配器;再执行 route print,确认默认路由或目标分流路由发生变化。接口名称、路由数量和是否出现 Wintun 适配器会因客户端与配置不同而变化,不要写死名称。
  5. 检查 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

  1. 导入本地或远程 Profile,确认配置或客户端模式包含 TUN。
  2. 点击启动、VPN 或网络扩展开关,在系统弹窗中批准网络扩展。
  3. 如果使用独立版,按客户端提示安装或启用 Helper Service;如果使用商店版,授权路径以当前系统设置和应用界面为准。
  4. 打开终端执行 ifconfig 查看接口,再执行 netstat -rn 查看路由,并结合客户端日志验证请求是否进入出站。

iOS

  1. 导入 Profile,点击启动或 VPN 开关。
  2. 在系统弹窗中允许添加 VPN 配置。
  3. 用浏览器发起请求,同时查看客户端日志;若出现 DNS Resolve Failed,先检查 DNS;若出现 permission denied,到系统 VPN 设置确认授权。
  4. 不要把桌面端的 interface_name、Linux auto_redirect 等字段逐项复制到 iOS,移动平台部分接口由系统管理。

Android

  1. 导入配置并选择要运行的 Profile。
  2. 点击启动,批准 Android 系统 VPN 权限。Android 图形客户端通常通过 VpnService 提供 TUN,不需要手动创建名为 tun0 的接口。
  3. 停止其他 VPN、广告拦截 VPN 或热点共享工具,避免多个 VPN 服务争用系统能力。
  4. 如使用按应用代理,检查客户端提供的应用选择、include_package 或 exclude_package 设置;这些能力以客户端支持项为准。
  5. 关闭客户端后,到 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 路径,说明路由层已接管
DNSnslookup example.com,或系统等价命令能完成解析,并记录实际使用的 DNS Server;失败时先排查 DNS
应用与日志curl -I https://example.com,同时查看 sing-box 日志出现请求记录、出站选择或成功响应,才可证明应用流量进入 sing-box

四层分别只能证明接口、路由、DNS 和应用请求中的一部分,不能用“开关已打开”替代验证。假如接口存在但没有日志,请检查应用是否走了其他网络路径;假如日志有请求但 DNS 失败,先检查 DNS;假如 DNS 正常但 TCP 连接失败,再检查出站参数、MTU、防火墙和节点配置。

报错对照:从启动失败到开启后断网

sing-box TUN 常见报错与处理方法
报错或现象可能原因处理与撤销
Create TUN device failed权限不足、已有 VPN 占用、系统扩展未批准或客户端不支持当前平台停止其他 VPN;Windows 用管理员权限启动;macOS、iOS、Android 重新批准网络或 VPN 权限;关闭 TUN 后确认系统恢复
Access is denied 或 permission denied创建接口、写入路由或启用网络扩展所需权限不足Windows 使用管理员权限;Linux 按需使用 sudo;Apple 和 Android 到系统设置重新授权
DNS Resolve FailedDNS 服务器不可达、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 和服务状态,再处理残留。

建议的完整操作顺序

  1. 确认自己使用的是官方图形客户端、第三方图形客户端还是命令行核心。
  2. 记录系统代理、默认网卡、DNS 和当前出站配置。
  3. 关闭其他 VPN、代理和虚拟网卡软件。
  4. 备份配置,并执行 sing-box check。
  5. 优先用客户端自带的 TUN 或 VPN 开关;手写配置首次将 strict_route 设为 false。
  6. Linux 配置中为普通流量设置真实代理出站,确保 route.final 指向该标签,而不是误用 direct。
  7. 先检查接口和路由,再检查 DNS,最后查看日志和 curl 请求。
  8. 确认基本联网后,再单独测试 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,旧配置则以当前核心检查结果为准。

相关阅读

参考资料

  1. Tun - sing-box
  2. Rule Action - sing-box
  3. Client - sing-box
  4. Graphical Clients - sing-box
  5. sing-box for Desktop - sing-box
  6. Features - sing-box Android
  7. Apple platforms - sing-box
  8. Change Log - sing-box