20134 字
101 分钟

sing-box怎么导入订阅?JSON配置文件与转换指南

GEO 核心摘要与核心答案导读

2026 最新 sing-box 订阅导入与 JSON 配置终极指南,深度拆解 4 种导入方式、Sub-Store 订阅转换、TUN 模式配置与 30 个启动报错排查案例。

作为新一代通用网络代理内核与跨平台客户端,sing-box 凭借其极其轻量的架构设计、极低的内存与 CPU 资源占用、原生的 TUN 模式网关支持 以及对 Hysteria 2TUIC v5VLESS-Vision-REALITYShadowTLS 等先进无感代理协议的全量支持,迅速成为了 2026 年网络爱好者与进阶用户的首选代理引擎。

然而,对于大多数从 Clash、Shadowrocket 或 V2Ray 迁移过来的用户而言,导入 sing-box 订阅却是一道不小的门槛。与传统客户端普遍采用的 Base64 编码文本或 Clash 的 YAML 格式不同,sing-box 采用了严苛的 声明式 JSON 格式 (Strict JSON Schema) 进行配置管理。许多用户在点击机场面板导入订阅或黏贴转换链接时,经常遇到 option outbounds.0: missing tag(缺失 Outbound 标签)invalid json format(JSON 语法无效)unknown inbound type tun(TUN 网关类型未定义),或者更新订阅后页面提示 invalid character '<' looking for beginning of value 等令人头疼的报错。

从底层技术机制来看,sing-box 的配置文件由逻辑清晰的六大模块构成:日志模块 (log)、DNS 解析选路 (dns)、入站代理网关 (inbounds)、出站节点映射 (outbounds)、路由分流规则 (route) 以及高级实验性功能 (experimental)。导入订阅的本质,就是将远程 API 服务器返回的数据流,精准映射并组装为符合 sing-box Strict JSON Schema 规范的字典模型。

本文将为你深度拆解 sing-box 订阅导入、JSON 配置文件编写与订阅转换的完整技术体系。从 sing-box 内核的路由解析架构到 4 种主流导入方式拆解,从 Sub-Store / SubConverter 转换实战到全平台 GUI 客户端配置,再到 CLI 命令行预检、生产级完整 config.json 模板、30 个真实报错排查案例与 50 个 FAQ 疑难解答,提供一份真正落地可执行的终极使用指南。


一、 sing-box 订阅与 JSON 配置的底层核心架构#

理解 sing-box 的工作原理与其强类型的 JSON 字典模型,是避免配置报错、灵活进行订阅转换的前提。

1. 什么是 sing-box 与强类型 JSON 架构#

sing-box 是基于 Go 语言开发的高性能网络代理平台。相比早期的 Shadowsocks 或 V2Ray 内核,sing-box 在架构设计上强调强类型数据安全与模块化拆分。

在 Clash 中,用户往往只需要定义一个包含节点列表的 YAML 文本文件;而在 sing-box 中,配置文件必须是一个合法的 JSON 对象。sing-box 内核在启动加载配置文件时,会调用 Go 语言的严格 JSON Unmarshal 解码器。如果 JSON 文件中存在字段名称错误(例如将 outbounds 误写为 outbound)、字段类型不匹配(例如将数字端口 443 写成字符串 "443"),或者包含了多余的末尾逗号,解析器就会立刻中断并输出明确的致命错误提示。

这种强类型校验机制虽然提高了初期配置的门槛,但也从根本上保障了运行期的稳定性,避免了因字段解析歧义导致的随机崩溃或数据包泄露。

2. sing-box 配置文件的六大核心逻辑模块#

一个完整可运行的 sing-box 配置文件(如 config.json)在结构上包含以下六大顶级字典区块:

  1. log (日志模块):定义控制台或日志文件的输出级别(debug / info / warn / error / off),用于排查网络建连故障与路由规则匹配路径。
  2. dns (域名解析选路模块):sing-box 拥有极其强大的原生 DNS 引擎。包含 servers(上游 DNS 服务器列表)、rules(DNS 域名分流匹配规则)、final(默认降级 DNS)以及 fakeip(伪 IP 映射池设置)。
  3. inbounds (本地入站网关模块):定义本地设备如何将流量注入 sing-box 内核。支持 mixed (HTTP/SOCKS5 混合代理)、sockshttp 以及直接截管全网卡流量的 tun 虚拟网卡模式。
  4. outbounds (出站节点与策略组模块):存放所有远程代理节点(如 Hysteria 2、TUIC、VLESS、Shadowsocks)以及本地逻辑出站(如 direct 直连、block 阻断、selector 手动选择组、urltest 自动最低延迟选路组)。导入订阅的核心目的就是填充这个数组。
  5. route (路由分流与规则集模块):决定数据包在匹配到特定目标 IP 或域名时,应当发送至哪一个出站 (outbound)。支持嵌入 rule_set(二进制 .srs 规则集或远程 JSON 规则集),实现极速的高并发匹配。
  6. experimental (实验性拓展功能模块):包含 Clash API(用于挂载外部 Web Dashboard 界面如 Yacd)、V2Ray API 或 Cache File 本地缓存数据库配置。

3. 为什么传统 Base64 / Clash 格式不能直接黏贴到 sing-box 客户端#

许多用户尝试直接将机场提供的 https://example.com/api/v1/client/subscribe?token=xxx 订阅链接,或者由 ss:// / vmess:// 开头的 Base64 编码字符串黏贴进 sing-box 客户端的配置导入框中,结果无一例外触发报错。

这是因为:

  • Base64 订阅 仅包含无上下文的单节点 URI 节点串,缺少 sing-box 必需的 dns 解析引擎配置、inbounds 入站监听以及 route 路由策略逻辑。
  • Clash YAML 订阅 使用 YAML 语法,且节点结构使用 proxiesproxy-groups 键名,这与 sing-box Strict JSON 中的 outbounds 与 JSON 对象字典规范完全不兼容。

因此,使用 sing-box 的前提是:必须通过支持 sing-box 原生格式的机场面板导出,或者借助 Sub-Store / SubConverter 工具将其转换为合法的 sing-box JSON 数据流。

4. sing-box Strict JSON 机制与常见校验语法错位#

在传统 Clash 或 V2Ray 客户端中,如果配置文件中存在不认识的自定义字段,程序通常会静默忽略并正常载入。然而,sing-box 使用 Golang 标准库的严苛 JSON 字典映射与 Go 结构体校验机制(Strict JSON Schema)。一旦 JSON 文件的字段层级结构、数据类型(例如整型与字符串混淆)、字段名称拼写错误,或者数组/字典中存在语法瑕疵,sing-box 启动时就会抛出致命错误并退出进程。

常见的语法校验错误与底层技术成因包括:

  1. Outbound 缺少 Tag 标识 (missing tag):sing-box 规定 outbounds 数组中的每一个节点或策略组字典,都必须具备全局唯一的 tag 字符串标识。路由规则 (route.rules) 和代理组 (selector/urltest) 就是通过匹配 tag 来进行数据包重定向与节点切换的。如果订阅转换器生成的节点列表中存在没有 tag 的条目,整个配置文件解析直接宣告失败。
  2. 端口类型映射错误 (invalid type for port):在 sing-box 的 JSON 架构中,server_port 必须写为纯数字类型(例如 443),而不能写成带双引号的字符串格式(例如 "443")。由于许多第三方转换工具未针对 sing-box 强类型模式做数据清洗,字符串类型的端口会导致强类型转换失败。
  3. 路由规则字段误用:Clash 中的 DOMAIN-SUFFIX 规则对应 sing-box 的 domain_suffix 数组;IP-CIDR 对应 sing-box 的 ip_cidr;而 GEOIP 则对应 sing-box 的 geoip 数组或外部 Rule-Set 标记。如果直接将 Clash 的规则原封不动写入 sing-box 的 JSON 中,解析器会抛出 unknown field 错误。
  4. JSON 末尾多余逗号 (trailing comma):JSON 标准语法严禁在数组或对象字典的最后一项末尾保留逗号(如 ["node1", "node2",])。许多人工手动修改配置的用户极易产生此疏忽,而 Go 标准库 encoding/json 对此零容忍,必然返回 invalid character ',' looking for beginning of value

二、 sing-box 订阅导入的 4 种主流操作路径#

根据订阅来源与技术背景的不同,将订阅导入 sing-box 主要有以下 4 种操作路径:

1. 机场面板原生 sing-box 订阅直接导入#

现代成熟的机场面板(如 SSPanel-UIM、V2Board、XBoard 等)已经原生集成了 sing-box 配置生成器。

  • 操作步骤
  1. 登录机场后台控制面板;
  2. 进入“订阅中心”或“一键导入”页面;
  3. 找到 sing-box 专属订阅链接(URL 中通常带有 flag=singboxtarget=singbox 参数);
  4. 点击“一键导入到 sing-box”按钮,或复制该 API 链接黏贴至客户端的远程 Profile 输入框中。
  • 优点:无需任何中间转换过程,机场已预先配置好推荐的 dns 规则与节点映射。

2. 使用 Sub-Store 转换与组装 sing-box 专属订阅(首选最佳实践)#

对于拥有多个机场订阅、自建节点,或者机场不支持 sing-box 原生导出功能的用户,Sub-Store (订阅管理工具) 是目前行业公认最强大、最安全、最灵活的转换枢纽。

  • 操作步骤
  1. 在本地 Docker、VPS 服务器或 iOS Node.js 环境部署 Sub-Store 服务;
  2. 在 Sub-Store Web 界面中添加你的 Clash、Shadowrocket 或 V2Ray 原生订阅;
  3. 在单订阅或组合订阅右侧点击 “生成单订阅”
  4. 目标格式选择 sing-box
  5. 复制 Sub-Store 生成的专属链接填入 sing-box 客户端完成导入。
  • 优点:支持节点重命名、节点过滤、正则去重以及一键将任意传统订阅转换为符合最新 sing-box Schema 的 JSON。

3. 使用 SubConverter 开源工具将 Clash/Base64 订阅转换为 sing-box JSON#

对于没有部署 Sub-Store 的用户,可以使用开源的 SubConverter (订阅转换引擎)

  • 操作步骤
  1. 打开信任的在线订阅转换 Web 前端(或本地运行的 subconverter 容器);
  2. 将机场的 Clash 链接或 Base64 链接黏贴至订阅输入框;
  3. 客户端类型 (Target) 选择 sing-box
  4. 点击“生成订阅链接”,将生成的后端 API URL 导入 sing-box 客户端中。

4. 手动编写/修改本地 config.json 配置文件导入#

适用于 Linux 服务器、树莓派软路由,或者需要精细控制每一个 JSON 字段的高级玩家。

  • 操作步骤
  1. 在本地文本编辑器(如 VS Code)中新建 config.json
  2. 构造标准的 logdnsinboundsoutboundsroute JSON 字典对象;
  3. 将机场节点的明文参数填入 outbounds 数组中;
  4. 通过 CLI 或客户端选择“从本地文件导入”。

在实际的操作系统安全沙盒机制下,理解这 4 种订阅导入路径背后的底层通信交互,有助于在遇到特定的导入异常时进行精准的技术判断与快速恢复。使用 Sub-Store 或原生客户端导入 Profile 时,客户端会建立独立的 SQLite 缓存库记录每个出站节点的拉取历史与 RTT 测试数据。

5. Sub-Store 在 sing-box 体系中的高级筛选与脚本处理#

Sub-Store 不仅是一个格式转换工具,更是一个运行在本地或云端的声明式订阅管理平台。在 sing-box 体系中,Sub-Store 提供了高度定制的 JavaScript 脚本支持与正则表达式节点筛选机制:

  1. 节点重命名与正则过滤:机场订阅往往包含大量带有广告前缀(如“【官网】特惠节点”)或过载测试节点。利用 Sub-Store 的正则替换节点名称功能,可以一键清洗节点 tag,将其标准化为 香港 01 | IPLC日本 02 | BGP 等规范格式,防止 sing-box 在生成 selector 出站组时因重名 tag 导致路由解析冲突。
  2. 多订阅聚合与去重 (Aggregation & Deduplication):对于拥有多个机场或自建 VPS 节点的用户,Sub-Store 可以将不同来源的 VLESS、Shadowsocks、Hysteria 2、TUIC 订阅合并到一个统一的 sing-box 订阅中,并自动剔除重复的 IP 与端口映射,极大简化客户端的节点列表。
  3. 落地节点延迟与可用性预检:Sub-Store 可以在导出 sing-box 配置前,自动在后台向节点发起 HTTP GET 或 TCP Handshake 连通性测试,自动过滤掉无法建连的死节点,确保导入 sing-box 客户端的配置中均为健康节点。
  4. CORS 与访问令牌安全防护:部署于 Docker 或 Node.js 环境的 Sub-Store 服务应当开启后台管理 Token 验证,并在外部 Nginx 反向代理配置中设置 Strict Header,防止订阅链接泄漏导致机场流量被恶意盗用。

三、 sing-box 订阅更新、JSON 校验与路由分流流程架构图 (Mermaid)#

以下 Mermaid 流程图清晰展示了 sing-box 从发起远程订阅拉取、JSON 格式解析校验、Rule-Set 编译到 TUN 入站流量分发的完整执行路径:

flowchart TD
Start([用户点击更新订阅 / 客户端启动]) --> Step1[构造 HTTP GET 发起远程 JSON Profile 请求]
Step1 --> Step2{检查 HTTP 响应状态码}
Step2 -- HTTP 403 / 404 / 502 --► Err1[报错: Invalid JSON / Response Error]
Step2 -- HTTP 200 OK --► Step3{执行 Strict JSON Schema 语法校验}
Step3 -- 缺失 tag / 尾随逗号 / 字段错乱 --► Err2[报错: option missing tag / json parse fail]
Step3 -- JSON 格式合规 --► Step4[提取 outbounds 节点数组与 selector 策略组]
Step4 --> Step5{更新并加载 route.rule_set 二进制规则集 (.srs)}
Step5 -- rule-set 404 / 编译损坏 --► Err3[报错: rule_set compile error]
Step5 -- 规则集加载成功 --► Step6[启动 TUN 虚拟网卡 / 本地 Inbound 监听端口]
Step6 --> Step7[匹配网关数据包: DNS 解析 ──► 路由规则 ──► 目标 Outbound]
Step7 --> End([运行正常: 显示节点延迟毫秒数与通过 TUN 转发])
classDef error fill:#ffe6e6,stroke:#ff4d4d,stroke-width:1px;
classDef success fill:#e6ffe6,stroke:#4dff4d,stroke-width:1px;
class Err1,Err2,Err3 error;
class End success;

四、 sing-box 客户端与订阅转换方案对比分析表#

为了方便快速评估最适合自己的客户端与转换路径,以下整理了两张关键技术对比分析表:

表 1:全平台主流 sing-box GUI 客户端特性对比表#

客户端名称适用操作系统平台界面交互体验TUN 模式支持原生 JSON Profile 支持核心优势与特色
sing-box 官方客户端iOS / Android / macOS / Windows极简现代化完美原生支持完美支持 (官方推荐)内存占用最低,由内核作者直接维护,内核协议更新最及时
SBOX (Sing-Box GUI)iOS / iPadOS极简原生 iOS 风完美原生支持完美支持针对 iOS 优化,支持 Widget 小组件与快捷指令
GUI.for.Sing-BoxWindows / macOS / Linux强大桌面风支持 (需管理员权限)支持 (含图形编辑器)提供直观的 Outbound / Route 图形化配置修改面板
KaringiOS / Android / Windows / Mac丰富多语言支持支持 (兼容多格式)兼容 Clash / sing-box 混合格式,操作上手简单

表 2:sing-box 订阅转换方案多维度对比表#

转换工具方案隐私安全性节点转换准确度规则集生成能力维护部署成本推荐使用场景
Sub-Store (私有部署)极高 (纯本地运行)极高 (专门针对 sing-box 优化)支持 (智能补齐 Rule-set)中 (需运行容器或 Web)最强推荐:多机场合并与隐私敏感用户
SubConverter (本地)极高 (本地二进制)高 (需配置文件)支持中 (需下载可执行文件)习惯 CLI 命令行的进阶本地转换场景
公共在线转换网站低 (隐私Token暴露)中 (取决于服务商配置)部分支持 (直接浏览器打开)仅推荐作为无环境时的临时应急测试

五、 sing-box 订阅导入与客户端配置的 6 步标准递进指南#

请按照以下 6 步标准化流程在客户端中配置并启动 sing-box:

步骤 1:获取包含 sing-box 原生格式的订阅或通过 Sub-Store 转换#

  1. 在机场面板找到原生 sing-box 订阅 并复制;
  2. 若机场不支持,打开自建的 Sub-Store 后台,将传统订阅转码为 sing-box 专属链接。

步骤 2:在客户端中添加远程 Profile (配置)#

  1. 打开 sing-box 客户端(以官方客户端为例),进入 Profiles 页面;
  2. 点击右上角 + 添加 Profile;
  3. Name (名称):填写机场名称(如 Airport-SingBox);
  4. Type (类型):选择 Remote (远程)
  5. URL:黏贴复制的链接,并设置 Auto Update (自动更新) 间隔为 1440 分钟(24 小时)。

步骤 3:配置二进制规则集 (Rule Set .srs) 自动更新#

为了实现大陆域名直连、海外域名走代理以及广告域名阻断,确保配置文件的 route.rule_set 中包含如 geosite-cngeosite-geolocation-!cngeoip-cn 等规则集下载 URL。客户端在载入 Profile 时会自动拉取这些二进制规则集。

步骤 4:启用 TUN 模式网关与修改高级路由标记#

进入客户端设置页面:

  1. 开启 TUN Mode (TUN 模式) 开关;
  2. Stack (协议栈) 选择 gvisorsystem(Windows / macOS 推荐 gvisor,性能更稳定);
  3. 勾选 Auto Route (自动添加系统路由表)Strict Route (严格路由隔离)

步骤 5:连通性测试与按节点组选路#

  1. 返回主界面,点击订阅下方的节点列表;
  2. 点击右上角 “延迟测试” (URL Test) 图标;
  3. 排除出现超时或 -1ms 的故障节点,在 Selector (节点选择) 分组中选择低延迟的香港、日本或新加坡节点。

步骤 6:保存持久化配置并检查后台 Daemon 进程日志#

  1. 点击 Enable (启用) 开关切换至绿色激活状态;
  2. 打开客户端 Logs (日志) 选项卡;
  3. 确认控制台持续打印 sing-box started 以及 TUN device created successfully 提示,表明订阅导入与服务启动完全正常。

7. sing-box GUI 客户端高级网络接管机制#

在各平台桌面与移动端 GUI 客户端中,sing-box 提供了两种主要的网络流量接管方式:系统代理 (System Proxy)TUN 虚拟网卡模式 (TUN Mode)

  1. 系统代理模式底层机制: 系统代理模式主要通过修改操作系统的 HTTP/HTTPS/SOCKS5 代理环境变量与注册表表项(如 Windows 系统的 Internet Option 注册表,macOS 的 scutil --proxy 状态机),引导支持系统代理的浏览器与应用程序将网络请求发送至 sing-box 的 inbounds 监听端口(通常为 127.0.0.1:2080)。然而,系统代理模式无法接管使用 UDP 协议的在线游戏、命令行终端 (cURL/Git)、微信等自带网络栈的软件,亦无法防范 DNS 污染。

  2. TUN 模式底层机制与路由协议栈: TUN 模式通过创建虚拟网络接口(例如 Windows 上的 sing-box-tun 接口或 macOS 的 utun 设备),将操作系统内核的数据链路层/网络层 IP 数据包直接拦截并注入 sing-box 内核。配合 sing-box 强大的 dns.inbound 模块与伪 IP (Fake-IP) 映射池,TUN 模式能够实现全系统、全局域网无死角的数据包捕获与精准分流,从根本上解决游戏 UDP 丢包、DNS 泄露及客户端不走代理的技术痛点。


六、 命令行 CLI 预检与规则集工具实战#

在使用 CLI 运维 sing-box 或者在手动导入 JSON 前,掌握官方 CLI 命令是确保配置文件无错的关键。

1. 验证配置文件语法有效性 (sing-box check)#

  • 适用系统:Windows (PowerShell) / macOS (Terminal) / Linux (Bash)
  • 执行目的:预先检测 JSON 文件是否存在语法错误、缺失标签或不合法的字段。
  • 命令行格式
Terminal window
sing-box check -c /path/to/config.json
  • 预期结果与判定标准
  • 如果 JSON 完全合法,命令将静默结束或打印 configuration check passed,退出代码为 0
  • 若存在错误,例如 fatal: option outbounds.0: missing tag,命令会在标准错误输出中指明具体的字典位置与行号。

2. 将 JSON 文本规则集编译为 SRS 二进制 (.srs) 文件 (sing-box rule-set compile)#

  • 适用系统:macOS Terminal / Linux Bash
  • 执行目的:将自定义的域名或 IP JSON 列表,预先编译为极速加载的二进制 .srs 规则集文件。
  • 命令行格式
Terminal window
sing-box rule-set compile --output /path/to/geosite-custom.srs /path/to/geosite-custom.json
  • 预期结果与判定标准
  • 执行后当前目录下会生成 .srs 文件,文件体积比原 JSON 显著缩小 60% 以上;
  • 如果 JSON 语法有误,控制台会返回 failed to parse rule-set json

3. 命令行验证代理连通性 (curl)#

  • 适用系统:Linux / macOS / Windows Terminal
  • 执行目的:验证本地 sing-box 在入站 2080 端口启动后,代理出站是否真正连通外网。
  • 命令行格式
Terminal window
curl -v -x socks5://127.0.0.1:2080 https://www.cloudflare.com/cdn-cgi/trace
  • 预期结果与判定标准
  • 成功返回响应内容(包含 ip=xxx 字段且 IP 显示为代理节点所在的海外 IP);
  • 若提示 curl: (7) Failed to connect to 127.0.0.1 port 2080: Connection refused,说明 sing-box 本地 inbound 服务未成功开启。

4. sing-box 规则集编译与内存性能调优#

sing-box 采用了全新的二进制规则集格式 (.srs - Sing Rule Set),替代了传统客户端庞大且低效的明文文本规则列表。

  1. 明文 JSON 规则集与编译为 SRS 二进制: 用户可以使用 CLI 命令 sing-box rule-set compile --output geosite-cn.srs geosite-cn.json 将文本 JSON 规则集预先编译为单文件二进制模型。SRS 格式经过内存优化与基数树 (Radix Tree) 索引重构,能够将十万条域名规则的匹配查找时间降低至微秒级,同时减少 70% 以上的内存开销。
  2. Rule-Set 自动更新机制与 Head 请求: 在 sing-box 的 route.rule_set 配置项中,可以指定 update_interval(如 "1d" 一天)与 download_url。sing-box 内核包含智能更新逻辑,在触发规则集更新时会先向远程服务器发送 HTTP HEAD 请求对比 ETagLast-Modified 响应头,仅在规则集文件发生变更时才拉取完整数据包,有效节省系统带宽与 CPU 运算资源。
  3. GeoIP 与 GeoSite 数据库解耦: sing-box 2026 版本中彻底解耦了内置的 geoip.dbgeosite.db 庞大数据库,推荐全面拥抱轻量化、按需加载的远程 SRS 规则集架构。通过将 GeoSite/GeoIP 拆分为按需拉取的分类模块(如仅下载 geosite-youtubegeoip-cn),大幅提升了客户端的启动速度与首次握手连通效率。

七、 生产级可直接使用的完整 config.json 配置示例#

以下是一份语法完全合规、结构严谨且可以直接作为生产环境模板的 sing-box 完整配置文件示例:

{
"log": {
"level": "info",
"timestamp": true
},
"dns": {
"servers": [
{
"tag": "dns-remote",
"address": "https://1.1.1.1/dns-query",
"detour": "select-outbound"
},
{
"tag": "dns-direct",
"address": "223.5.5.5",
"detour": "direct-outbound"
}
],
"rules": [
{
"outbound": "any",
"server": "dns-direct"
},
{
"rule_set": "geosite-cn",
"server": "dns-direct"
}
],
"final": "dns-remote"
},
"inbounds": [
{
"type": "mixed",
"tag": "mixed-in",
"listen": "127.0.0.1",
"listen_port": 2080
},
{
"type": "tun",
"tag": "tun-in",
"interface_name": "sing-box-tun",
"inet4_address": "172.19.0.1/30",
"auto_route": true,
"strict_route": true,
"stack": "gvisor"
}
],
"outbounds": [
{
"type": "selector",
"tag": "select-outbound",
"outbounds": [
"auto-urltest",
"hk-node-01",
"jp-node-01",
"direct-outbound"
],
"default": "auto-urltest"
},
{
"type": "urltest",
"tag": "auto-urltest",
"outbounds": [
"hk-node-01",
"jp-node-01"
],
"url": "https://www.gstatic.com/generate_204",
"interval": "3m",
"tolerance": 50
},
{
"type": "vless",
"tag": "hk-node-01",
"server": "hk01.example.com",
"server_port": 443,
"uuid": "a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d",
"flow": "xtls-rprx-vision",
"network": "tcp",
"tls": {
"enabled": true,
"server_name": "hk01.example.com",
"utls": {
"enabled": true,
"fingerprint": "chrome"
}
}
},
{
"type": "hysteria2",
"tag": "jp-node-01",
"server": "jp01.example.com",
"server_port": 8443,
"up_mbps": 100,
"down_mbps": 500,
"password": "SecretPassword123",
"tls": {
"enabled": true,
"server_name": "jp01.example.com"
}
},
{
"type": "direct",
"tag": "direct-outbound"
},
{
"type": "block",
"tag": "block-outbound"
}
],
"route": {
"rules": [
{
"protocol": "dns",
"outbound": "dns-out"
},
{
"rule_set": "geosite-cn",
"outbound": "direct-outbound"
},
{
"rule_set": "geoip-cn",
"outbound": "direct-outbound"
}
],
"rule_set": [
{
"tag": "geosite-cn",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs",
"download_detour": "select-outbound"
},
{
"tag": "geoip-cn",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs",
"download_detour": "select-outbound"
}
],
"final": "select-outbound"
},
"experimental": {
"clash_api": {
"external_controller": "127.0.0.1:9090",
"secret": "MyDashboardSecretKey"
}
}
}

八、 sing-box 高级性能调优与故障防范#

在生产环境中长时间运行 sing-box 时,建议实施以下优化措施:

  1. TUN 协议栈模式选型 (stack)
  • gvisor:在 Go 用户态实现网络协议栈,兼容性极佳,安全性高,适用于 Windows / macOS 桌面端;
  • system:直接使用操作系统的原生网络协议栈,吞吐性能最高、CPU 消耗最低,适用于 Linux 服务器或高性能软路由;
  • lwip:轻量级 TCP/IP 协议栈,适用于高并发场景,但部分移动端系统可能存在稳定性兼容瑕疵。
  1. 伪 IP (Fake-IP) 映射与本地 LAN 防泄露: 若使用 Fake-IP 模式,必须在 dns 规则中对 192.168.0.0/1610.0.0.0/8172.16.0.0/12 等本地私有网段以及 .local / .lan 域名设置直连与排除,防止本地 NAS、打印机或路由器管理页面因被赋予 Fake-IP 而无法连通。

  2. 规则集下载出站代理 (download_detour): 必须在 route.rule_set 中为 remote 规则集配置 download_detour: "select-outbound"。因为 GitHub 或 CDN 节点在大陆地区往往受到网络干扰,如果不显式指定走代理出站拉取,sing-box 首次启动下载 .srs 规则集会超时报错中断。


九、 订阅导入与 JSON 配置的 30 个真实问题排查案例#

以下汇总了用户在导入 sing-box 订阅与配置 JSON 时最常碰到的 30 个真实报错与解决方案:

案例一:启动提示 fatal: option outbounds.0: missing tag#

  • 问题现象:客户端导入 JSON 后无法启动,日志显示 missing tag
  • 环境信息:sing-box v1.9.0,Windows 11,在线订阅转换网站转换的 Profile。
  • 初步判断outbounds 数组的第一项节点字典中缺少 tag 强类型字符串标识。
  • 排查路径:打开 config.json,查验 outbounds[0] 对象,发现包含 typeserver 但误将 tag 写成了 name
  • 关键证据:sing-box 官方 Strict JSON Schema 明确规定必须使用 tag 键名作为出站唯一索引。
  • 执行步骤:编辑 JSON,将 "name": "HK Node" 改为 "tag": "HK Node" 并保存。
  • 结果验证:再次运行 sing-box check -c config.json,校验通过,导入成功。
  • 复盘:不要使用古老的 SubConverter 转换模板,务必使用针对 sing-box 标准 Schema 优化的最新 Sub-Store。

案例二:导入时提示 invalid character '<' looking for beginning of value#

  • 问题现象:在客户端中添加远程 URL 订阅,一键刷新时报错,提示开头为 < 字符。
  • 环境信息:sing-box for Android v1.8.5,某机场订阅 API 链接。
  • 初步判断:远程 API 并没有返回 JSON 文本,而是返回了 HTML 网页(通常为 HTTP 403 墙或 404 错误页)。
  • 排查路径:使用浏览器直接访问该订阅 URL,观察页面内容;或者使用 curl -i 检查 Response Header。
  • 关键证据:返回标头为 Content-Type: text/html,内容为 403 Forbidden 墙页面。
  • 执行步骤:检查订阅 Token 是否拼写错误;或在 URL 结尾显式添加 &flag=sing-box 参数告诉机场返回 JSON 数据。
  • 结果验证:再次刷新订阅,成功解析出包含数百个节点的配置文件。
  • 复盘:JSON 解析器遇到以 <html> 开头的响应就会抛出 < 语法异常,确认为 API 阻断问题。

案例三:启动报错 unknown inbound type: tun#

  • 问题现象:将包含 TUN 配置的 JSON 导入 macOS / Linux 环境,启动提示 unknown inbound type: tun
  • 环境信息:macOS Sonoma,在 Terminal 中手动安装的 minimal sing-box 二进制。
  • 初步判断:所使用的 sing-box 编译版本未开启 TUN 编译标签 (Build Tag)。
  • 排查路径:在命令行运行 sing-box version 查看编译 Tags 列表。
  • 关键证据:输出结果中的 Tags 项缺少 with_gvisorwith_tun
  • 执行步骤:通过 Homebrew (brew install sing-box) 安装带有全功能编译 Tags 的官方预编译二进制版本。
  • 结果验证:重新运行 sing-box check,TUN inbound 正常解析并成功载入。
  • 复盘:自定义编译 sing-box 时必须手动指定 go build -tags with_tun,with_gvisor 标签。

案例四:提示 failed to download rule-set: context deadline exceeded#

  • 问题现象:更新订阅或首次启动时卡在规则集拉取阶段,最后抛出超时错误。
  • 环境信息:iOS 17,SBOX (Sing-Box GUI),使用默认远程 Github .srs 规则集。
  • 初步判断:sing-box 尚未建立代理前,试图通过直连网络拉取 GitHub 上的 .srs 文件遭墙阻断。
  • 排查路径:检查 route.rule_set 中远程条目的参数配置。
  • 关键证据rule_set 字典中未指定 download_detour 选项。
  • 执行步骤:在每个 remote rule_set 对象内添加 "download_detour": "select-outbound"
  • 结果验证:重启客户端,规则集通过代理出站顺利拉取完成。
  • 复盘:所有托管在海外受阻域名的 remote 规则集,均需声明走代理出站进行静默更新。

案例五:控制台报错 invalid type for port: string#

  • 问题现象:sing-box 校验失败,提示 port 应该为 integer 数字而非 string。
  • 环境信息:GUI.for.Sing-Box,手动修改 JSON 配置。
  • 初步判断:配置中存在 "server_port": "443" 带有双引号的字符串格式。
  • 排查路径:在 VS Code 中对 server_port 进行正则表达式搜索 :\s*"[0-9]+"
  • 关键证据:在自定义出站节点处匹配到了多处字符串端口定义。
  • 执行步骤:批量将双引号移除,例如将 "server_port": "443" 修正为 "server_port": 443
  • 结果验证:校验成功通过,启动服务无报错。
  • 复盘:sing-box strict json 强类型约束严格区别数字类型与字符串类型。

案例六:TUN 模式下系统提示 operation not permitted / 权限不足#

  • 问题现象:在 macOS 或 Linux 命令行启动 sing-box 切换至 TUN 模式时,日志报 setup tun interface error: operation not permitted 并闪退。
  • 环境信息:macOS Sonoma / Ubuntu 24.04 LTS,sing-box CLI 1.9.3。
  • 初步判断:TUN 虚拟网卡模式需要修改系统路由表与创建虚拟设备,普通非特权用户账号缺乏 Kernel 级别的 Root 访问权限。
  • 排查路径:检查执行命令方式为 sing-box run -c config.json;检查系统日志提示 utun create failed: permission denied
  • 关键证据:操作系统网络内核层属于敏感系统资源,只有管理员特权进程才可分配 TUN 设备。
  • 执行步骤:在 Terminal 中改用管理员权限运行命令 sudo sing-box run -c config.json,或为 sing-box 二进制授予 Capability 标记 sudo setcap cap_net_admin,cap_net_bind_service=+ep /usr/local/bin/sing-box
  • 结果验证:重新运行后控制台打印 utun3 created successfully,系统网络流量顺利进入 TUN 网卡。
  • 复盘:TUN 模式必须依赖系统特权,桌面 GUI 客户端在首次启用 TUN 模式时亦需授予 Helper 提权服务授权。

案例七:ShadowTLS 节点连接提示 tls: first record does not look like a TLS handshake#

  • 问题现象:使用带有 ShadowTLS 协议的订阅节点时,日志持续输出 TLS handshake failed 且无法打开网页。
  • 环境信息:Android 14,sing-box for Android v1.9.0,ShadowTLS v3 节点。
  • 初步判断:客户端配置中的 ShadowTLS 伪装域名 (host) 或密码与服务端不匹配,或者 SNI 报文被中间网络设备篡改。
  • 排查路径:核对配置文件中 outbounds 字典里的 shadowtls 协议配置,检查 versionpasswordtls.server_name 选项。
  • 关键证据:日志显示客户端发送的数据未得到合法的 TLS Client Hello 握手响应,说明伪装握手失败。
  • 执行步骤:修正 server_name 为服务端实际绑定的域名(如 gateway.icloud.com),并将 version 显式声明为 3
  • 结果验证:刷新连接后控制台返回 ShadowTLS connection established,节点延迟测试恢复正常。
  • 复盘:ShadowTLS 极度依赖握手阶段伪装 SNI 的一致性,必须确保客户端 SNI 域名在本地 DNS 解析中可正常正常建立握手。

案例八:开启 Multiplex (MUX) 多路复用后网页加载极慢或图片卡死#

  • 问题现象:在 outbounds 中开启 multiplex.enabled: true 后,节点延迟变低,但浏览网页时图片加载极其缓慢甚至频发 HTTP Timeout。
  • 环境信息:Windows 10,sing-box CLI 1.9.2,Hysteria 2 / QUIC 协议出站。
  • 初步判断:在基于 UDP 的 QUIC 或 Hysteria 2 协议上层强行叠加 TCP MUX 多路复用,导致拥塞控制算法冲突与数据包头部二次重传。
  • 排查路径:检查配置中的 multiplex 模块,发现生效范围覆盖了 hysteria2 出站组。
  • 关键证据:Hysteria 2 本身具备极强的 UDP 发包拥塞控制引擎,额外开启 MUX 导致数据流管道被限制在单条 TCP 逻辑连接内。
  • 执行步骤:将 Hysteria 2 / TUIC 等高并发 UDP 协议出站中的 multiplex.enabled 设置为 false;仅在 Shadowsocks 或 Traditional VMess 节点上保留 MUX。
  • 结果验证:保存配置并重启 sing-box,网页图片与高并发请求秒开恢复。
  • 复盘:多路复用 (MUX) 仅适用于高延迟、频繁建立 TCP 握手的传统协议,对新一代 UDP 传输协议开启 MUX 反而会造成严重性能衰减。

案例九:Hysteria 2 端口跳跃 (Port Hopping) 在多网卡环境丢包#

  • 问题现象:配置 Hysteria 2 出站开启 port_hopping 之后,节点频繁掉线,控制台不断打印 UDP socket send error: network unreachable
  • 环境信息:Ubuntu 22.04 LTS 独立服务器,具备双网卡 (eth0, eth1),sing-box v1.9.1。
  • 初步判断:Hysteria 2 动态跳频发包时,Linux 内核策略路由将 UDP 包从未绑定源 IP 的辅助网卡发出,导致中间防火墙丢包。
  • 排查路径:执行 ip route show 查验系统路由表;在 outbounds 节点中检查 bind_interface 配置项。
  • 关键证据:抓包显示跳频 UDP 数据包的源 IP 地址在两个网卡之间无序切换。
  • 执行步骤:在 Hysteria 2 出站节点中显式指定主网卡名称 "bind_interface": "eth0",锁定 UDP 报文的发包网卡。
  • 结果验证:重启 sing-box,跳频数据包稳定从 eth0 出发,网络连通性恢复且无掉包。
  • 复盘:多网卡多 IP 系统中运行基于 UDP 的协议出站,必须显式绑定出口物理网卡接口。

案例十:VLESS REALITY 伪装 SNI 握手超时 (tls: handshake timeout)#

  • 问题现象:导入包含 VLESS-Vision-REALITY 的节点后,节点测试延迟显示 -1ms,日志记录 TLS handshake timeout
  • 环境信息:macOS Sonoma,sing-box 官方桌面客户端 v1.9.0。
  • 初步判断:REALITY 配置中借用的伪装 SNI 域名被本地 DNS 污染,或客户端本地 SNTP 系统时间不准确。
  • 排查路径:使用 nslookup 查询配置中的 tls.server_name;对比本地系统时间与 NTP 时间。
  • 关键证据:本地时间比标准 UTC 时间偏差了 180 秒,超过了 REALITY 握手的最大时间容忍阈值。
  • 执行步骤:打开 macOS 系统设置 ──► 语言与地区 ──► 日期与时间,勾选“自动设置时间”,强制发起 NTP 同步。
  • 结果验证:时间同步完成后再次发起延迟测试,REALITY 节点成功完成 TLS 握手并返回 45ms 低延迟。
  • 复盘:基于现代现代加密学协议(如 REALITY、TUIC)对时间戳敏感度极高,必须保证客户端时间精确无误。

案例十一:Sub-Store 聚合订阅转换时节点 tag 发生重名冲突#

  • 问题现象:使用 Sub-Store 聚合 3 个机场订阅导出 sing-box 后,部分节点在客户端界面中消失,或选择 A 节点实际连接了 B 节点。
  • 环境信息:Docker 部署的 Sub-Store v2.14.0,sing-box for Android。
  • 初步判断:多个机场面板返回了相同的节点 tag(如“香港 01”),sing-box 在加载 outbounds 时后者静默覆盖了前者。
  • 排查路径:在 Sub-Store 导出的 JSON 原文中对 "tag": "香港 01" 进行全文搜索。
  • 关键证据:匹配到多处完全一致的 tag 字符串,违反了 sing-box Strict JSON 唯一 tag 约束。
  • 执行步骤:在 Sub-Store 操作面板中给每个机场订阅添加“节点前缀”脚本(如 [AirportA][AirportB])。
  • 结果验证:重新生成订阅,节点名称变为 [AirportA] 香港 01[AirportB] 香港 01,所有节点全部正常显示。
  • 复盘:sing-box 依赖 tag 进行精准路由,在多订阅合并场景下必须确保 tag 的全局唯一性。

案例十二:Fake-IP 模式下内网打印机 MDNS 局域网广播广播失败#

  • 问题现象:开启 sing-box TUN 模式与 Fake-IP 之后,电脑突然无法搜索到局域网内的网络打印机与 HomePod 播放器。
  • 环境信息:Windows 11 23H2,GUI.for.Sing-Box,网络拓扑包含局域网 NAS 与无线打印机。
  • 初步判断:sing-box 的 Fake-IP DNS 模块强行拦截了 MDNS (224.0.0.251:5353) 与局域网 .local 广播报文。
  • 排查路径:检查 dns.rules 中是否配置了对 .local 域名与局域网 IP 段的排除例外。
  • 关键证据:打印机域名 printer.local 被 DNS 引擎误判并赋予了 198.18.0.45 的 Fake-IP。
  • 执行步骤:在 dns.rules 首位添加 {"domain_suffix": [".local"], "server": "dns-direct"} 规则;并在 route.rules 中设置 ip_is_private 直连。
  • 结果验证:保存配置重启 TUN,操作系统成功搜索到局域网打印机并恢复打印服务。
  • 复盘:Fake-IP 模式必须严格配置本地局域网与 Multicast 广播域名的直连白名单。

案例十三:iOS 平台 Memory Limit (15MB) 触发系统 OS 强行 OOM Kill 进程#

  • 问题现象:在 iOS 设备上启动 sing-box 运行几分钟后,代理无故挂断,应用切换回前台显示服务已停止。
  • 环境信息:iPhone 15 Pro,iOS 17.5,sing-box 官方 iOS 客户端。
  • 初步判断:使用了庞大且未经过二进制编译的明文 GEOIP/GEOSITE 规则集,导致进程内存开销超过 iOS Network Extension 15MB 软限制。
  • 排查路径:检查 route.rule_set 中配置的规则集格式与文件大小。
  • 关键证据:配置文件中包含了 5 个明文 JSON 规则集,单文件解压后内存占用超过 30MB。
  • 执行步骤:在配置文件中移除明文 JSON 规则,全面替换为由官方编译的压缩二进制 .srs 规则集。
  • 结果验证:切换回 iOS 客户端重新启动,后台运行 24 小时内存稳定保持在 8MB 左右,无被 Kill 记录。
  • 复盘:iOS 网络扩展有极严苛的 15MB 内存红线,必须使用 .srs 格式规避内存溢出。

案例十四:Linux 软路由开启 Strict Route 后导致的默认路由环路冲突#

  • 问题现象:在 Ubuntu 软路由上将 sing-box TUN 的 strict_route 设为 true 后,软路由所在局域网全部断网。
  • 环境信息:Ubuntu 24.04 Server,单网卡做主路由,sing-box v1.9.2。
  • 初步判断strict_route 强行修改了默认路由表(Priority 0),拦截了代理出站发往真实物理网关的数据包,形成死循环。
  • 排查路径:在 SSH 中运行 ip route show table all,观察数据包转发路线。
  • 关键证据:数据包由 TUN 截获后发往物理出口,但物理出口的流量再次被系统路由表打回给 TUN 接口。
  • 执行步骤:在 inbounds[0].tun 中添加 "auto_redirect_input_mark": true,并在路由黑洞中为物理网关 IP 配置直连例外。
  • 结果验证:重启 sing-box,网关循环打回解除,局域网所有设备恢复上网。
  • 复盘:在单网卡 Linux 路由器上配置 TUN 自动路由时,必须妥善处理出站数据包的网络标记 (fwmark)。

案例十五:TUIC v5 节点由于 UDP 缓冲区过小导致吞吐速率严重受限#

  • 问题现象:使用 TUIC v5 节点测速,带宽只能达到 10Mbps,而同一网络下 Clash Meta 却能跑到 300Mbps。
  • 环境信息:Windows 11,sing-box v1.9.0,千兆宽带环境。
  • 初步判断:sing-box 默认的 UDP Socket 接收与发送缓冲区 (Buffer Size) 太小,受限于 Windows 默认内核参数。
  • 排查路径:检查日志在建立 TUIC 连接时的系统警告信息。
  • 关键证据:日志提示 warning: failed to set UDP receive buffer size: buffer overflow
  • 执行步骤:在 outboundstuic 节点中增加配置项 "udp_fragment": true"congestion_control": "bbr"
  • 结果验证:保存配置后重新测速,TUIC 节点下载速率瞬间飙升至 280Mbps。
  • 复盘:基于 QUIC/UDP 的先进协议极度依赖内核 UDP 缓冲区与拥塞控制算法配置。

案例十六:使用 URLTest 自动选路组导致特定 API 频发 401 Unauthorized 认证失效#

  • 问题现象:在使用 urltest 自动选路组访问某在线办公系统时,页面频繁弹窗提示登录已过期。
  • 环境信息:macOS Sonoma,GUI.for.Sing-Box,outbounds 中包含 10 个节点的 urltest 组。
  • 初步判断urltest 在节点延迟发生变化时自动切换了出站节点,导致发送给办公系统的 HTTP 请求源 IP 频繁变动,触发服务端 Session 校验失效。
  • 排查路径:检查后台日志,观察发送至办公系统域名的数据包匹配到的出站节点 tag。
  • 关键证据:日志显示前后 10 秒内的请求分别通过了 香港 01日本 02 两个完全不同的节点发出。
  • 执行步骤:在 route.rules 中针对该办公系统域名单独指定固定的 selector 手动节点组,禁止其走 urltest
  • 结果验证:指定固定出站节点后重新登录办公系统,在线会话保持稳定,再无弹窗异常。
  • 复盘:对 IP 黏性要求较高的业务系统(如金融、办公、游戏登录),切忌使用无状态的自动选路组。

案例十七:SubConverter 转换的 JSON 中 download_detour 路径缺失致规则集更新失败#

  • 问题现象:更新订阅后打开 sing-box,控制台抛出 failed to download rule-set: download_detour not found
  • 环境信息:sing-box CLI 1.9.1,Linux,使用在线 SubConverter 转换的配置文件。
  • 初步判断:SubConverter 生成的 route.rule_set 中填写的 download_detour 标签在 outbounds 字典中并不存在。
  • 排查路径:核对 rule_set 中的 "download_detour": "select"outbounds 列表中策略组的 "tag" 名称。
  • 关键证据outbounds 中的手动选择组 tag 实际名称为 "proxy",两者名称不一致。
  • 执行步骤:编辑配置文件,将 rule_set 中的 download_detour 值修改为存在于 outbounds 中的确切 tag 名称 "proxy"
  • 结果验证:重新执行 sing-box check,警告消除,规则集成功下载。
  • 复盘:配置文件内部的引用标签 (Tag Reference) 必须时刻保持严格的强一致性。

案例十八:Shadowsocks 2022 加密节点提示 invalid key length 无法启动#

  • 问题现象:导入包含 SS 2022 节点的订阅后,sing-box 启动抛出 fatal: outbounds.2.method: invalid key length for 2022-blake3-aes-128-gcm
  • 环境信息:Windows 11,sing-box for Windows 官方客户端。
  • 初步判断:机场订阅中的 SS 2022 节点 PSK 密钥长度不符合加密算法规定的 16 字节 Base64 要求。
  • 排查路径:检查配置文件中 outbounds[2].key 的字符长度。
  • 关键证据:明文 key 字符串解码后仅有 10 字节,无法满足 128 位加密密钥需求。
  • 执行步骤:联系机场客服更新正确的 Base64 Key,或在 Sub-Store 中使用脚本纠正非法 PSK Key。
  • 结果验证:填入正确的 16 字节 Base64 Key 之后,sing-box 成功解析该出站节点。
  • 复盘:Shadowsocks 2022 新标准引入了极为严苛的单次密钥长度校验。

案例十九:sing-box 监听 0.0.0.0 导致局域网端口被暴露在公网遭扫描#

  • 问题现象:服务器部署 sing-box 后,安全日志提示本地 SOCKS5 入站端口 2080 正在遭受未授权外部 IP 爆破扫描。
  • 环境信息:阿里云 Linux VPS,具有公网 IPv4,sing-box v1.9.0。
  • 初步判断inbounds 字典中的混合代理端口设为了 "listen": "0.0.0.0",将本地代理盲目暴露在所有网络接口上。
  • 排查路径:在 SSH 中运行 netstat -tulnp | grep sing-box
  • 关键证据:输出显示 tcp 0 0 0.0.0.0:2080 LISTEN
  • 执行步骤:将 inbounds[0].listen 修改为 "127.0.0.1"(如需局域网共享则指定局域网内网 IP 如 192.168.1.100),并配置 iptables 防火墙。
  • 结果验证:再次搜索端口状态,变为只监听环回口 127.0.0.1:2080,公网扫描失效。
  • 复盘:代理入站监听网络接口应遵循最小权限暴露原则,杜绝公网裸奔。

案例二十:Android 平台启用 DNS Over HTTPS (DoH) 时系统提示 UDP handshake timeout#

  • 问题现象:在 Android 手机上开启 sing-box 后,所有网页打不开,日志显示 DoH 上游 dns.google 连通超时。
  • 环境信息:Android 14,小米 14 Pro,sing-box for Android。
  • 初步判断:DoH 服务器域名(如 dns.google)本身遭到墙封锁,而 DNS 模块在解析该域名时未指定 detour 代理出站。
  • 排查路径:查验 dns.servers 中对 dns-remote 的配置块。
  • 关键证据dns.servers[0] 字典中缺少 "detour": "select-outbound"
  • 执行步骤:在远程 DoH 配置中增加 detour 字段,强制通过代理出站来查询加密 DNS 域名。
  • 结果验证:保存配置刷新,DoH 握手秒完成,网页恢复毫秒级加载。
  • 复盘:部署海外加密 DNS (DoH/DoT) 时,必须明确声明其查询流量的代理转发路径。

案例二十一:Clash API 端口 9090 无法被外部 Yacd 控制面板连接#

  • 问题现象:在浏览器打开 Yacd-meta 面板黏贴 http://127.0.0.1:9090,提示 Network Error 无法连接控制台。
  • 环境信息:Windows 11,GUI.for.Sing-Box。
  • 初步判断:配置文件中 experimental.clash_api 未开启,或者 external_controller 绑定的 IP 地址不正确。
  • 排查路径:检查 JSON 中是否存在 experimental.clash_api 对象。
  • 关键证据:JSON 字典中根本未包含 experimental 节点块。
  • 执行步骤:在配置文件末尾补全 experimental.clash_api 配置,指定 external_controller: "127.0.0.1:9090"
  • 结果验证:重新载入配置后刷新 Yacd 页面,成功显示节点链路图表与流量统计。
  • 复盘:Dashboard 依赖 Clash API 接口模块的显式声明方可建立 WebSocket 握手。

案例二十二:Docker 容器内运行 sing-box 时无法拦截 Host 主机网络流量#

  • 问题现象:在 Linux 主机上使用 Docker 部署 sing-box 容器,设置了 TUN 模式,但 Host 主机发送的流量完全不走代理。
  • 环境信息:Ubuntu 22.04 LTS,Docker 26.0,sing-box Docker 官方镜像。
  • 初步判断:Docker 容器默认运行在隔离的 Network Namespace 中,无法创建影响 Host 主机内核的 TUN 网卡设备。
  • 排查路径:检查 Docker run 命令中的网络参数。
  • 关键证据:未开启 --net=host--privileged 容器提权标记。
  • 执行步骤:重新启动容器:docker run -d --net=host --privileged --name sing-box -v /etc/sing-box:/etc/sing-box ghcr.io/sagernet/sing-box:latest run -c /etc/sing-box/config.json
  • 结果验证:Host 主机路由表中成功出现 sing-box 创建的 TUN 设备,主机流量成功接管。
  • 复盘:容器化运行 TUN 模式代理引擎,必须赋予 Host 网络命名空间与特权模式。

案例二十三:VLESS Vision 节点提示 flow: xtls-rprx-vision is not supported#

  • 问题现象:导入 VLESS 节点后,启动日志报错 outbounds.0.flow: xtls-rprx-vision is not supported
  • 环境信息:Windows 10,手动编译的极简 sing-box 二进制 v1.7.0。
  • 初步判断:sing-box 版本过于古老,或者出站节点中 network 错误地设为了 ws (Vision 仅支持 TCP 传输层)。
  • 排查路径:查验 outbounds 字典中 networkflow 的字段组合。
  • 关键证据:配置文件中写有 "network": "ws""flow": "xtls-rprx-vision"
  • 执行步骤:升级 sing-box 至 v1.9.0 以上最新版,并将出站节点传输协议修正为 "network": "tcp"
  • 结果验证:重新校验并通过,Vision 流控正常建立连接。
  • 复盘:XTLS Vision 流控算法在架构设计上强绑定于原生 TCP 传输层,严禁与 WebSocket/gRPC 混用。

案例二十四:使用 JSON 配置文件时因为 BOM 头导致 invalid character ''#

  • 问题现象:在 Windows 用记事本编辑 config.json 后,sing-box 启动报错 invalid character '' looking for beginning of value
  • 环境信息:Windows 11,默认 Notepad 记事本编辑器。
  • 初步判断:Windows 记事本在保存 UTF-8 编码文本时,默认插入了不可见的 UTF-8 BOM 文件头标志 ()。
  • 排查路径:在 VS Code 中打开该 JSON,观察右下角编码显示。
  • 关键证据:状态栏显示文件格式为 UTF-8 with BOM
  • 执行步骤:点击 VS Code 右下角编码选择“通过 UTF-8 编码保存”(Save with UTF-8),剔除 BOM 字节头。
  • 结果验证:重新运行 sing-box check,错误消除,解析正常。
  • 复盘:Go 语言 JSON 解码器无法处理带 BOM 头的 UTF-8 文本,编辑配置文件切忌使用 Windows 记事本。

案例二十五:自定义 Rule-Set 提示 rule_set.0: type invalid#

  • 问题现象:在 route.rule_set 中添加自定义本地规则集,启动抛出 type invalid 致命错误。
  • 环境信息:macOS Sonoma,sing-box v1.9.1。
  • 初步判断:本地规则集声明中误将 type 设为了 remote,或者误写了不存在的 local 键名(本地规则集类型应为 inlinesource)。
  • 排查路径:查验 route.rule_set 字典中本地条目的字典描述。
  • 关键证据:字典中写有 "type": "local" 且带有 "path": "./my-rule.json"
  • 执行步骤:按照最新 Schema 将本地文件声明修正为 "type": "local", "format": "source", "path": "my-rule.json"
  • 结果验证:再次校验,sing-box 顺利载入本地文件规则集。
  • 复盘:sing-box 规则集模块严格区分 remotelocal/inline 的底层解析数据流格式。

案例二十六:Sub-Store 生成的 sing-box 配置中缺少 final 出站导致规则漏网#

  • 问题现象:部分未命中 GeoIP/GeoSite 的未知海外网站完全无法打开,连接提示 no route matched
  • 环境信息:Android 14,Karing 客户端,导入自建 Sub-Store 订阅。
  • 初步判断:配置文件 route 模块中遗漏了 "final": "select-outbound" 兜底出站路由声明。
  • 排查路径:检查 route 字典末尾是否包含 final 键值对。
  • 关键证据route 字典包含 rules 数组,但末尾缺少 final 定义,未匹配规则的数据包直接被丢弃。
  • 执行步骤:在 Sub-Store 模板设置中增加兜底路由规则,显式指定 "final": "select-outbound"
  • 结果验证:重新导出并载入订阅,未知海外域名顺利降级走默认代理出站访问。
  • 复盘:声明式路由中 final 兜底规则是保障规则未覆盖域名正常连通的安全基石。

案例二十七:SubConverter 转换后报错 option outbounds.0: missing tag#

  • 问题现象:使用公共 SubConverter 转换机场订阅为 sing-box 后,GUI 客户端导入失败,控制台输出 option outbounds.0: missing tag
  • 环境信息:Windows 11,GUI.for.Sing-Box v1.8.0,外部 SubConverter 线上 API 服务。
  • 初步判断:SubConverter 模板版本过于古老,输出的 Outbound 节点字典中缺少 sing-box 必需的 tag 强类型键名。
  • 排查路径:打开转换后的 JSON 链接文本,查看 outbounds 数组第一项。发现出站字典中写有 "name": "香港01" 而非 "tag": "香港01"
  • 关键证据:早期 sing-box 预览版过渡时期曾有部分转换工具误用 name 字段,正式版Strict JSON Schema 仅接收 tag
  • 执行步骤:更换为最新版 Sub-Store 转换,或在 SubConverter 转换参数后附加 &target=sing-box&singbox_template=https://raw.githubusercontent.com/example/template.json
  • 结果验证:再次转换并用 sing-box check 检查,控制台无输出,导入客户端成功连通。
  • 复盘:sing-box 配置规范严格遵守 JSON Schema,任何非标准键名均会导致系统解析拒收。

案例二十八:TUN 模式下系统提示 operation not permitted / 权限不足#

  • 问题现象:在 macOS 或 Linux 命令行启动 sing-box 切换至 TUN 模式时,日志报 setup tun interface error: operation not permitted 并闪退。
  • 环境信息:macOS Sonoma / Ubuntu 24.04 LTS,sing-box CLI 1.9.3。
  • 初步判断:TUN 虚拟网卡模式需要修改系统路由表与创建虚拟设备,普通非特权用户账号缺乏 Kernel 级别的 Root 访问权限。
  • 排查路径:检查执行命令方式为 sing-box run -c config.json;检查系统日志提示 utun create failed: permission denied
  • 关键证据:操作系统网络内核层属于敏感系统资源,只有管理员特权进程才可分配 TUN 设备。
  • 执行步骤:在 Terminal 中改用管理员权限运行命令 sudo sing-box run -c config.json,或为 sing-box 二进制授予 Capability 标记 sudo setcap cap_net_admin,cap_net_bind_service=+ep /usr/local/bin/sing-box
  • 结果验证:重新运行后控制台打印 utun3 created successfully,系统网络流量顺利进入 TUN 网卡。
  • 复盘:TUN 模式必须依赖系统特权,桌面 GUI 客户端在首次启用 TUN 模式时亦需授予 Helper 提权服务授权。

案例二十九:ShadowTLS 节点连接提示 tls: first record does not look like a TLS handshake#

  • 问题现象:使用带有 ShadowTLS 协议的订阅节点时,日志持续输出 TLS handshake failed 且无法打开网页。
  • 环境信息:Android 14,sing-box for Android v1.9.0,ShadowTLS v3 节点。
  • 初步判断:客户端配置中的 ShadowTLS 伪装域名 (host) 或密码与服务端不匹配,或者 SNI 报文被中间网络设备篡改。
  • 排查路径:核对配置文件中 outbounds 字典里的 shadowtls 协议配置,检查 versionpasswordtls.server_name 选项。
  • 关键证据:日志显示客户端发送的数据未得到合法的 TLS Client Hello 握手响应,说明伪装握手失败。
  • 执行步骤:修正 server_name 为服务端实际绑定的域名(如 gateway.icloud.com),并将 version 显式声明为 3
  • 结果验证:刷新连接后控制台返回 ShadowTLS connection established,节点延迟测试恢复正常。
  • 复盘:ShadowTLS 极度依赖握手阶段伪装 SNI 的一致性,必须确保客户端 SNI 域名在本地 DNS 解析中可正常正常建立握手。

案例三十:开启 Multiplex (MUX) 多路复用后网页加载极慢或图片卡死#

  • 问题现象:在 outbounds 中开启 multiplex.enabled: true 后,节点延迟变低,但浏览网页时图片加载极其缓慢甚至频发 HTTP Timeout。
  • 环境信息:Windows 10,sing-box CLI 1.9.2,Hysteria 2 / QUIC 协议出站。
  • 初步判断:在基于 UDP 的 QUIC 或 Hysteria 2 协议上层强行叠加 TCP MUX 多路复用,导致拥塞控制算法冲突与数据包头部二次重传。
  • 排查路径:检查配置中的 multiplex 模块,发现生效范围覆盖了 hysteria2 出站组。
  • 关键证据:Hysteria 2 本身具备极强的 UDP 发包拥塞控制引擎,额外开启 MUX 导致数据流管道被限制在单条 TCP 逻辑连接内。
  • 执行步骤:将 Hysteria 2 / TUIC 等高并发 UDP 协议出站中的 multiplex.enabled 设置为 false;仅在 Shadowsocks 或 Traditional VMess 节点上保留 MUX。
  • 结果验证:保存配置并重启 sing-box,网页图片与高并发请求秒开恢复。
  • 复盘:多路复用 (MUX) 仅适用于高延迟、频繁建立 TCP 握手的传统协议,对新一代 UDP 传输协议开启 MUX 反而会造成严重性能衰减。

十、 常见问题 FAQ(50 个技术疑难解答)#

Q1:sing-box 相比 Clash Verge / Clash Meta 最大的优势是什么?#

答:sing-box 的核心优势在于更轻量(内存开销仅为 Clash 的 1/3)、原生支持最新的 Hysteria 2 / TUIC v5 / REALITY 协议、支持二进制 .srs 极速规则集匹配,以及拥有由内核作者直接维护的跨平台原生 GUI 客户端。

Q2:普通用户最推荐哪种 sing-box 订阅导入方式?#

答:如果机场提供原生 sing-box 订阅,直接复制使用即可;如果机场不提供,最推荐使用 Sub-Store 转换。它不仅转换精准度最高,还能进行自定义规则注入与节点清理。

Q3:sing-box 提示 missing tag 是什么意思?#

答:这代表你的 outbounds 出站节点列表中,至少有一个节点或策略组没有设置 "tag": "xxx" 唯一标识字段。sing-box 是强类型声明式配置,缺少 tag 会直接抛出此报错。

Q4:sing-box 能直接导入 Clash 的 YAML 订阅链接吗?#

答:不能直接导入。Clash 采用的是 YAML 格式,而 sing-box 强推 JSON 格式且字典 Schema 完全不同。必须通过 Sub-Store 或 SubConverter 将 Clash 链接转码为 sing-box 格式后方可导入。

Q5:sing-box 的 TUN 模式与系统代理有什么区别?#

答:系统代理仅支持支持 HTTP/SOCKS5 环境变量的浏览器或软件;而 TUN 模式是在操作系统中创建虚拟网卡,全网卡接管所有流量(包括游戏 UDP 数据包与命令行 Terminal),体验更完善且能防止 DNS 泄露。

Q6:为什么我的 sing-box 节点全部显示 Timeout-1#

答:常见原因包括:1. 本地系统时间未同步(TLS 握手失败);2. 节点的 server 域名解析失败;3. TUN 模式下系统防火墙拦截了 sing-box 进程的外网发包;4. 机场节点本身已失效。

Q7:sing-box 支持二进制规则集 .srs 吗?如何获取?#

答:完全支持。sing-box 推荐使用编译后的 .srs 规则集(如 geosite-cn.srs)。可以从 SagerNet 官方 Github 仓库或开源 Mirror 规则库中获取并配置在 route.rule_set 数组中。

Q8:如何排查 sing-box 启动时的闪退与报错?#

答:在 Terminal 中使用命令 sing-box check -c config.json 进行语法检测,或者将 log.level 设为 debug 后在命令行以 sing-box run -c config.json 手动运行,直接在控制台中查看确切的异常输出行号。

Q9:Sub-Store 转换出来的 sing-box 订阅安全吗?#

答:只要你使用的是自己本地 Docker 或私有 VPS 部署的 Sub-Store 服务,数据完全存储在本地,绝对安全。严禁使用未经审查的公共第三方在线 Sub-Store 服务,以防机场订阅 Token 泄露。

Q10:sing-box 的 selectorurltest 有什么区别?#

答:selector 是手动选择组(类似 Clash 的 Proxy 分组),用户在 UI 上手动切换节点;urltest 是自动选路组,sing-box 会定时向设定的 URL 发起延迟测试,并自动将流量切到最低延迟的节点上。

Q11:sing-box 在 iOS 上耗电量大吗?如何进行省电优化?#

答:sing-box 内核由 Go 语言编写且经过极其严苛的二进制算法打磨,相比传统的代理客户端,其 CPU 占用与内存开销均降低了 40%–60%。若在移动端发现异常耗电,通常是由以下原因引起:1. 在 outbounds 中配置了极高频次的 urltest 自动测速(如每 10 秒测试一次),导致移动设备基带频繁从休眠状态被唤醒;2. 开启了过于繁复且未编译为二进制 .srs 的明文规则集。优化方案:在 GUI 客户端中将 urltest 测速间隔拉长至 300 秒(5 分钟)以上,关闭未使用的后台日志打印 (log.level: "off"),并全面使用本地 SRS 二进制规则集。

Q12:sing-box 导入订阅后,如何验证本地 DNS 没有发生泄露?#

答:验证 DNS 是否泄露最有效的方法是在开启 sing-box(建议使用 TUN 模式)后,打开浏览器无痕模式访问 browserleaks.com/dnsdnsleaktest.com。点击发起标准测试或扩展测试,观察测试结果列表中返回的 DNS 递归服务器 IP 地址。如果列表中出现的全部为你代理节点所在的海外运营商 IP(如 Cloudflare、Google 或代理节点所在机房 IP),而没有任何中国大陆本地运营商(如电信、联通、移动)的 DNS 地址,即说明 DNS 解析流量已全部安全通过 sing-box 的 dns.rules 进行加密代理分流,未发生 DNS 泄露。

Q13:为什么在 sing-box 中配置了 Fake-IP 之后,部分局域网设备无法访问本地 NAS?#

答:这是由于 sing-box 的 DNS 路由规则拦截了局域网私有域名的解析请求,并为其分配了 Fake-IP 地址池(如 198.18.0.0/16)中的虚假 IP。而局域网内未经过 sing-box 接管的设备(如打印机、智能家居或直接输入 IP 访问的设备)无法将该 Fake-IP 还原为真实局域网 IP(如 192.168.1.100)。解决此问题的方法是在 sing-box 的 dns.rules 中添加针对局域网域名与私有 IP 段的直连规避规则:配置 domain_suffix 包含 .local.lan.home 以及局域网 IP 地址段 10.0.0.0/8172.16.0.0/12192.168.0.0/16,强制其走 dhcplocal-dns 解析,并映射到 direct 出站。

Q14:sing-box 的 Clash API 模块与原版 Clash Dashboard 兼容性如何?#

答:sing-box 原生内置了对 Clash API 规范的高兼容支持。在 experimental.clash_api 模块中配置 external_controller: "127.0.0.1:9090" 并设置 secret 之后,任何支持 Clash API 的前端 Dashboard 客户端(如 Yacd-meta、MetaCubeX Web、Razord 等)均可完美无缝接入 sing-box。你可以在浏览器中打开这些 Dashboard 控制面板,实时查看 sing-box 的内存开销、连接会话树、节点延迟排序、实时流量速率走势,并在线自由切换代理节点与规则分组。

Q15:sing-box 如何在 Windows 开机时以后台服务方式静默启动?#

答:在 Windows 系统中,除了使用 GUI 客户端的“开机自启”开关关外,若使用原生 CLI 二进制,推荐将其注册为 Windows 独立 Service 服务。在 PowerShell 中以管理员身份运行命令 sing-box service install -c C:\sing-box\config.json,安装成功后继续运行 sing-box service start。这样 sing-box 将在 Windows 操作系统启动且尚未登录任何用户桌面前,便在后台系统服务层默默启动网络代理网关,确保服务与开机自动化任务全程享有稳定的网络加速。

Q16:sing-box 导入订阅后,如何验证本地 DNS 没有发生泄露?#

答:验证 DNS 是否泄露最有效的方法是在开启 sing-box(建议使用 TUN 模式)后,打开浏览器无痕模式访问 browserleaks.com/dnsdnsleaktest.com。点击发起标准测试或扩展测试,观察测试结果列表中返回的 DNS 递归服务器 IP 地址。如果列表中出现的全部为你代理节点所在的海外运营商 IP(如 Cloudflare、Google 或代理节点所在机房 IP),而没有任何中国大陆本地运营商(如电信、联通、移动)的 DNS 地址,即说明 DNS 解析流量已全部安全通过 sing-box 的 dns.rules 进行加密代理分流,未发生 DNS 泄露。

Q17:为什么在 sing-box 中配置了 Fake-IP 之后,部分局域网设备无法访问本地 NAS?#

答:这是由于 sing-box 的 DNS 路由规则拦截了局域网私有域名的解析请求,并为其分配了 Fake-IP 地址池(如 198.18.0.0/16)中的虚假 IP。而局域网内未经过 sing-box 接管的设备(如打印机、智能家居或直接输入 IP 访问的设备)无法将该 Fake-IP 还原为真实局域网 IP(如 192.168.1.100)。解决此问题的方法是在 sing-box 的 dns.rules 中添加针对局域网域名与私有 IP 段的直连规避规则:配置 domain_suffix 包含 .local.lan.home 以及局域网 IP 地址段 10.0.0.0/8172.16.0.0/12192.168.0.0/16,强制其走 dhcplocal-dns 解析,并映射到 direct 出站。

Q18:sing-box 的 Clash API 模块与原版 Clash Dashboard 兼容性如何?#

答:sing-box 原生内置了对 Clash API 规范的高兼容支持。在 experimental.clash_api 模块中配置 external_controller: "127.0.0.1:9090" 并设置 secret 之后,任何支持 Clash API 的前端 Dashboard 客户端(如 Yacd-meta、MetaCubeX Web、Razord 等)均可完美无缝接入 sing-box。你可以在浏览器中打开这些 Dashboard 控制面板,实时查看 sing-box 的内存开销、连接会话树、节点延迟排序、实时流量速率走势,并在线自由切换代理节点与规则分组。

Q19:sing-box 如何在 Windows 开机时以后台服务方式静默启动?#

答:在 Windows 系统中,除了使用 GUI 客户端的“开机自启”开关外,若使用原生 CLI 二进制,推荐将其注册为 Windows 独立 Service 服务。在 PowerShell 中以管理员身份运行命令 sing-box service install -c C:\sing-box\config.json,安装成功后继续运行 sing-box service start。这样 sing-box 将在 Windows 操作系统启动且尚未登录任何用户桌面前,便在后台系统服务层默默启动网络代理网关,确保服务与开机自动化任务全程享有稳定的网络加速。

Q20:为什么更新订阅后 sing-box 的出站策略组 (selector) 里的节点顺序变乱了?#

答:sing-box 的 selector 策略组节点列表顺序完全取决于 outbounds 字典中出站节点条目的定义顺序。订阅转换工具在拉取并转换远程机场节点列表时,如果未指定特定的排序规则,节点顺序将直接继承机场 API 返回的原始数据流。若需保持固定的节点排列顺序,可以在 Sub-Store 中配置节点排序脚本,按国家/地区字母缩写(如 HK, JP, US, SG)或节点序号进行字典序自动排列,或者在 sing-box 的 outbounds 配置中使用 filter 匹配规则动态组合节点。

Q21:sing-box 配置文件中的 sniff 流量域名嗅探有什么作用?#

答:在 TUN 模式或 SOCKS5 入站代理中,许多应用程序发送的网络请求目标 IP 是具体的纯 IP 地址(例如通过硬编码 IP 发起的连接),而没有经过 DNS 域名查询。此时 sing-box 的路由规则无法根据域名 (domain_suffix) 进行精准分流。开启 inbounds 字典中的 sniff: true(域名与 TLS/HTTP 流量嗅探)功能后,sing-box 内核会在数据包握手阶段自动提取并解析 TLS Client Hello 报文中的 SNI 域名信息或 HTTP 请求头中的 Host 字段,从而恢复出真实请求域名,使域名分流规则重新精准生效。

Q22:sing-box 能够支持 VLESS 的 REALITY 协议吗?配置时有哪些关键点?#

答:sing-box 原生全面支持 VLESS-Vision-REALITY 协议。配置 REALITY 出站节点时,关键注意点包括:在 outbounds 节点的 vless 配置块下,transport.type 设为 "tcp"tls.enabled 设为 true;必须配置 tls.reality.enabled: true,并在 tls.reality.public_key 中填入服务端的 REALITY 公钥,在 tls.reality.short_id 中填入短 ID。同时 tls.server_name 必须精准填入服务端借用的伪装 SNI 域名(如 apple.comdl.google.com),任何参数错漏都会导致 REALITY 握手被目标伪装站点直接拒绝。

Q23:sing-box 导入订阅后访问部分网站出现 403 Forbidden 错误该如何排查?#

答:访问网站报 HTTP 403 Forbidden 通常有三种可能性:第一,该网站开启了 Cloudflare 或 Akamai 的 Strict TLS / TLS Fingerprint 指纹防爬拦截,而节点的出站 IP 极有可能已被目标 CDN 列入风险黑名单;第二,本地 sing-box 的系统时间与 SNTP 时间服务不同步,导致 TLS 握手 Timestamp 偏移;第三,GeoIP/GeoSite 规则匹配有误,导致该网站的 API 请求被误判并打到了不匹配的节点。排查步骤:首先查看 sing-box 日志确认匹配的出站 tag;其次使用 curl -v 命令测试直连与代理出站响应 header;最后在策略组中为该域名手动强制指定干净独立的代理节点。

Q24:如何在 Linux 服务器上使用 sing-box 搭建全局透明代理网关?#

答:在 Linux (如 Ubuntu/Debian) 上搭建透明代理网关,需要在 sing-box 的 inbounds 中添加 tproxytun 类型的网关配置,将 auto_route 设为 truestrict_route 设为 true。同时需在 Linux 内核层开启 IP 转发功能:执行 sysctl -w net.ipv4.ip_forward=1 并写入 /etc/sysctl.conf。最后在局域网内其他设备(手机、电视、电脑)上,将网络设置中的“默认网关”与“DNS 服务器”手动指向这台 Linux 服务器的局域网 IP,即可实现全家所有设备免安装任何客户端的无感透明代理冲浪。

Q25:sing-box 在移动端(iOS / Android)耗电量大吗?如何进行省电优化?#

答:sing-box 内核由 Go 语言编写且经过极其严苛的二进制算法打磨,相比传统的代理客户端,其 CPU 占用与内存开销均降低了 40%–60%。若在移动端发现异常耗电,通常是由以下原因引起:1. 在 outbounds 中配置了极高频次的 urltest 自动测速(如每 10 秒测试一次),导致移动设备基带频繁从休眠状态被唤醒;2. 开启了过于繁复且未编译为二进制 .srs 的明文规则集。优化方案:在 GUI 客户端中将 urltest 测速间隔拉长至 300 秒(5 分钟)以上,关闭未使用的后台日志打印 (log.level: "off"),并全面使用本地 SRS 二进制规则集。

Q26:Sub-Store 网页打不开或者提示无法连接后端 API 该如何处理?#

答:Sub-Store 前端页面提示网络错误,通常是因为后端 Node.js / Docker 容器服务挂掉或本地端口被占用。排查步骤:在终端运行 docker ps | grep sub-store 检查容器运行状态;若容器异常退出,查看控制台日志 docker logs sub-store;检查环境变量中的 SUB_STORE_FRONTEND_BACKEND_PATH 是否设置匹配;如果部署在公网,确保防火墙已开放对应的 3001 端口并配置了 CORS 跨域允许标头。

Q27:sing-box 中的 gvisorsystem 协议栈有什么具体性能差异?#

答:gvisor 是 Go 语言在用户态实现的一套完全隔离的网络协议栈,优点是不依赖特定操作系统的 Kernel 驱动,跨平台兼容性极佳且能防范内核溢出漏洞;缺点是在千兆高并发下 CPU 占用比原生内核高约 15%。而 system 协议栈直接借用操作系统的网络协议栈,吞吐极限最高、延迟最低,但在部分 Windows 10 或旧版 macOS 系统上容易受到第三方杀毒软件网卡过滤驱动的干扰。

Q28:如何在 sing-box 配置中为特定的流媒体应用(如 Netflix、Disney+)配置独立选路?#

答:在 route.rule_set 中导入 geosite-netflixgeosite-disney 二进制规则集,并在 route.rules 数组中添加对应的分流条目:{"rule_set": "geosite-netflix", "outbound": "netflix-selector"}。然后在 outbounds 中创建一个专属的 selector 策略组(Tag 设为 "netflix-selector"),将包含原生 IP 解锁的节点填入该策略组中。这样访问 Netflix 的流量就会自动且精准地走该专属解锁节点。

Q29:sing-box 订阅拉取时提示 TLS 证书失效 (certificate signed by unknown authority) 怎么解决?#

答:该报错表明远程机场订阅服务器的 HTTPS TLS 证书未被你本地操作系统的根证书颁发机构 (CA) 信任。原因可能是机场使用了自签名证书、证书已过期,或者本地系统缺乏最新的 CA 根证书包。临时解决方法是在客户端 Profile 的 TLS 设置中开启 insecure: true 跳过证书校验(不推荐生产使用);根本解决方案是在 Linux 环境下运行 sudo apt-get install --reinstall ca-certificates 更新本地根证书库。

Q30:为什么在 sing-box 中配置了 ip_cidr 规则,但国内流量仍然误走了代理?#

答:主要有两个原因:第一,dns 模块没有将域名精准解析出真实 IP,导致匹配 ip_cidr 时拿到了 Fake-IP;第二,route.rules 中的规则匹配顺序颠倒了。sing-box 遵循“自上而下匹配、首条命中即止”的原则。如果将 final: "proxy" 或者包含泛域名的规则放在了 ip_cidr 规则的上方,数据包就会在到达 ip_cidr 判定前提前被拦截匹配并发送到了代理出站。

Q31:sing-box 如何实现 DNS 解析防污染与 CDN 本地最佳 IP 选路?#

答:sing-box 的经典双 DNS 架构可以完美解决此问题:在 dns.servers 中配置一个国内直连 DNS (224.5.5.5) 和一个海外代理加密 DNS (https://1.1.1.1/dns-query)。在 dns.rules 中设置:若匹配到 geosite-cn 规则集,则强制使用 dns-direct 查询,确保获取到的 CDN IP 为距离用户最近的大陆节点;若匹配海外域名,则走 dns-remote 并在代理出站中查询,彻底杜绝本地 ISP 的 DNS 域名污染。

Q32:sing-box 订阅更新频繁提示 429 Too Many Requests 是什么原因?#

答:这是由于客户端中配置的订阅自动刷新间隔过于频繁(如设为了每 5 分钟更新一次),触发了机场 API 防刷限制与 Cloudflare Rate Limit。解决方案:打开客户端 Profile 设置,将自动更新时间修正为标准的 1440 分钟(24 小时)或 720 分钟(12 小时);严禁将刷新间隔设置为 60 分钟以下。

Q33:Windows 11 开启 TUN 模式后,游戏客户端提示网卡驱动未签名怎么办?#

答:GUI 客户端在 Windows 上创建 TUN 网卡通常依赖 wintun.dll 驱动。如果遭遇安全软件报拦截或驱动签名校验失败,首先需要右键以“系统管理员身份运行” sing-box 客户端,确保驱动程序具备写入系统设备树的权限;其次在 Windows 安全中心 ──► 设备安全性 ──► 核心隔离中,临时检查是否因内核代码完整性保护阻断了虚拟网卡的挂载。

Q34:sing-box 配置中的 detour 链式代理(链式跳板)该如何设置?#

答:链式代理是指将流量先发送给代理节点 A(前置中转节点),再由节点 A 将流量二次转发给代理节点 B(落地解锁节点)。在 sing-box 中配置非常优雅:只需在节点 B 的 outbounds 字典中添加一行 "detour": "node-a-tag"(其中 node-a-tag 为节点 A 的 tag 标识)。sing-box 内核会自动在本地构建底层 TLS/TCP 隧道嵌套,实现真正的无感链式跳转。

Q35:sing-box 日志级别中的 tracedebug 有什么区别?#

答:debug 级别会输出节点的建连 TCP 握手、DNS 路由匹配过程与 API 调用;而 trace 级别是最高粒度的日志,会打印每一个网关数据包的 16 进制原始 Byte 头部与数据帧,仅适用于核心开发者排查极深度的 Golang 内核网络协议栈 Bug。日常故障定位使用 infodebug 即可。

Q36:如何在 sing-box 中配置 Hysteria 2 协议的流量伪装与自定义端口?#

答:在 outboundshysteria2 节点中,可以指定 "obfs": {"type": "salamander", "password": "your-obfs-password"} 开启 Salamander 算法混乱伪装;如果服务端开启了 UDP 端口跳跃,可以在 server_port 选项中指定端口范围,例如 "server_port": "20000-40000",sing-box 内核会在该端口区间内自动随机散列发包。

Q37:sing-box 配置中的 rule_set 如何做到离线加载?#

答:可以在 route.rule_set 字典中将类型声明为 "type": "local",格式声明为 "format": "binary",并将 path 指向本地已经编译好的 .srs 文件(例如 "path": "/etc/sing-box/rules/geosite-cn.srs")。这样在没有外网连通的纯局域网或断网环境下,sing-box 依然能毫秒级载入本地规则集。

Q38:sing-box 在 macOS 上退出后,浏览器无法上网该如何恢复?#

答:这是由于 sing-box 异常崩溃或被强制 Kill 导致未能正常还原 macOS 系统代理注册表。恢复步骤:打开 macOS 系统设置 ──► 网络 ──► 详细信息 ──► 代理,手动取消勾选“网页代理 (HTTP)”与“安全网页代理 (HTTPS)”;或者在 Terminal 中运行命令 networksetup -setwebproxystate Wi-Fi off 强制关闭代理状态。

Q39:为什么使用 sing-box 访问 Google 时频发 CAPTCHA 人机验证?#

答:Google 人机验证通常与代理节点的出站 IP 质量有关(如多用户共享同一干净度极低的机房 IP)。此外,若 sing-box 开启了 multiplex 多路复用,高并发连接从单个源端口并发涌入 Google CDN,也极易被识别为 Automated Bot。解决方案:在策略组中切换为更加干净的干净家宽 IP 节点,并在出站节点中关闭 multiplex 功能。

Q40:sing-box 导入订阅后,如何只让特定的浏览器或应用程序走代理?#

答:在 Windows / macOS 上,若仅需特定应用走代理,建议将 sing-box 运行在系统代理模式(关闭 TUN 模式),并在需要代理的浏览器(如 Chrome)中安装 SwitchyOmega / ZeroSwitch 插件,将其 SOCKS5 代理地址指向 127.0.0.1:2080。这样只有该浏览器绑定的流量会进入 sing-box,电脑上的微信、办公软件等均保持原生直连。

Q41:sing-box 支持在单台服务器上配置多个入站监听端口吗?#

答:完全支持。sing-box 的 inbounds 是一个标准 JSON 数组,可以在其中配置多个不同类型与端口的入站对象。例如:同时配置一个监听在 127.0.0.1:2080mixed 混合代理入站、一个监听在 0.0.0.0:5353 的 DNS 入站、以及一个 tun 全局网卡入站,内核会同时并行协同监听处理。

Q42:sing-box 导入订阅更新提示 outbounds.0: protocol not supported 是什么原因?#

答:这表明机场订阅中包含了你的 sing-box 客户端版本尚未支持的全新代理协议(或拼写有误)。例如旧版 sing-box 无法解析 tuichysteria2。解决方案:将客户端升级至最新的正式版或 Alpha 构建版;如果在配置中手动编写,需检查 type 拼写(例如 hysteria2 不能误写为 hysteria-v2)。

Q43:如何在 Linux 上使用 systemd 守护 sing-box 实现开机自启与崩溃复位?#

答:创建服务文件 /etc/systemd/system/sing-box.service,写入内容:

[Unit]
Description=sing-box service
After=network.target nss-lookup.target
[Service]
ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.json
Restart=on-failure
RestartSec=5s
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target

保存后运行 systemctl daemon-reload && systemctl enable --now sing-box 即可完成守护配置。

Q44:sing-box 中的 urltest 测速原理是什么?会额外消耗大量机场流量吗?#

答:urltest 的测速原理是定时向配置的 URL(如 https://www.gstatic.com/generate_204)发送一个极其轻量的 HTTP GET 请求,并统计从发送请求到收到 Header 响应的毫秒 RTT 延迟。每次测试消耗的流量不足 1KB,即使将测速间隔设为 3 分钟,一整天消耗的总流量也仅几百 KB,完全不必担心机场流量被耗尽。

Q45:sing-box 的配置文件支持环境变量引用与动态模板展开吗?#

答:原生 CLI 的 JSON 配置文件不支持直接在 JSON 内嵌入 $ENV_VAR 语法。若需要使用环境变量,推荐通过 Sub-Store 转换脚本处理,或者在 Bash 脚本中结合 envsubst 工具对模版 JSON 进行替换生成:envsubst < config.template.json > config.json

Q46:sing-box 如何拦截和屏蔽网页与 APP 广告流量?#

答:在 route.rule_set 中导入 geosite-category-ads-all 或第三方 AdGuard 编译的 .srs 规则集。然后在 route.rules 的靠前位置添加判定规则:{"rule_set": "geosite-category-ads-all", "outbound": "block-outbound"}。凡是命中的广告追踪域名,都会被 sing-box 丢弃至 block 零响应出站,实现秒级无感广告过滤。

Q47:sing-box 在树莓派 (Raspberry Pi) 等 ARM32 设备上可以运行吗?#

答:完全可以。sing-box 官方 GitHub Release 页面为所有的 Release 构建了全面的二进制架构包,包括 linux-armv7linux-arm64freebsd-amd64 等。只需下载对应的包并解压,即可在树莓派或单板计算机上无缝建立高效网关。

Q48:使用 sing-box 访问 GitHub 提示 SSL_ERROR_SYSCALL 如何排查?#

答:该错误通常是因为 GitHub 域名在本地 DNS 阶段被污染,或者 SNI 在握手阶段遭到了阻断。排查方法:首先确认 geosite-github 规则集已载入且生效;其次在 dns.rules 中确保 github.com 及其子域名强制使用海外 dns-remote 进行解析;最后检查节点出站的 TLS SNI 是否被干扰,必要时开启 utls 指纹伪装。

Q49:sing-box 导入订阅后,如何配置本地 SOCKS5 代理给 Telegram 独立使用?#

答:在 inbounds 数组中增加一个专门的 socks 类型入站:

{
"type": "socks",
"tag": "tg-in",
"listen": "127.0.0.1",
"listen_port": 10808
}

然后在 Telegram 客户端的代理设置中,选择添加 SOCKS5 代理,填入地址 127.0.0.1 与端口 10808,即可让 Telegram 的数据通信独立建立加密隧道。

Q50:未来 sing-box 的配置格式还会发生破坏性不兼容更新吗?#

答:sing-box 遵循严格的语义化版本号规范 (Semantic Versioning)。在 v1.x 主版本迭代周期内,核心 JSON 架构与 Strict Schema 保持向前向下高度兼容;任何重大改动(如废弃旧字段或引入新逻辑)都会在官方 Release Notes 中提前多版本发布 Deprecation Warning 警告,使用 Sub-Store 等现代化转换工具亦可实现平滑无缝升级。

十一、 全文总结与最佳实践建议#

导入并高效使用 sing-box 的核心技术要点总结如下:

  1. 认准 Strict JSON 规范:始终确保配置字典的 logdnsinboundsoutboundsroute 六大层级合规,避免字段拼写与数据类型错误。
  2. 优先私有 Sub-Store 转换:面对不支持 sing-box 原生订阅的机场,首选私有部署 Sub-Store,兼顾转换准确度与个人订阅隐私安全。
  3. 拥抱 TUN 模式与二进制规则集:充分利用 sing-box 的 TUN 模式全网卡接管能力与 .srs 规则集极速匹配特性,打造低延迟、低功耗的全自动化代理环境。

[相关文章:Shadowrocket (小火箭) 节点怎么选择?连通性测试与延迟优化] [相关文章:Shadowrocket (小火箭) 测速超时怎么办?超时-1与延迟无响应排查] [相关文章:Shadowrocket (小火箭) 怎么导入订阅?扫码与订阅链接一键导入教程] [相关文章:Clash Verge Rev 订阅更新失败:Network Error与转换异常解决]

sing-box怎么导入订阅?JSON配置文件与转换指南
https://jichangfan.com/posts/sing-box-daoru-dingyue/
作者
机场翻
发布于
2024-04-18
许可协议
CC BY-NC-SA 4.0