sing-box连接成功但无法上网:按流量链路逐层排查
简答:sing-box显示连接成功不等于流量已经被接管。先用一个网页或命令确认代理/TUN是否生效,再依次检查 DNS、Route 规则、单节点连接和系统冲突;完成后应能明确是代理未接管、解析失败、路由误判还是节点问题。
定义:“sing-box连接成功但无法上网”是指客户端或服务进程显示运行、节点可能已建立连接,但浏览器或其他应用的 DNS、TCP、HTTPS 或 UDP 流量没有得到正确转发。
先做这组最短检查:不要同时改五项配置
先关闭 sing-box,确认当前 Wi-Fi 或移动网络本身可以打开一个普通 HTTPS 页面;再启动 sing-box,只改一个变量并复测一次。客户端显示运行中、VPN 图标出现、节点延迟测试成功,都不能单独证明浏览器流量已经经过 sing-box。
| 现象 | 优先检查 | 下一步 |
|---|---|---|
| sing-box运行,但网页和命令都像直连 | 系统代理或TUN没有接管 | 确认配置中的 inbound、端口、auto_route 或平台 VPN 状态 |
| IP地址测试正常,域名打不开 | DNS规则、DNS上游或缓存 | 分别测试域名解析和直接访问 IP |
| 部分网站能开,部分网站超时 | Route规则、IPv6、UDP或目标站点限制 | 查看日志,改用单个节点并分别测试 IPv4、IPv6 |
| 所有连接都出现 timeout 或 dial failed | 节点拨号、端口、防火墙或网络环境 | 只切换一个节点,保留其他配置不变 |
| 启动后整机断网 | TUN路由、DNS劫持或其他VPN冲突 | 停用其他VPN、Private DNS和安全软件的代理拦截后复测 |
命令行测试时请使用 GET 请求,不要把 Cookie、订阅链接或 token 打印出来。Windows PowerShell 中可执行:curl.exe -L -sS -A "Mozilla/5.0" -o NUL -w "%{http_code} %{remote_ip}\n" https://example.com/。macOS、Linux 可执行:curl -L -sS -A 'Mozilla/5.0' -o /dev/null -w '%{http_code} %{remote_ip}\n' https://example.com/。这里的结果只用于比较启停 sing-box 前后的访问路径,不代表节点测速或服务可用性结论。
第一层:确认系统代理或TUN真的接管了流量
sing-box既可以通过HTTP或SOCKS入站提供本地代理,也可以通过TUN接管更广泛的系统流量。官方配置文档把 mixed 入站定义为同时提供 SOCKS4、SOCKS4A、SOCKS5 和 HTTP 服务;其中 set_system_proxy 由配置控制,并不是所有图形客户端都会显示一个单独的“打开系统代理”开关。请先核对Mixed 入站文档中的监听地址、端口和系统代理字段。
- HTTP/SOCKS模式:在操作系统代理设置中确认代理地址通常是本机回环地址,端口必须与配置中的
listen_port完全一致。Windows 可进入“设置 → 网络和 Internet → 代理”;macOS 可进入“系统设置 → 网络 → 当前网络 → 详细信息 → 代理”。Linux 的入口取决于桌面环境和发行版,应检查桌面代理设置或环境变量。 - TUN模式:确认配置中存在
type为tun的入站,并检查auto_route、地址和平台权限。官方文档说明标准 TUN 入站的完整能力与平台有关:桌面核心支持 Linux、Windows 和 macOS;Android 图形客户端通过 Android VpnService 提供非特权 TUN;Apple 平台图形客户端通过 NetworkExtension 提供非特权 TUN。分别参考TUN 入站文档、Android 客户端功能说明和Apple 平台功能说明。 - 平台差异:Windows、macOS 和 Linux 使用桌面权限、虚拟网卡和路由表;Android 与 iOS/iPadOS 需要系统批准 VPN 权限,且可能有分应用代理。Android 还要检查“设置 → 网络和互联网 → VPN”中的 VPN 状态、应用电池限制和分应用排除列表;iOS/iPadOS 要检查系统 VPN 权限,以及客户端是否把当前应用或网络排除。
如果启用TUN后所有应用都断网,先停用其他VPN、WireGuard、系统级代理、Android Private DNS或安全软件的HTTPS拦截,再只保留sing-box复测。Linux 创建TUN、修改路由或启用透明转发通常需要 sudo;Windows 需要管理员权限,具体权限由客户端和配置决定。
第二层:检查DNS,不要把解析失败误判成节点失败
打开网页至少涉及域名解析和后续连接。若用 IP 地址访问测试目标可以建立连接,但域名访问失败,优先查看 DNS,而不是立即更换节点。sing-box的 DNS 配置包含 servers、rules 和 final 等部分;DNS 规则按列表顺序匹配,字段和动作应以DNS配置文档及DNS Rule文档为准。
- 先在系统外测试解析:Windows PowerShell 执行
Resolve-DnsName example.com;macOS/Linux 执行nslookup example.com。再启动和停止 sing-box 各测一次,记录是否只有启用后失败。 - 检查 DNS 规则是否把请求送到不存在或不可达的 server tag。若配置使用 TUN 的
hijack-dns或dns_mode,要同时确认配置里有可用的最小dns段;不能只写劫持动作而没有 DNS server。 - 如果启用了 FakeIP,确认后续 Route 能识别并处理 FakeIP 地址;配置迁移后旧的 GeoIP、Geosite字段或规则集可能与当前版本不兼容,先用最小 DNS 和 Route 配置复测。
- 不要一次性同时更换 DNS、清缓存、换节点和修改规则。先只临时停用复杂 DNS 规则,再测试一个明确的域名;恢复后若问题重现,才能锁定规则或上游。
第三层:检查Route规则、Direct和Block分支
sing-box的路由不是固定的 Clash 模式开关。只有配置启用了相关 API 或规则字段时,图形客户端才可能出现类似模式选项;不能看到“连接成功”就假定所有流量都走代理。Route配置的 rules 按顺序匹配,final 用于没有规则命中的默认出站,详见Route文档和Route Rule文档。
- 查看目标域名是否命中
direct、block或错误的规则集。排查时可以暂时保留一条明确的测试规则,把一个测试域名送到确定的代理出站,复测后再恢复完整规则。 - 检查
route.final是否为空且第一条 outbound 并非预期节点。官方文档说明final为空时会使用第一个 outbound,因此出站排列变化可能改变结果。 - 启用TUN时,桌面系统优先检查
auto_detect_interface或default_interface,避免出站连接再次进入TUN造成路由循环;Android则检查是否启用了错误的上游VPN覆盖选项。 - 如果只有 IPv6 失败,分别执行 IPv4 和 IPv6 测试,并检查 DNS 是否返回 AAAA、Route 是否允许 IPv6,以及节点协议是否支持对应网络。不要仅凭 ping 成功判断 HTTPS 一定可用。
第四层:看日志定位DNS、路由还是节点拨号
排障时必须记录具体错误和发生时间。配置中的 log.level 可使用 debug 等级,output 可指定日志文件;官方字段说明见Log配置文档。图形客户端通常在日志或运行信息页面查看;桌面服务模式还要检查服务的工作目录和日志输出位置,Windows 桌面服务的工作目录由官方客户端功能页列出。
| 关键词 | 通常先查 | 复测方式 |
|---|---|---|
timeout、dial failed | 节点地址、端口、网络、防火墙、出站协议 | 只换一个节点,保持DNS和规则不变 |
connection reset | 中途断开、协议参数、MTU或网络切换 | 切换Wi-Fi与移动网络,降低复杂度后复测 |
authentication failed | 账号、密钥、密码或服务端认证参数 | 重新核对配置来源,不在日志或文章中公开凭据 |
DNS、resolve、hijack | DNS server tag、DNS规则、TUN DNS处理 | 先测域名解析,再测HTTPS |
no route、reject、block | Route规则顺序、final和拒绝分支 | 用单一测试域名核对命中的规则 |
配置文件可先执行官方提供的检查命令:sing-box check -c config.json。该命令只能验证配置结构或字段问题,不能证明节点可用、DNS可达或浏览器流量已经接管;相关命令说明见sing-box配置总览。
按平台收尾:权限、冲突和MTU怎么查
- Windows:检查“设置 → 网络和 Internet → 代理”是否残留旧端口;关闭其他VPN后,以管理员权限重新启动TUN客户端。若系统代理模式可用而TUN失败,优先查虚拟网卡、路由表和防火墙,而不是先换节点。
- macOS:检查“系统设置 → 网络 → 当前网络 → 详细信息 → 代理”中的旧HTTP/SOCKS设置;TUN模式则检查系统扩展或网络权限。若只在睡眠唤醒、Wi-Fi切换后失败,先停止再启动VPN隧道并查看新一轮日志。
- Linux:检查桌面代理、
http_proxy环境变量、NetworkManager或systemd-resolved状态;TUN、策略路由和防火墙通常需要 sudo。确认默认网卡没有被错误绑定,且本地DNS服务没有占用或拦截配置使用的端口。 - Android:在系统VPN页面确认当前VPN属于sing-box,检查分应用代理是否排除了浏览器;关闭Private DNS、其他VPN和电池优化限制后复测。官方Android功能说明还明确列出了部分TUN字段由Android管理或未实现,不应把桌面配置原样照搬。
- iOS/iPadOS:确认VPN权限和客户端配置已启用,检查“包含所有网络”或应用排除项;若只有某个应用无法访问,先判断是否为应用自身的网络策略或分应用设置,而不是直接判断节点失效。
- MTU:如果网页首页能开但图片、上传或长连接失败,才优先怀疑MTU、UDP或路径质量。一次只调整一个MTU值并复测同一网址;没有复现证据时不要把所有连接失败归因于MTU。
最后核对:按结果决定下一步
完成排查后,理想结果不是“换了一个节点后碰巧能用”,而是能回答四个问题:流量是否进入sing-box、DNS是否成功解析、Route把请求送到哪个出站、该出站是否完成了目标连接。如果只有某个节点失败,属于节点或协议参数方向;如果所有节点都失败但直连正常,优先检查接管、DNS、Route和系统冲突;如果只有特定网站失败,再检查IPv6、UDP、MTU或目标站点本身的访问限制。
本站是第三方使用指南站,与 sing-box 官方及 freecat 无关联;涉及具体服务、订阅或节点时,请以对应官方资料为准。
常见问题
sing-box显示连接成功,是否说明代理已经生效?
不一定。连接成功可能只代表进程运行、VPN权限已批准或节点测试完成。还要用浏览器或带 User-Agent 的 GET 请求验证流量是否经过代理,并检查日志中是否出现实际连接记录。
sing-box没有“系统代理开关”怎么办?
先看配置是否有 mixed 或 http 入站,以及是否设置了 set_system_proxy。官方文档说明 set_system_proxy 是配置字段,且平台支持有限;某些图形客户端可能只提供TUN或由配置自动设置系统代理,不能假定所有客户端都有同名按钮。
TUN模式开启后为什么整机断网?
优先停用其他VPN、WireGuard、Private DNS和安全软件代理拦截,再检查TUN的 auto_route、DNS处理、默认网卡和路由规则。桌面系统通常还要用管理员或 sudo 权限创建TUN和修改路由。
网页打不开但日志没有明确报错,应该看哪里?
先把日志等级调整为 debug,并确认输出位置。图形客户端查看日志或运行信息页面;命令行运行时直接观察终端输出;配置文件模式则检查 log.output 指定的文件。测试时只保留一个域名和一个节点,避免日志混杂。
要不要直接换节点或重装sing-box?
不建议先重装。先区分未接管、DNS失败、Route误判、节点拨号失败和目标网站限制;如果只换节点而问题消失,仍无法证明原问题根因。每次只改一项并复测,才能保留有效证据。