sing-box 完整审计与优化报告
- 主机:CachyOS(Arch rolling)· 内核 7.2.9-1-cachyos-bore-lto · systemd 262-1-arch
- 审计时间:2026-10-08 12:00 ~ 13:53(Asia/Shanghai)
- 审计者权限:普通用户 emo(uid=1000,属 wheel/network/docker/libvirt);sudo 需密码 → 所有破坏性/系统级改动由你执行
- 审计对象:/etc/sing-box/config.json(审计时 16693 B → 落地后 16641 B,0600 root)+ 单机 systemd 服务 sing-box.service
- 本报告不含任何节点地址、口令或密钥明文;所有凭据与可识别地址一律用占位符(
<home-ip>/<proxy-exit-ip>/<node-server>/<lan-gateway>/<clash-api-secret>)打码
一、第 0 步 · 环境事实清单
| 项目 | 实测值 | 来源/命令 |
|---|---|---|
| 发行版 | CachyOS(Arch rolling) | /etc/os-release |
| 内核 | 7.2.9-1-cachyos-bore-lto x86_64 | uname -r |
| init | systemd 262-1-arch(无 launchd / Windows 服务) | systemctl –version |
| 当前用户 | emo uid=1000;组 wheel,network,docker,libvirt,… | id |
| sudo | 需要密码(sudo -n 全部失败) | sudo -n true |
| 安装方式 | pacman 包 sing-box-ebpf 1.14.2.ref1nd-2 | pacman -Qi |
| 可执行文件 | /usr/bin/sing-box(root:root,83943392 B,2026-10-02 09:54),全盘唯一 | which/stat/find |
| 版本 | v1.14.2-reF1nd(go1.27.1-X:nodwarf5 linux/amd64,tags: with_gvisor,with_quic,with_ebpf,CGO disabled) | sing-box version |
| 上游最新 | v1.14.2 → 与上游持平,无需升级(本项目 fork 的 1.15 仍处 alpha) | GitHub Releases |
| 服务单元 | /usr/lib/systemd/system/sing-box.service:User=root、StateDirectory=sing-box、LimitMEMLOCK=infinity、LimitNOFILE=infinity、Restart=on-failure、RestartSec=10s、ExecStart=/usr/bin/sing-box -D /var/lib/sing-box -C /etc/sing-box run | systemctl cat |
| 实际进程 | root pid 144710 | ps |
| drop-in | /etc/systemd/system/sing-box.service.d/10-config-check.conf:ExecStartPre=/usr/bin/sing-box check -c /etc/sing-box/config.json(10-08 12:47 新增,是唯一 drop-in) | systemctl cat |
| 配置加载 | -C /etc/sing-box 目录 + 单文件 /etc/sing-box/config.json(16693 B,0600 root,mtime 2026-10-08 12:01:41);无 include 拆分;emo 读不了(EACCES),审计用世界可读的备份副本 | ls/stat |
| rule-set | 17 条全部 type=local format=binary,分布:/etc/sing-box/rule-set(2)+ /usr/share/sing-box-rule-set(7)+ /usr/share/sing-box-rule-sets(8),逐条路径实测存在 | jq + ls |
| 日志 | journald(emo 可读) | journalctl -u sing-box |
| 监听端口 | 127.0.0.1:7892 mixed-in / :9090 clash_api / :9091 services.api / :9096 sing-box-panel;eBPF 入站不占用户态端口 | ss -ltnp |
| 历史报错 | 10-07 12:53、17:08 network: missing default interface;10-07 19:26、19:39 connection upload handshake: i/o timeout;10-08 12:32 unsupported address;12:47 重启后至今无新 ERROR |
journalctl |
| ~/code/pkg/build | 未找到(用户提到的目录不存在)→ 第 2 步改为审计实际存在的两个同步脚本仓库 | ls |
拓扑事实(影响测试判据,务必知道)
本机 systemd-resolved(/etc/resolv.conf → 127.0.0.53)+ eBPF 入站,使宿主机自身的 DNS 与 TCP 都被 sing-box 透明接管:
- 不设代理的
curl https://www.google.com/generate_204= 204;Cloudflare trace 直连 colo=HKG(走代理出口) getent解析广告域全部 NXDOMAIN;example.com 正常 → 广告拦截在 DNS 层生效- 直接向 8.8.8.8:53 /
:53 / 223.5.5.5:53 发 UDP 查询,答案一致 → 均被劫持进 sing-box
二、第 1 步 · 官方文档与社区模板核对
2.1 官方「必须改」
结论:无。 按 v1.14.2 现行文档逐项核对,本配置没有使用任何已弃用/被拒的字段:
| 核对项 | 文档要求 | 本机实测 | 判定 |
|---|---|---|---|
| DNS server 格式 | 1.12 起新格式,旧 address 格式已弃用 | 全部新格式(type/ server/ domain_resolver/ detour) | 合规 |
| DNS 规则字段 | 1.14 起拒绝 ip_cidr / match_response / ip_version | dns.rules 未使用这三个字段 | 合规 |
| independent_cache | 1.14 已移除 | 未使用 | 合规 |
| Address Filter Fields | legacy 已移除 | 未使用 | 合规 |
| outbound 字段 | domain_resolver 需为 dns server tag | 11 个 shadowsocks 节点均为 dns-direct-ali(有效 tag) |
合规 |
| route 字段 | auto_detect_interface / find_process / default_domain_resolver 仍有效 | 均在用,find_process=false | 合规 |
| experimental | clash_api / cache_file 仍有效 | 均在用 | 合规 |
| services api | 1.14 起与 clash_api 并行的推荐控制面 | 已启用(127.0.0.1:9091) | 合规,无需改 |
来源:deprecated.md · service/api · outbound/urltest · Releases
2.2 社区「建议改」
| 社区模板 | 它主张的做法 | 本机情况 | 采纳 |
|---|---|---|---|
| LongLights/sing-box_template_merge_sub-store | DNS 按 geosite 分流、国内直连解析、防 DNS 泄漏 | 本配置已实现同类设计(dns.rules 6 条 + 双 dns server 组) | 已具备,不重复引入 |
| Toperlock/sing-box-subscribe | 远程 rule_set + urltest 自动测速模板 | 本机 17 个规则集全部本地 .srs,加载更快且不受远端可用性影响 | 不采纳远程化 |
| qixuancao/sing-box-config-templates | 本地渲染配置模板 + sing-box check 后才生效 |
与本方案第 4 步流程一致 | 已采纳为上线流程 |
三、第 2 步 · 云端同步 / 发布脚本审计
审计对象(~/code/pkg/build 不存在,改审实际存在的仓库):
- /home/emo/code/Singborg —— github.com/emoeem/Singborg
- /home/emo/pkgbuild-source —— github.com/emoeem/pkgbuild
3.1 严重问题
| # | 问题 | 证据 | 风险 | 处置 |
|---|---|---|---|---|
| S1 | 同名脚本双份漂移:Singborg/scripts/* 是 2026-10-02 22:59 的旧副本,pkgbuild-source/scripts/* 才是新版(apply-audit-fixes.sh 相差 112 行);Singborg/scripts/refresh-rule-sets.sh 旧版缺两个 lyc8503 源、且不拒绝未知参数 | diff / head | 照 Singborg README 执行会跑旧逻辑,静默漏更新 2 个规则集,广告/直连规则可能过期 | 统一入口:只从 pkgbuild-source 运行;删除或替换 Singborg 旧副本 |
| S2 | 配置明文外泄面:/etc/sing-box/backups/.json 与 /etc/sing-box/config.json.bak. 共 23 份完整配置副本、权限 644,含全部节点口令与 clash/api secret | ls -l | 本机任意用户可读全部节点凭据 | 已写进变更清单第 1 项(目录 700 / 文件 600) |
| S3 | secret 弱且 CORS 全开:clash_api.secret 与 services[api].secret 同值,11 字符(10 小写字母+1 符号)非随机;access_control_allow_origin=["*"] + allow_private_network: true,实测 9090 对任意 Origin(含 https://evil.example)都回 Access-Control-Allow-Origin: * |
curl -D- | 恶意网页在浏览器中跨域读本机 9090(可读取/切换代理节点) | 变更清单第 5、6 项:轮换为 secrets.token_urlsafe(32) + CORS 收紧到面板源 |
3.2 警告
| # | 问题 | 说明 | 处置 |
|---|---|---|---|
| W1 | apply-audit-fixes.sh 无备份保留策略 | find -delete / -mtime / prune 全无命中,备份无限增长 |
变更清单第 2 项(保留 10 份 + 7 天内不归档,超出 tar.gz 归档而非删除) |
| W2 | generate-sanitized-config.py 把 dns.rules[*].server(DNS 服务器 tag)误当主机名替换为 <node-server> |
公开快照的 DNS 分流引用失真——是错误不是泄漏 | 修正该脚本的替换白名单(仅替换 outbound.server / 订阅字段) |
| W3 | 我上一轮的工作区报告把明文 secret 写进了文件 | singbox-optimization-review.md:47、:48 与 singbox-panel-guide.md:114(均 0600、非 git 仓库、无远端) | 已打码,全工作区 grep = 0 命中 |
| W4 | pkgbuild-source 有 30+ 未提交改动 | 一次 push 会连带发布无关内容 | push 前先审查 git status / 分批提交 |
| W5 | 新发现(超出已授权清单):/var/lib/sing-box/cache.db 权限 644(BoltDB,存 DNS 缓存,store_dns=true) | 任意本地用户可读取该机 DNS 查询历史 | 建议后续单独加固(本脚本未包含,等你确认再加) |
3.3 良好实践(已确认无风险,保持即可)
- 两个公开仓库的工作区 + 完整 git 历史对 11 个节点域名、节点口令、clash secret 全部 0 命中 → 公开仓库未泄漏任何私密节点信息
- 三个会写 main 的 workflow 共用
concurrency: main-branch-updates(不会并发互踩)、actions 按 commit SHA 固定、用github.token而非 PAT、权限最小化 - 没有任何脚本会把本机配置 push 或上传到远端(这是本次审计最关心的越权路径,已逐文件确认)
- 用 github.token 而非 PAT
四、第 3 步 · 配置逐字段体检与变更清单
4.1 变更清单(14 项,全部已授权实现)
| # | 位置 | 现状 | 建议 | 依据 | 风险 | 重启 |
|---|---|---|---|---|---|---|
| 1 | /etc/sing-box/backups 与 config.json.bak.* | 目录 755、23 份文件 644,含明文凭据 | 目录 700、文件 600 | 最小权限原则 | 无(root 仍可读写) | 否 |
| 2 | 备份目录 | 无保留策略,无限增长 | 每目录留最新 10 份;7 天内的不归档;超出部分 tar.gz 归档(不删除) | 可回溯 + 控体积 | 无(归档保底) | 否 |
| 3 | 我自己的工作区报告 | 含明文 secret | 打码为 ****** | 防二次泄漏 | 无 | 否(已完成) |
| 4 | systemd drop-in | unit 有 After=network-online.target 但缺 Wants=,开机早期报 missing default interface |
新增 20-network-online.conf:[Unit] Wants=network-online.target |
官方 systemd 约定 | 极低(仅延后启动) | 需 daemon-reload |
| 5 | experimental.clash_api | secret 11 字符非随机;CORS ["*"] + allow_private_network:true |
secret 轮换为 token_urlsafe(32);CORS 收紧为 ["http://127.0.0.1:9096","http://localhost:9096"];移除 allow_private_network |
本机已复现跨域读 9090 | 中(外部工具若硬编码旧 secret 会 401——面板按 mtime 动态读取,不受影响) | 是 |
| 6 | services[api] | secret 与 clash_api 同值 | 轮换为独立随机值 | 凭据隔离 | 同上(仅 9091 使用者受影响) | 是 |
| 7 | 11 个 shadowsocks 节点 | 同一口令(distinct_passwords=1) | 服务商侧问题,建议逐节点独立口令 | 单点失陷面 | 需在服务商面板改 | 否(仅报告) |
| 8 | 已撤回:dns-proxy 的 detour 是 Auto,用它解析 Auto 自己的节点域名会形成解析环;现有「国内 DoH 直解节点域名」是正确设计 | 解析环风险 | — | — | ||
| 9 | outbounds | 存在未被任何 rule 引用的 {"type":"block","tag":"block"} |
移除(route 第 5 条已用 action: reject) |
死配置 | 无(实测 “block” 字面量仅 2 次即其自身声明) | 是 |
| 10 | selector Download / Auto / Auto-Japan | Download.default=Auto;「🇯🇵 日本Z05|下载专用」同时是 Auto 与 Auto-Japan 的测速候选 | Download.default 改为该节点,并把该节点从 Auto / Auto-Japan 的 urltest 候选中剔除 | tag 语义=下载专用,不应参与日常选路 | 极低(下载路径更明确) | 是 |
| 11 | route.find_process | false | 保持 false(无 process 匹配规则,开启只增开销) | 无收益 | 无 | 否 |
| 12 | dns.rules(6 条) | 已按 must-direct / 广告 NXDOMAIN / cn 直连 / !cn 走代理划分 | 无需改动 | 已符合最佳实践 | — | — |
| 13 | 版本 | v1.14.2-reF1nd = 上游最新 | 不升级 | 无新版可升 | — | — |
| 14 | cache_file / 双控制面(9090+9091) | 均已启用 | 保留 | 持久 DNS 缓存 + 新版控制面 | — | — |
4.2 高危项(已单独提示,均带回滚)
- 第 5、6 项(secret 轮换):唯一会影响外部脚本的改动。如果你的其它设备/脚本里硬编码了旧的 clash secret,轮换后它们会 401。已确认本机面板(127.0.0.1:9096)是按文件 mtime 动态读取密钥的,轮换对它透明;zashboard 入口用
#/setup?…&secret=深链自动带密钥,无需手输。 - 统一回滚一行(脚本每次运行都会打印,并把当次备份路径填进去):
sudo install -m 600 -o root -g root /etc/sing-box/config.json.bak.<时间戳> /etc/sing-box/config.json && sudo systemctl restart sing-box - 脚本对第 5~10 项任一步失败都会自动用当次备份回滚并重启服务(30 秒等待),且会打印同样的手动命令。
五、第 4 步 · 上线流程(先备份 → check → 才生效;失败 10 秒内回滚)
脚本:/home/emo/Documents/deepseek-harness/default-workspace/apply-hardening-2026-10-08.sh(320 行,bash -n 通过,755)
执行顺序:
- 前置备份:
install -m600生成/etc/sing-box/config.json.bak.<TS>,另存一份原配置到临时文件用于失败对照 - 备份加固 + 归档(清单 1、2)
- 用 python 改写候选配置(清单 5、6、9、10):轮换两个 secret、收紧 CORS/移除 allow_private_network、删除 block 出站、Download.default + Auto/Auto-Japan 剔除下载节点;仅改这些字段,其余字节不动 → 得到最小 diff
- 先停服再
sing-box check:避免与正在运行的 eBPF 争用 BPF 资源导致误报;check 失败则按原配置立即 start 并退出(不动线上配置) - 原子替换:
install+mv到 /etc/sing-box/config.json(0600 root) - 写 drop-in +
systemctl daemon-reload(清单 4) - 启动 + 全套健康检查:服务 active(30s)→ 端口 7892/9090/9091 → 启动后 journalctl ERROR 计数 → 新密钥 200 / 旧密钥非 200 / 无密钥 401 → CORS 面板源放行且 evil.example 不放行 → 9096 面板 200 → 面板 /api/state 能读到新密钥 → 经 7892 代理 gstatic/generate_204 = 204;任一失败即回滚
- 汇总:备份路径、打码 diff、一行回滚命令、新密钥前 6 字符与长度
用法(由你用 sudo 执行):
cd /home/emo/Documents/deepseek-harness/default-workspace
sudo bash apply-hardening-2026-10-08.sh --dry-run # 只生成候选+check+打印 diff,不落盘不重启(仍会短暂停服做 check)
sudo bash apply-hardening-2026-10-08.sh # 正式执行
可选:--keep-cors(跳过 CORS 收紧)、--no-routing(跳过选路调整)、--no-retention(跳过备份加固)
说明:脚本为了一次无资源冲突的 check 会短暂停服约 5~10 秒,随后立即以新配置启动;有 flock 单实例锁。
5.1 实际执行结果(2026-10-08)
第一次执行(13:35:51)——误报回滚,正式配置未落盘。
- 现象:
sing-box check通过 → 原子替换成功 → 健康检查报「端口未监听: 7892 9090 9091」→ 自动回滚,服务恢复。 - 排查证据:① systemd 日志显示新实例是
Stopping → Deactivated successfully(被脚本主动停),不是崩溃——没有Main process exited/Failed with result;② 新实例存活 586ms / 538ms、各耗 CPU 538ms,说明它正在正常启动过程中就被判失败;③ 同期测试脚本 T1.3 也报端口缺失,但几秒后 T2/T3 全部连通。 - 根因(脚本 bug,非配置问题):unit 为
Type=simple,systemctl is-active在进程 fork 后立即返回 active,而健康检查零等待就查端口;sing-box 加载 17 个 rule-set + eBPF 程序需要数秒。 - 修复:端口检查改为最长 60 秒轮询(进程若自行退出则立即判失败),真失败时先打印新实例最后 40 行日志再回滚。
第二次执行(13:45:03 生效)——成功。
- 流程:
sing-box check通过 → 原子替换(16641 B, mode 600)→ 启动 → 全套健康检查通过 → 未触发回滚。 - 独立复核(emo 权限,13:53 实测):systemd
active,MainPID 168960;Wants=network-online.target已进事务;7892/9090/9091/9096 全部 LISTEN;outbounds由 22 → 21(block出站已移除);CORS 对https://evil.example不再返回Access-Control-Allow-Origin,对http://127.0.0.1:9096/http://localhost:9096分别回显该源;无密钥访问 9090 → 401;经 7892 代理 gstatic → 204(0.33s);出口 IP;新配置启动后 journalctl 无新增 ERROR(最近一条 ERROR 为 13:34:32,属切换前的旧配置)。
六、第 5 步 · 测试
脚本:/home/emo/Documents/deepseek-harness/default-workspace/test-singbox-2026-10-08.sh(302 行,bash -n 通过,755,必须 root)
| 用例组 | 覆盖内容 |
|---|---|
| T1 服务面 | systemd active、config.json JSON 合法、7892/9090/9091 监听、启动后无 ERROR |
| T2 国内直连 | eBPF 路径下访问国内站点(注意:宿主机 TCP 也被透明接管,这是「direct 规则」路径验证) |
| T3 显式代理 | 经 127.0.0.1:7892 取出口 IP + 地区 + 当前节点(/proxies/Auto 的 now) |
| T4 TCP + UDP | SOCKS5 UDP ASSOCIATE 真实 DNS 中继、curl --http3 QUIC |
| T5 DNS 防泄漏 | T5.1 向系统解析器查 o-o.myaddr.l.google.com TXT,看 Google 侧回声是否落在国内;T5.2 记录 Akamai whoami 回声;T5.3 经代理 ipinfo.io 的 org |
| T6 稳定性 | N 秒(默认 60)混合并发负载的成功率 + CPU/RSS |
| T7 失效切换(可选) | nft 临时屏蔽当前节点 IP → 轮询 /proxies/Auto 的 now 直到切换 → 撤规则后再等回落,结束务必 nft delete table inet sbx_test |
用法:
sudo bash test-singbox-2026-10-08.sh # 60 秒负载
sudo bash test-singbox-2026-10-08.sh --load-seconds 120 --with-failover
6.1 审计期间已完成的真实验证(emo 权限可做的部分,全部通过)
| 验证项 | 结果 |
|---|---|
| 9090 无密钥 | 401 |
| 9090 带密钥 | 200 |
| 9091/dashboard/ | 200 |
| 9096 面板首页 | 200 |
| 经 7892 代理生成 204 | 204 |
| 出口 IP 归属 | AS134972 IKUUU NETWORK LTD( |
| 出口地区 | Cloudflare trace loc=HK colo=HKG |
| SOCKS5 UDP ASSOCIATE 中继真实 DNS | 收到应答 OK,ancount=1 |
| DNS 广告拦截 | doubleclick 等 5 域全部 NXDOMAIN |
| DNS 防泄漏 | o-o.myaddr 回声 172.64.214.13 = Cloudflare(境外递归)→ 无 ISP 泄漏 |
| 工具可用性 | curl(–http3)、jq、python3、flock、nft、ss 齐备 |
6.2 关于「Akamai 回声是国内 IP」的说明(重要,避免误判为泄漏)
whoami.akamai.net 的回声是
6.3 测试结果(脚本真实输出)
第一次 --load-seconds 60:通过 17 / 失败 0 / 未执行 2;第二次 --load-seconds 120 --with-failover 的 T1~T6 同样全通过。
| 用例 | 期望 | 实测 | 结论 |
|---|---|---|---|
| T1.1 服务状态 | active | active | PASS |
| T1.2 配置 JSON | 合法 | 合法 | PASS |
| T1.3 监听端口 | 全部监听 | 7892/9090/9091 全部监听 | PASS |
| T1.4 近 10 分钟 ERROR | 0 | 0 | PASS |
| T1.5 route.rules / outbounds | 11 / 21 | 11 / 21 | PASS(21 印证 block 出站已移除) |
| T1.6 版本 | v1.14.2 | v1.14.2-reF1nd | PASS |
| T2.1 / T2.2 国内站点 | 200 | baidu 200 / jd 200 | PASS |
| T2.3 被劫持的 DNS 解析 | 有 A 记录 | 183.2.172.177 | PASS |
| T3.1 出口 IP 地区 | 非 CN | JP( |
PASS |
| T3.2 / T3.3 国外站点 | 204 / 200 | 204 / 200 | PASS |
| T3.4 当前出站 | 有值 | Auto → 🇯🇵 日本Z01|IEPL | PASS |
| T4.1 SOCKS5 UDP 中继 | 收到 DNS 应答 | OK,54 字节 ancount=1 | PASS |
| T4.2 QUIC / HTTP3 | 有响应 | 200 | PASS |
| T5.1 宿主解析器归属 | 非国内递归 | 162.159.111.13(Cloudflare) | PASS |
| T5.2 出口 IP 归属 | 境外 IDC | AS134972 IKUUU NETWORK LTD | PASS |
| T5.2 Akamai 回声 | 参考项 | SKIP | |
| T6.1 混合负载成功率 | 失败 0 | 60 秒 137/0;120 秒 227/0(代理 114 / 直连 113) | PASS |
| T6.2 资源占用 | 无异常增长 | 120 秒内 CPU 0.62s / RSS 峰值 108 MB | PASS |
| T7 失效切换与回落 | 自动切换 | 见 6.4 | 待补 |
T6 的 137/0 与 227/0 值得单独强调:全程零失败,且两条路径都覆盖了——被 eBPF 透明接管的宿主机直连,与显式代理 127.0.0.1:7892。
6.4 T7(节点失效 → 自动切换 → 恢复回落)
已打印 T7.1:初态 Auto → 🇯🇵 日本Z01|IEPL,节点端口 475。该用例的后续步骤(nft 屏蔽节点 IP → 轮询 /proxies/Auto 的 now 直到切换 → 撤规则 → 等回落 → 删除 sbx_test 表)在贴回的输出里被截断,第二次运行的 结果汇总 表也未贴到,故本节暂记「待补」。
- 当前实测(13:53,emo 侧独立复核):经 7892 代理 gstatic → 204(0.33s),且存在到
<node-server>:475/<node-server>:475的已建立连接 → 链路当前是通的,无残留屏蔽。 - 补两条即可闭项:
sudo nft list tables | grep sbx_test || echo clean,以及 T7 从 T7.1 起到汇总表的剩余输出(若中途 Ctrl-C,脚本 trap 会清理 nft 表,上面那条命令可确认)。
6.5 测试方法自身的两次修正(都不是 sing-box 的问题,如实记录)
- 零等待误判端口:见 5.1,已改为 60 秒轮询,并在测试脚本开头同样加了等待,修掉 T1.3 的误报。
www.qq.com反爬导致的假失败:第一次运行时 T2.2 → 501、T6 出现 138 次「失败」,全部来自同一个 URL——腾讯边缘(Server: stgw)对 curl 默认 UA 直接返回 501,带浏览器 UA 即 200;同批次的 baidu 直连 200、代理路径全部 200。已改为jd.com并统一带浏览器 UA。另外把 T6 CPU 计数改成小数秒(原来 120 秒只显示「0s」),T7 的 nft 规则补上 IPv6 分支(本机默认走 IPv6 直连,原规则只写ip daddr拦不住),urltest 等待上限 360→480 秒(其检测周期为 5 分钟)。
七、第 6 步 · 回滚步骤与维护建议
7.1 回滚(三层,任选)
- 配置回滚(最常用):
sudo install -m 600 -o root -g root /etc/sing-box/config.json.bak.<时间戳> /etc/sing-box/config.json sudo systemctl restart sing-box systemctl is-active sing-box && ss -ltn | grep -E '7892|9090|9091' - drop-in 回滚(只撤开机等待网络):
sudo rm /etc/systemd/system/sing-box.service.d/20-network-online.conf && sudo systemctl daemon-reload - 备份权限回滚(一般不需要):
sudo chmod 755 /etc/sing-box/backups; sudo find /etc/sing-box -maxdepth 1 -name 'config.json.bak.*' -exec chmod 644 {} +
7.2 维护建议
- 每季度跑一次本审计的两个脚本(先 –dry-run 看 diff);sing-box 有新版时先在
--dry-run下核对 deprecated 列表。 - 统一脚本来源:只从 /home/emo/pkgbuild-source 运行同步脚本,删除或同步 Singborg 里的旧副本,消除 S1 漂移。
- 备份保留:保留「最新 10 份 + 7 天内不归档」,归档文件另存到加密盘更稳妥;备份里含明文凭据,务必保持 600。
- 密钥轮换:本次轮换后,建议每 6 个月轮换一次;轮换只需改配置并重启,面板自动跟上。
- 待你确认的新项:
chmod 600 /var/lib/sing-box/cache.db(当前 644,本地可读 DNS 查询历史)。这不在已授权的 14 项内,你点头我再加进脚本。 - 节点口令复用(第 7 项)属服务商侧,建议在服务商面板逐节点改独立口令。
- 监控:
journalctl -u sing-box -p warning --since today每周扫一遍;missing default interface应在 drop-in 生效后不再出现。 - 不要把
experimental.clash_api.secret写回任何会进 git 的文件;generate-sanitized-config.py 修好后再用它生成公开快照。
八、第 6 步交付物索引
| 交付物 | 文件 |
|---|---|
| 本报告(环境事实 / 调研 / 脚本审计 / 变更清单 / 回滚 / 维护建议) | docs/10-审计报告-2026-10-08.md |
| 变更实施脚本(含备份、check、原子替换、健康检查、自动回滚) | scripts/apply-hardening-2026-10-08.sh |
| 第 5 步验收测试脚本(T1~T7) | scripts/test-singbox-2026-10-08.sh |











