sing-box怎么导入订阅?JSON配置文件与转换指南
2026 最新 sing-box 订阅导入与 JSON 配置终极指南,深度拆解 4 种导入方式、Sub-Store 订阅转换、TUN 模式配置与 30 个启动报错排查案例。
作为新一代通用网络代理内核与跨平台客户端,sing-box 凭借其极其轻量的架构设计、极低的内存与 CPU 资源占用、原生的 TUN 模式网关支持 以及对 Hysteria 2、TUIC v5、VLESS-Vision-REALITY、ShadowTLS 等先进无感代理协议的全量支持,迅速成为了 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)在结构上包含以下六大顶级字典区块:
log(日志模块):定义控制台或日志文件的输出级别(debug/info/warn/error/off),用于排查网络建连故障与路由规则匹配路径。dns(域名解析选路模块):sing-box 拥有极其强大的原生 DNS 引擎。包含servers(上游 DNS 服务器列表)、rules(DNS 域名分流匹配规则)、final(默认降级 DNS)以及fakeip(伪 IP 映射池设置)。inbounds(本地入站网关模块):定义本地设备如何将流量注入 sing-box 内核。支持mixed(HTTP/SOCKS5 混合代理)、socks、http以及直接截管全网卡流量的tun虚拟网卡模式。outbounds(出站节点与策略组模块):存放所有远程代理节点(如 Hysteria 2、TUIC、VLESS、Shadowsocks)以及本地逻辑出站(如direct直连、block阻断、selector手动选择组、urltest自动最低延迟选路组)。导入订阅的核心目的就是填充这个数组。route(路由分流与规则集模块):决定数据包在匹配到特定目标 IP 或域名时,应当发送至哪一个出站 (outbound)。支持嵌入rule_set(二进制.srs规则集或远程 JSON 规则集),实现极速的高并发匹配。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 语法,且节点结构使用
proxies和proxy-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 启动时就会抛出致命错误并退出进程。
常见的语法校验错误与底层技术成因包括:
- Outbound 缺少 Tag 标识 (
missing tag):sing-box 规定outbounds数组中的每一个节点或策略组字典,都必须具备全局唯一的tag字符串标识。路由规则 (route.rules) 和代理组 (selector/urltest) 就是通过匹配tag来进行数据包重定向与节点切换的。如果订阅转换器生成的节点列表中存在没有tag的条目,整个配置文件解析直接宣告失败。 - 端口类型映射错误 (
invalid type for port):在 sing-box 的 JSON 架构中,server_port必须写为纯数字类型(例如443),而不能写成带双引号的字符串格式(例如"443")。由于许多第三方转换工具未针对 sing-box 强类型模式做数据清洗,字符串类型的端口会导致强类型转换失败。 - 路由规则字段误用: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错误。 - 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 配置生成器。
- 操作步骤:
- 登录机场后台控制面板;
- 进入“订阅中心”或“一键导入”页面;
- 找到 sing-box 专属订阅链接(URL 中通常带有
flag=singbox或target=singbox参数); - 点击“一键导入到 sing-box”按钮,或复制该 API 链接黏贴至客户端的远程 Profile 输入框中。
- 优点:无需任何中间转换过程,机场已预先配置好推荐的
dns规则与节点映射。
2. 使用 Sub-Store 转换与组装 sing-box 专属订阅(首选最佳实践)
对于拥有多个机场订阅、自建节点,或者机场不支持 sing-box 原生导出功能的用户,Sub-Store (订阅管理工具) 是目前行业公认最强大、最安全、最灵活的转换枢纽。
- 操作步骤:
- 在本地 Docker、VPS 服务器或 iOS Node.js 环境部署 Sub-Store 服务;
- 在 Sub-Store Web 界面中添加你的 Clash、Shadowrocket 或 V2Ray 原生订阅;
- 在单订阅或组合订阅右侧点击 “生成单订阅”;
- 目标格式选择
sing-box; - 复制 Sub-Store 生成的专属链接填入 sing-box 客户端完成导入。
- 优点:支持节点重命名、节点过滤、正则去重以及一键将任意传统订阅转换为符合最新 sing-box Schema 的 JSON。
3. 使用 SubConverter 开源工具将 Clash/Base64 订阅转换为 sing-box JSON
对于没有部署 Sub-Store 的用户,可以使用开源的 SubConverter (订阅转换引擎)。
- 操作步骤:
- 打开信任的在线订阅转换 Web 前端(或本地运行的 subconverter 容器);
- 将机场的 Clash 链接或 Base64 链接黏贴至订阅输入框;
- 客户端类型 (Target) 选择
sing-box; - 点击“生成订阅链接”,将生成的后端 API URL 导入 sing-box 客户端中。
4. 手动编写/修改本地 config.json 配置文件导入
适用于 Linux 服务器、树莓派软路由,或者需要精细控制每一个 JSON 字段的高级玩家。
- 操作步骤:
- 在本地文本编辑器(如 VS Code)中新建
config.json; - 构造标准的
log、dns、inbounds、outbounds与routeJSON 字典对象; - 将机场节点的明文参数填入
outbounds数组中; - 通过 CLI 或客户端选择“从本地文件导入”。
在实际的操作系统安全沙盒机制下,理解这 4 种订阅导入路径背后的底层通信交互,有助于在遇到特定的导入异常时进行精准的技术判断与快速恢复。使用 Sub-Store 或原生客户端导入 Profile 时,客户端会建立独立的 SQLite 缓存库记录每个出站节点的拉取历史与 RTT 测试数据。
5. Sub-Store 在 sing-box 体系中的高级筛选与脚本处理
Sub-Store 不仅是一个格式转换工具,更是一个运行在本地或云端的声明式订阅管理平台。在 sing-box 体系中,Sub-Store 提供了高度定制的 JavaScript 脚本支持与正则表达式节点筛选机制:
- 节点重命名与正则过滤:机场订阅往往包含大量带有广告前缀(如“【官网】特惠节点”)或过载测试节点。利用 Sub-Store 的正则替换节点名称功能,可以一键清洗节点 tag,将其标准化为
香港 01 | IPLC、日本 02 | BGP等规范格式,防止 sing-box 在生成selector出站组时因重名 tag 导致路由解析冲突。 - 多订阅聚合与去重 (Aggregation & Deduplication):对于拥有多个机场或自建 VPS 节点的用户,Sub-Store 可以将不同来源的 VLESS、Shadowsocks、Hysteria 2、TUIC 订阅合并到一个统一的 sing-box 订阅中,并自动剔除重复的 IP 与端口映射,极大简化客户端的节点列表。
- 落地节点延迟与可用性预检:Sub-Store 可以在导出 sing-box 配置前,自动在后台向节点发起 HTTP GET 或 TCP Handshake 连通性测试,自动过滤掉无法建连的死节点,确保导入 sing-box 客户端的配置中均为健康节点。
- 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-Box | Windows / macOS / Linux | 强大桌面风 | 支持 (需管理员权限) | 支持 (含图形编辑器) | 提供直观的 Outbound / Route 图形化配置修改面板 |
| Karing | iOS / 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 转换
- 在机场面板找到原生 sing-box 订阅 并复制;
- 若机场不支持,打开自建的 Sub-Store 后台,将传统订阅转码为 sing-box 专属链接。
步骤 2:在客户端中添加远程 Profile (配置)
- 打开 sing-box 客户端(以官方客户端为例),进入 Profiles 页面;
- 点击右上角
+添加 Profile; - Name (名称):填写机场名称(如
Airport-SingBox); - Type (类型):选择
Remote(远程); - URL:黏贴复制的链接,并设置 Auto Update (自动更新) 间隔为
1440分钟(24 小时)。
步骤 3:配置二进制规则集 (Rule Set .srs) 自动更新
为了实现大陆域名直连、海外域名走代理以及广告域名阻断,确保配置文件的 route.rule_set 中包含如 geosite-cn、geosite-geolocation-!cn、geoip-cn 等规则集下载 URL。客户端在载入 Profile 时会自动拉取这些二进制规则集。
步骤 4:启用 TUN 模式网关与修改高级路由标记
进入客户端设置页面:
- 开启 TUN Mode (TUN 模式) 开关;
- Stack (协议栈) 选择
gvisor或system(Windows / macOS 推荐gvisor,性能更稳定); - 勾选 Auto Route (自动添加系统路由表) 与 Strict Route (严格路由隔离)。
步骤 5:连通性测试与按节点组选路
- 返回主界面,点击订阅下方的节点列表;
- 点击右上角 “延迟测试” (URL Test) 图标;
- 排除出现超时或
-1ms的故障节点,在Selector(节点选择) 分组中选择低延迟的香港、日本或新加坡节点。
步骤 6:保存持久化配置并检查后台 Daemon 进程日志
- 点击 Enable (启用) 开关切换至绿色激活状态;
- 打开客户端 Logs (日志) 选项卡;
- 确认控制台持续打印
sing-box started以及TUN device created successfully提示,表明订阅导入与服务启动完全正常。
7. sing-box GUI 客户端高级网络接管机制
在各平台桌面与移动端 GUI 客户端中,sing-box 提供了两种主要的网络流量接管方式:系统代理 (System Proxy) 与 TUN 虚拟网卡模式 (TUN Mode)。
-
系统代理模式底层机制: 系统代理模式主要通过修改操作系统的 HTTP/HTTPS/SOCKS5 代理环境变量与注册表表项(如 Windows 系统的
Internet Option注册表,macOS 的scutil --proxy状态机),引导支持系统代理的浏览器与应用程序将网络请求发送至 sing-box 的inbounds监听端口(通常为127.0.0.1:2080)。然而,系统代理模式无法接管使用 UDP 协议的在线游戏、命令行终端 (cURL/Git)、微信等自带网络栈的软件,亦无法防范 DNS 污染。 -
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 文件是否存在语法错误、缺失标签或不合法的字段。
- 命令行格式:
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规则集文件。 - 命令行格式:
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 端口启动后,代理出站是否真正连通外网。
- 命令行格式:
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),替代了传统客户端庞大且低效的明文文本规则列表。
- 明文 JSON 规则集与编译为 SRS 二进制:
用户可以使用 CLI 命令
sing-box rule-set compile --output geosite-cn.srs geosite-cn.json将文本 JSON 规则集预先编译为单文件二进制模型。SRS 格式经过内存优化与基数树 (Radix Tree) 索引重构,能够将十万条域名规则的匹配查找时间降低至微秒级,同时减少 70% 以上的内存开销。 - Rule-Set 自动更新机制与 Head 请求:
在 sing-box 的
route.rule_set配置项中,可以指定update_interval(如"1d"一天)与download_url。sing-box 内核包含智能更新逻辑,在触发规则集更新时会先向远程服务器发送 HTTPHEAD请求对比ETag或Last-Modified响应头,仅在规则集文件发生变更时才拉取完整数据包,有效节省系统带宽与 CPU 运算资源。 - GeoIP 与 GeoSite 数据库解耦:
sing-box 2026 版本中彻底解耦了内置的
geoip.db与geosite.db庞大数据库,推荐全面拥抱轻量化、按需加载的远程 SRS 规则集架构。通过将 GeoSite/GeoIP 拆分为按需拉取的分类模块(如仅下载geosite-youtube与geoip-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 时,建议实施以下优化措施:
- TUN 协议栈模式选型 (
stack):
gvisor:在 Go 用户态实现网络协议栈,兼容性极佳,安全性高,适用于 Windows / macOS 桌面端;system:直接使用操作系统的原生网络协议栈,吞吐性能最高、CPU 消耗最低,适用于 Linux 服务器或高性能软路由;lwip:轻量级 TCP/IP 协议栈,适用于高并发场景,但部分移动端系统可能存在稳定性兼容瑕疵。
-
伪 IP (Fake-IP) 映射与本地 LAN 防泄露: 若使用 Fake-IP 模式,必须在
dns规则中对192.168.0.0/16、10.0.0.0/8、172.16.0.0/12等本地私有网段以及.local/.lan域名设置直连与排除,防止本地 NAS、打印机或路由器管理页面因被赋予 Fake-IP 而无法连通。 -
规则集下载出站代理 (
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]对象,发现包含type和server但误将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_gvisor或with_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协议配置,检查version、password与tls.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。 - 执行步骤:在
outbounds的tuic节点中增加配置项"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字典中network与flow的字段组合。 - 关键证据:配置文件中写有
"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键名(本地规则集类型应为inline或source)。 - 排查路径:查验
route.rule_set字典中本地条目的字典描述。 - 关键证据:字典中写有
"type": "local"且带有"path": "./my-rule.json"。 - 执行步骤:按照最新 Schema 将本地文件声明修正为
"type": "local", "format": "source", "path": "my-rule.json"。 - 结果验证:再次校验,sing-box 顺利载入本地文件规则集。
- 复盘:sing-box 规则集模块严格区分
remote与local/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协议配置,检查version、password与tls.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 的 selector 与 urltest 有什么区别?
答: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/dns 或 dnsleaktest.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/8、172.16.0.0/12、192.168.0.0/16,强制其走 dhcp 或 local-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/dns 或 dnsleaktest.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/8、172.16.0.0/12、192.168.0.0/16,强制其走 dhcp 或 local-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.com 或 dl.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 中添加 tproxy 或 tun 类型的网关配置,将 auto_route 设为 true,strict_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 中的 gvisor 与 system 协议栈有什么具体性能差异?
答:gvisor 是 Go 语言在用户态实现的一套完全隔离的网络协议栈,优点是不依赖特定操作系统的 Kernel 驱动,跨平台兼容性极佳且能防范内核溢出漏洞;缺点是在千兆高并发下 CPU 占用比原生内核高约 15%。而 system 协议栈直接借用操作系统的网络协议栈,吞吐极限最高、延迟最低,但在部分 Windows 10 或旧版 macOS 系统上容易受到第三方杀毒软件网卡过滤驱动的干扰。
Q28:如何在 sing-box 配置中为特定的流媒体应用(如 Netflix、Disney+)配置独立选路?
答:在 route.rule_set 中导入 geosite-netflix 和 geosite-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 日志级别中的 trace 与 debug 有什么区别?
答:debug 级别会输出节点的建连 TCP 握手、DNS 路由匹配过程与 API 调用;而 trace 级别是最高粒度的日志,会打印每一个网关数据包的 16 进制原始 Byte 头部与数据帧,仅适用于核心开发者排查极深度的 Golang 内核网络协议栈 Bug。日常故障定位使用 info 或 debug 即可。
Q36:如何在 sing-box 中配置 Hysteria 2 协议的流量伪装与自定义端口?
答:在 outbounds 的 hysteria2 节点中,可以指定 "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:2080 的 mixed 混合代理入站、一个监听在 0.0.0.0:5353 的 DNS 入站、以及一个 tun 全局网卡入站,内核会同时并行协同监听处理。
Q42:sing-box 导入订阅更新提示 outbounds.0: protocol not supported 是什么原因?
答:这表明机场订阅中包含了你的 sing-box 客户端版本尚未支持的全新代理协议(或拼写有误)。例如旧版 sing-box 无法解析 tuic 或 hysteria2。解决方案:将客户端升级至最新的正式版或 Alpha 构建版;如果在配置中手动编写,需检查 type 拼写(例如 hysteria2 不能误写为 hysteria-v2)。
Q43:如何在 Linux 上使用 systemd 守护 sing-box 实现开机自启与崩溃复位?
答:创建服务文件 /etc/systemd/system/sing-box.service,写入内容:
[Unit]Description=sing-box serviceAfter=network.target nss-lookup.target
[Service]ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.jsonRestart=on-failureRestartSec=5sLimitNOFILE=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-armv7、linux-arm64、freebsd-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 的核心技术要点总结如下:
- 认准 Strict JSON 规范:始终确保配置字典的
log、dns、inbounds、outbounds与route六大层级合规,避免字段拼写与数据类型错误。 - 优先私有 Sub-Store 转换:面对不支持 sing-box 原生订阅的机场,首选私有部署 Sub-Store,兼顾转换准确度与个人订阅隐私安全。
- 拥抱 TUN 模式与二进制规则集:充分利用 sing-box 的 TUN 模式全网卡接管能力与
.srs规则集极速匹配特性,打造低延迟、低功耗的全自动化代理环境。
[相关文章:Shadowrocket (小火箭) 节点怎么选择?连通性测试与延迟优化] [相关文章:Shadowrocket (小火箭) 测速超时怎么办?超时-1与延迟无响应排查] [相关文章:Shadowrocket (小火箭) 怎么导入订阅?扫码与订阅链接一键导入教程] [相关文章:Clash Verge Rev 订阅更新失败:Network Error与转换异常解决]