sing-box 配置优化评审 + 参考项目分析 + GUI 选型
本文所有改动都用 sing-box 1.14.2 真二进制 验证过(
sing-box checkexit=0,无弃用告警)。
参考项目:Fanju6/NetProxy-Magisk(Magisk 模块,内置
sing-box 1.15.0-alpha.8 + eBPF 透明代理 + Android App + WebUI,维护很积极)。
🕓 2026-10-02 复核追注
本文写于 TUN 时代。当天中午起本机已切到 eBPF 模式:现役
sing-box-ebpf 1.14.2.ref1nd-2
(fork 构建),入站是local.cgroup+shared: packet_rewrite(挂virbr0),
配置里已没有 TUN 入站(sing-box api ebpf实测role=local/mechanism=cgroup+role=shared/mechanism=tcx)。
所以文中凡以「你用 TUN」为前提的表述(第二节末行、第四节tun.stack一项、第六节)都已过时;
另有两处结论后来被实测推翻(type: "group"的支持情况、/ui/自托管面板)。
下面都在原处加了带日期的追注,原文一律保留 —— 记录”当时是怎么判的”才是本文的价值。
一、已应用的改动(累计 17 项,逐项经真二进制校验)
| # | 改动 | 依据 |
|---|---|---|
| 1 | 7 组规则集 remote → local |
启动不再依赖被污染的 raw.githubusercontent.com |
| 2 | log.level info → warn |
日志里逐条打印 dns: exchanged AAAA …,纯噪音 |
| 3 | cache_file.store_dns: true |
DNS 缓存跨重启保留 |
| 4 | route.find_process true → false |
无任何进程分流规则,却在每条连接做 /proc 查找(日志可见 router: found process path) |
| 5 | 删除冗余 socks:7893 |
mixed:7892 已含 SOCKS5 |
| 6-7 | Proxy/Auto 的 interrupt_exist_connections → false |
原来切节点会掐断所有已建连接 → pacman 下载中断 |
| 8 | Proxy 成员 13 → 16(当天又补入 Download,现为 17) |
Japan/HongKong/Singapore 原来不是 Proxy 成员,面板里选不到 |
| 9 | geosite/apple@cn → 直连(路由 + DNS) |
借鉴自该项目:Apple 服务走国内 CDN 更快,避免绕道海外 |
| 10 | experimental.clash_api → services:[api + 内置 dashboard] |
借鉴自该项目:sing-box 自己下载并伺服官方面板,浏览器开 http://127.0.0.1:9091 就是 GUI |
第 10 项用到的默认面板源是 sing-box 二进制内置的https://github.com/SagerNet/sing-box-dashboard/archive/refs/heads/gh-pages.zip
(实测可下载,6.7 MB、2026-09-28 更新),经 http_client: proxy-rules 走代理下载到/var/lib/sing-box/dashboard。
二、参考项目里值得抄但我没采纳的
| 它的写法 | 为什么没采纳 |
|---|---|
{"type":"group","servers":[...]} DNS 服务器组(多上游故障转移) |
❌ FATAL: unknown transport type: group。这是 1.15 的新特性(它内置 1.15.0-alpha.8)。等你升级到 1.15,这正好能把那 3 个没用的 DNS 服务器改成故障转移组 —— 记下来⚠️ 2026-10-02 追注:此结论已被推翻。 现役 fork 构建 sing-box-ebpf 1.14.2.ref1nd 支持 type: "group"(实测:含 group 的最小配置 sing-box check exit=0),线上配置已在用 dns-proxy = [cf, google] / dns-direct = [ali, tencent] 两个故障转移组(当天 10:35 启用),不必等 1.15。(”上游原版 1.14 不支持”这次未再复核) |
{"type":"hosts","predefined":{...}} 预解析 DoH 域名 |
你的 DoH 直接用 IP + tls.server_name,不存在”解析 DoH 自己的域名”的循环,不需要 |
{"action":"resolve","match_only":true} 放在 geoip 规则前 |
主要为 FakeIP 模式准备;你是 real-ip,TUN 收到的是真实目的 IP,geoip 直接可匹配 |
clash_mode: Global/Direct/AllowAds 规则 |
让面板的模式开关真正生效(可选增强,非必需;你的 selector 已能直接切节点) |
Ads_AWAvenue 广告规则集 |
比 geosite/category-ads-all 更激进的国内广告列表,可选;你现在已有 reject 规则 |
log.output 写日志文件 |
你有 journald,不需要 |
只有 mixed 入站 + eBPF 做透明代理 |
那是 dae 的路子(它内部有 ebpf/ 代码);local.cgroup + shared packet_rewrite),TUN 不再使用 |
值得注意:它的规则集也是本地 .srs 优先(随模块打包),只有广告列表走远程 —— 印证了我们
“规则集本地化”的方向是对的。
三、GUI 选型(你问的重点)
结论:官方面板偏工程化,社区主流是 metacubexd / zashboard;两者协议不同,所以现在两套并存。
⚠️ 2026-10-02 收尾复核:实际落地的 GUI 不是下表的 MetaCubeXD,而是自研的
sing-box-panel(127.0.0.1:9096,内嵌 zashboard,ss -ltnp实测在听、HTTP 200、
页面含MetaCubeXD/zashboard字样)。现役clash_api没有external_ui/external_ui_download_url字段,所以下表第一行的http://127.0.0.1:9090/ui/现在 404
(Clash API 根路径无密钥仍是 401);官方 dashboard 那一行的http://127.0.0.1:9091/dashboard/仍 200(根路径 302 →/dashboard/)。
下面 9099 端口的实测是当时的一次性试跑,9099 现在没有监听。
| 面板 | 地址 | 协议 | 说明 |
|---|---|---|---|
| MetaCubeXD(推荐) | http://127.0.0.1:9090/ui/(自托管) 或 https://metacubex.github.io/metacubexd/ + 后端 http://127.0.0.1:9090、密钥 <clash-api-secret> |
Clash REST | 观感现代;节点延迟测试、连接实时流量、规则、日志齐全。密钥 <clash-api-secret> |
| 官方 dashboard | http://127.0.0.1:9091/dashboard/ | gRPC-Web(daemon.StartedService) |
官方出品、功能全但界面朴素;密钥同样 <clash-api-secret> |
| zashboard | https://board.zash.run.place/ | Clash REST | 更现代的另一选择;把 external_ui_download_url 换成它的 gh-pages zip 即可自托管 |
| Throne | sudo pacman -S throne(archlinuxcn 1.3.2-1) |
Qt 桌面程序,后端 sing-box | 真正的桌面 GUI,发布活跃(2026-09-29)。⚠️ 它自己管理内核与配置,不要和 systemd 服务同时开 |
| sing-box for Desktop | — | — | 官方仓库自述是 “Experimental Windows client”,Linux 暂无产物 |
实测验证(用你的二进制在 9099 端口真跑了一遍)
| 实测项 | 结果 |
|---|---|
external_ui 自托管路径 |
/ui/ → 200,标题 MetaCubeXD(zip 顶层目录被自动剥掉;/ui/metacubexd-gh-pages/ 会 404) |
Access-Control-Allow-Origin |
* |
| 私网访问预检 | Access-Control-Allow-Private-Network: true(Chrome 的 PNA 不会拦托管面板) |
Clash API 根路径 / 无密钥 |
401 {"message":"Unauthorized"} ← 你之前看到的报错就是它(旧配置的 Clash API) |
三之二、其余 GUI 说明
四、我验证过、明确不建议做的(避免被网上教程带偏)
| 项目 | 结论 | 证据 |
|---|---|---|
| 阻断 QUIC(UDP 443) | ❌ 不要 | 实测你节点 UDP 中继正常:cloudflare-quic.com HTTP/3 0.300s vs HTTP/2 0.310s |
dns.independent_cache |
❌ 不要 | 真二进制告警:1.14 弃用、1.16 移除(你配置里本来就没有) |
把 dns_mode 写进 dns 段 |
❌ 无效 | 实测 json: unknown field "dns_mode";它是入站字段、不在 dns 段(TUN 入站的取值是 disabled/native/hijack;2026-10-02 追注:现役 eBPF 入站的 local/shared 也有同名 dns_mode,线上取 hijack),你用 hijack-dns 规则动作已实现且工作正常 |
cache_file.store_rdrc |
❌ 不要 | 1.14 已弃用,且规则集本地化后无意义 |
tun.stack: system / mtu: 9000 |
⚠️ 已不适用(2026-10-02 追注) | 现役配置没有 TUN 入站(当天起走 eBPF:local.cgroup + shared packet_rewrite),这两项只存在于备份的 TUN 配置里 |
dns.strategy: prefer_ipv4 / 规则顺序 |
✅ 保持 | 都是当前场景的最优选择(你的 IPv6 只有 ULA,必须偏 IPv4 —— 实测线上 dns.strategy = "prefer_ipv4";DNS 劫持必须在私网直连之前 —— 实测 hijack-dns 仍是第 2 条规则、ip_is_private 第 3 条) |
五、死配置清单(可选整洁化)
以下条目没有被任何规则/选择器引用,留着不影响运行(⚠️ 2026-10-02 复核:其中两条已被实测推翻,
见下方删除线;原文保留以记录当时的判断):
dns.servers里的dns-proxy-google、dns-direct-tencent、dns-local(5 个里 3 个没用)
→ 升级到 1.15 后可以用type: "group"把它们变成故障转移组(见第二节)
→ ⚠️ 2026-10-02 复核:此条已推翻。 实测现役dns.servers共 7 个,dns-proxy-google与dns-direct-tencent都在被group引用(dns-proxy = [dns-proxy-cf, dns-proxy-google]、dns-direct = [dns-direct-ali, dns-direct-tencent]),配置里根本没有dns-local。
故障转移组也已在当天 10:35 落地,不需要等 1.15。- 出站
block(现代写法是reject规则动作,你已在用)—— ✅ 2026-10-02 实测仍成立:outbounds里确有block,而 11 条路由规则只引用了direct/Proxy 路由规则 10(quic/443 → Proxy)和规则 11(无条件→ Proxy)—— 与route.final = Proxy重复,两条都空转
→ ⚠️ 2026-10-02 复核:此条已推翻(配置早被重排)。现役共 11 条规则:第 10 条是geoip/telegram → Proxy(仍与route.final = Proxy重复,属空转),第 11 条是geoip/cn + geoip/cn-fresh + cncidr-mihomo → direct(不空转,是 CN 直连兜底,不能删)。
「quic/443」和「无条件 → Proxy」这两条规则现在都不存在。http_clients/route.default_http_client—— 现在只被第 10 项的面板下载用到,仍有价值,保留
(✅ 2026-10-02 实测:http_clients = [proxy-rules]、route.default_http_client = "proxy-rules",services[api].dashboard.http_client = "proxy-rules"确实还在引用)
六、前瞻:升级到 1.15 时
官方 migration 目录里 1.15.0 有一节 Migrate TUN stack。等 CachyOS 把 sing-box 升到
1.15 时,先跑一次 sing-box check -c /etc/sing-box/config.json 看告警;
顺带可以把 type: "group" 的 DNS 故障转移组用上。
⚠️ 2026-10-02 追注:这一节的两项都已不成立。
①type: "group"的 DNS 故障转移组当天已经启用(见第二节追注),不用等 1.15;
② 本机没有 TUN 入站(当天起走 eBPF),Migrate TUN stack对本机没有对象。
另外现役跑的是 fork 构建sing-box-ebpf 1.14.2.ref1nd-2(pacman -Q sing-box-ebpf实测),
升级节奏跟 reF1nd fork 的 tag 走,不是 CachyOS 的官方sing-box包。
七、怎么应用
cd ~/Documents/deepseek-harness/default-workspace
sudo ./switch-to-local-rules.sh --dry-run # 预览(含上面 10 项)
sudo ./switch-to-local-rules.sh # 应用
脚本流程:放好规则集 → 写配置 → sing-box check 通过才重启 → 验证出口 IP;
失败自动还原(/etc/sing-box/config.json.bak.<时间戳>,.bak 结尾不会被 -C 目录模式误读)。
改动前的配置备份在 ~/.config/sing-box/config.tun-perf.json.pre-opt.<时间戳>。











