最后验证:2026-10-02T15:08:38Z

sing-box 配置优化评审 + 参考项目分析 + GUI 选型

本文所有改动都用 sing-box 1.14.2 真二进制 验证过(sing-box check exit=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 服务器组(多上游故障转移) ❌ 你的 1.14.2 不支持:实测 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/ 代码);你用 TUN,跨内核/跨版本更省心 ⚠️ 2026-10-02 追注:本机当天已改用 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.<时间戳>。