搜索 K
Appearance
本文面向已经跨过"能连上"阶段、开始在意稳定性与可迁移性的用户。如果你目前还在纠结订阅怎么选,建议先看 机场选购总纲,再回来读这篇。
大多数人的代理配置只存在于两个地方:浏览器书签里的订阅链接,和脑子里模糊的"我记得好像是这么配的"。这两样东西在重装系统的那一刻都会归零。
正确的做法是把配置拆成三层,分别用不同的工具托管:
| 层级 | 内容 | 载体 | 恢复难度 |
|---|---|---|---|
| 订阅层 | 订阅 URL、流量面板账号 | 密码管理器 | 极低,5 分钟 |
| 覆写层 | 自定义节点、proxy-groups、rule-providers、脚本 | Git 私有仓库(age/sops 加密) | 中,10 分钟 |
| 状态层 | 客户端缓存、内核日志、证书、系统代理开关 | 客户端自带导出 / 云盘冷备 | 低,但最容易漏 |
一句话方案: 覆写层进 Git 私有仓库做版本化,订阅链接进密码管理器,客户端状态层用云盘同步目录做冷备。三层都到位后,换新机全流程可以压到 30 分钟以内,其中人工操作不超过 5 分钟。
订阅链接的核心特征是:它是一份会自己变的文档。机场在后台换节点、改端口、加中转,你这边拉一次订阅就同步了。这给人一种错觉——配置不存在,随时能重建。
这个错觉在三种场景下会立刻破产。
第一种,覆写层丢失。 你花了两周调出来的分流规则大概率不在订阅里。订阅返回的是最朴素的 proxies 加一个默认 Proxy 组,而你的 Rule 组里手动塞了流媒体独立出口、AI 组走原生 IP 节点、Apple 组直连,还配了三套远程 rule-providers。这些内容全部写在客户端的"覆写"或"Merge"里。订阅可以重新拉,覆写不能重新想。
第二种,订阅地址本身失效。 机场被攻击、换域名、或者你自己忘了续费导致账号被清理。订阅 URL 里的 token 一旦失效,你没有备份就真的什么都没有了。
第三种,本地网络环境的隐性依赖。 你在家里调通了,是因为路由器上挂了一条静态路由,或者局域网 DNS 指向了自建的 AdGuard Home。换到新环境后配置一模一样却跑不通,问题从来不在配置文件里。
从网络机理上讲,一份"能用的代理环境"等于:
可用出口(订阅) + 客户端内核(Mihomo/sing-box 版本) + 分流决策(覆写层) + 系统集成(TUN/证书/系统代理)
这四项里只有第一项是可替换的。其余三项都是沉没成本,必须显式备份。
把资产列清楚,才知道该备份什么。下面这份清单按"丢失后的痛苦指数"排序:
| 资产 | 典型路径/位置 | 痛苦指数 | 备份方式 |
|---|---|---|---|
| 覆写/Merge 配置 | 客户端"覆写"面板或 merge.yaml | ★★★★★ | Git |
| 自定义规则集 | 本地 ruleset/*.yaml | ★★★★☆ | Git |
| 订阅 URL + 面板账号 | 客户端"订阅"面板 | ★★★★☆ | 密码管理器 |
| 客户端 Profile 导出 | profiles/ 目录 | ★★★☆☆ | Git(脱敏后) |
| 分流脚本 / 定时任务 | script.js、crontab | ★★★☆☆ | Git |
| TUN 与证书配置 | 系统代理设置、根证书 | ★★☆☆☆ | 截图 + 文字记录 |
| 内核版本号 | 客户端设置页 | ★★☆☆☆ | 文字记录 |
| 节点测速历史 | 客户端缓存 | ★☆☆☆☆ | 不用备 |
关键在于:痛苦指数最高的两项(覆写层和规则集)恰恰是绝大多数人从来没备份过的。 用户重装完系统,导入订阅,发现"能上网了",就以为恢复完成——直到他发现 Netflix 走错节点、公司内网被代理劫持,才意识到丢了什么。
下面这张表是本文的核心决策依据。恢复耗时以"新机从零到可用"计,成本按个人使用量估算。
| 方案 | 恢复耗时 | 版本回滚 | 敏感信息加密 | 学习成本 | 多端并发 | 离线可用 | 冲突处理 | 月成本 |
|---|---|---|---|---|---|---|---|---|
| Git 私有仓库 + age | 2–5 min | ✅ 完整历史 | 需自建,强度高 | 中高 | 好(分支合并) | ✅ clone 后本地可读 | 显式 merge,可控 | 0 |
| 云盘同步目录(坚果云/OneDrive) | 1–3 min | ⚠️ 部分支持 | 依赖服务商 | 低 | 差,易产生冲突副本 | ✅ | 隐式,易覆盖 | 0–15 元 |
| 对象存储 + rclone | 1–2 min | ⚠️ 开版本控制才行 | 依赖服务商 | 中 | 好 | ❌ 需联网 | 需自己写脚本 | 1–5 元 |
| 私有 NAS / WebDAV | 5–10 min | ⚠️ 取决于快照 | 自控 | 高 | 好 | ✅ 内网 | 需自建 | 硬件摊销 |
| 客户端自带订阅 | 0 | ❌ | 明文 | 极低 | N/A | ❌ | N/A | 订阅费 |
| 手动导出 + 加密压缩包 | 10–30 min | ❌ | 强 | 极低 | 差 | ✅ | 需人工 | 0 |
结论: 单方案都不完美。生产级组合是 Git 主存 + 云盘冷备 + 密码管理器存密钥。Git 负责版本化和冲突可控性,云盘负责"手滑 git push --force 之后还能捞回来",密码管理器负责订阅 URL 和加密口令。
想深入了解节点质量与线路差异如何影响恢复后的实际体验,可以对照 线路技术解析。
Clash Verge Rev 的配置根目录在 %APPDATA%\io.github.clash-verge-rev.clash-verge-rev\,其中 profiles/ 存订阅产物,Merge 与 Script 分别对应覆写和脚本。建议只把 Merge、Script、profiles/*.yaml 纳入版本控制,跳过 logs/ 和 cache.db。
系统代理状态不要靠备份恢复,用命令重设即可:
netsh winhttp show proxy
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable路径是 ~/Library/Application Support/<客户端名>/。macOS 上还有一个额外变量:如果启用了 TUN 模式,系统里会残留 utun 网卡和 DNS 配置。还原后先跑一遍 scutil --dns | head -20 确认没有指向已经卸载的 DNS 服务。
iOS 的沙盒机制决定了你无法直接拷贝配置文件。可行路径有三条:客户端的 iCloud 同步开关(如 Stash)、导出为 URL Scheme 链接自行保管、或者干脆把覆写层放在 Git 里,新机通过客户端内置的"从 URL 导入"拉取。
/Android/data/<包名>/files/ 在 Android 11 之后不再允许第三方文件管理器直读。要么用客户端自带的导出功能,要么走 root。不要指望用云盘 App 自动同步这个目录,这是最容易被误判为"已经备份好了"的场景。
配置在 /etc/mihomo/ 或 /etc/openclash/。这类设备最稳妥的做法是把整个 /etc/ 下的相关目录用 tar 打包后通过 rclone 推到对象存储,并保留最近 7 个版本。路由器上的 U 盘说坏就坏。
初始化一个有基本卫生习惯的仓库:
mkdir airpick-config && cd airpick-config
git init
git config core.autocrlf false # 关键:避免 CRLF 污染 YAML
git config core.fileMode false
cat > .gitignore <<'EOF'
logs/
*.log
cache.db
cache.db-*
profiles/*.yaml
*.bak
EOF.gitignore 里屏蔽 profiles/*.yaml 是有意为之——订阅产物里包含节点密码和 UUID,属于高频变动且高风险的内容。真正需要版本化的是你自己手写的覆写层。
接着把覆写层拆成独立文件:
mkdir -p merge ruleset
# merge/proxy-groups.yaml merge/dns.yaml merge/rules.yaml
git add merge ruleset .gitignore
git commit -m "init: 覆写层基线"然后是加密。裸放明文密钥的仓库就算设成私有,也不该出现在任何你信任度存疑的备份链路上。推荐 age 配合 sops:
age-keygen -o key.txt
# 把 key.txt 存进密码管理器,不要进仓库
sops --encrypt --age $(grep public key.txt | awk '{print $NF}') \
merge/proxy-groups.yaml > merge/proxy-groups.enc.yaml多设备同步时,每台机器上 git pull 后本地解密,明文文件继续加进 .gitignore。这样即使仓库泄露,攻击者拿到的也只是密文。
多机并发的坑: 如果你在台式机和笔记本上同时改同一个文件,Git 会给你一个冲突而不是像云盘那样静默生成"副本 (2)"。这是优点,但要养成 git pull --rebase 再动手的习惯,否则 YAML 冲突合并会非常痛苦。
关于客户端内核的覆写语法差异,可以参考 客户端配置手册,不同内核的字段名并不完全通用。
按顺序执行,不要跳步:
装内核,装客户端,先不要导入订阅。 版本号对齐——旧机是 Mihomo 1.18.x,新机就别直接上 1.19 的大版本,配置语法可能已经变了。
拉取覆写层仓库。
git clone [email protected]:<you>/airpick-config.git
cd airpick-config && sops --decrypt --in-place merge/proxy-groups.enc.yaml从密码管理器取出订阅 URL,在客户端里添加订阅,此时节点列表应该出现。
把覆写层挂载进客户端,重启内核,检查 proxy-groups 是否按预期生成。
验证分流:依次访问一个国内站点、一个需要走代理的站点、一个流媒体站点,观察客户端连接面板中命中策略与预期是否一致。
恢复系统集成:开启 TUN 或系统代理,确认证书信任、DNS 配置。
跑一遍诊断(见下一节),确认没有静默故障。
真正的"一秒满血"不是指配置自动飞过来,而是指你不必再做任何一次决策——所有决策都已经在仓库里了。
新机恢复后的问题大多集中在四类:时间偏差、DNS 解析、订阅拉取、内核与配置不匹配。按下面的顺序排查。
# Linux / macOS
date -u
# Windows
w32tm /stripchart /computer:time.windows.com /samples:3系统时间与真实时间偏差超过 90 秒,VMess 类协议的认证会直接失败,而且报错信息往往含糊其辞。这是换新机后最高频的"配置没错但就是不通"。
# 解析是否正常
dig +short sub.example.com
# 到订阅服务器的路径质量
mtr -rwzc 20 sub.example.com
# 直接探测订阅接口
curl -s -o /dev/null -w "%{http_code} %{time_total}s %{size_download}B\n" \
"https://sub.example.com/api/v1/client/subscribe?token=YOUR_TOKEN"期望结果是 200 且 size_download 明显大于 1KB。返回 403 说明 token 失效或 UA 被拦,返回 200 但体积只有几百字节说明返回了一个错误页面。
nc -vz 127.0.0.1 7890
curl -x http://127.0.0.1:7890 -s -o /dev/null \
-w "%{http_code} %{time_total}s\n" https://www.gstatic.com/generate_204第一条不通说明内核没起来或端口被改;第二条返回非 204 说明出站有问题。
| 现象 | 首要怀疑 | 验证命令 | 处理 |
|---|---|---|---|
| 全部节点超时 | 系统时间偏差 | date -u | 同步 NTP |
| 部分节点通、部分不通 | 规则误命中或节点下线 | 客户端连接面板 | 检查 proxy-groups |
| 订阅更新失败 | DNS 污染 / token 失效 | dig + curl -w | 换 DNS 或重取订阅 |
| 浏览器通、终端不通 | 系统代理未覆盖终端 | env | grep -i proxy | 配置 https_proxy 或开 TUN |
| 能 ping 通但 TLS 握手失败 | 中间设备阻断 / MTU | sudo tcpdump -i any -n 'port 443' | 调整 MTU 或换协议 |
| 局域网设备无法访问 | TUN 与局域网网段冲突 | ip route / netstat -rn | 添加绕过路由 |
关于不同线路在故障状态下的表现差异,专线 vs 中转的实测对比 里有更细的数据。
| 坑 | 为什么会踩 | 后果 | 正确做法 |
|---|---|---|---|
| 只备份订阅链接 | 误以为订阅等于配置 | 覆写层全丢 | 三层分离备份 |
| 明文密钥进公开仓库 | 图省事 | 节点被白嫖直至封禁 | age/sops 或私有仓库 |
| 云盘同步客户端活动目录 | 以为能自动同步 | 运行时写入产生冲突副本 | 只同步静态文件 |
| 依赖"上次导出"的压缩包 | 导出后没再更新 | 恢复的是三个月前的配置 | 设置定期提醒或 CI |
忽略 core.autocrlf | Windows/macOS 混用 | YAML 被 CRLF 污染解析失败 | 显式设为 false |
| 用脚本覆盖订阅产物 | 想自动化 | 订阅更新后覆写被抹掉 | 用官方覆写机制而非覆盖文件 |
| 备份了节点但没备份内核版本 | 认为内核无所谓 | 大版本升级后语法不兼容 | 记录版本号 |
| 只在一台机器上备份 | 没有异地副本 | 硬盘坏 = 全丢 | 云盘 + Git 双副本 |
还有一类更隐蔽的:伪备份。某些客户端会显示"已同步到 iCloud",但实际上只同步了订阅列表,不包括覆写。判断标准很简单——把客户端卸载干净,重新安装,看它能不能在没有手动干预的情况下恢复出完整的 proxy-groups。不能,就说明你的备份是假的。
Q1:订阅链接算不算敏感信息,能不能直接放 Git 私有仓库?
算,而且相当敏感。订阅 token 泄露意味着别人可以直接消耗你的流量。即便仓库是私有的,只要你有协作者、或者账号被撞库,风险就存在。建议放进密码管理器,或者用 sops 加密后入库。
Q2:为什么我用云盘同步客户端目录,经常出现"配置 (2).yaml"?
因为客户端在内核运行时会对配置文件做读写,云盘的文件级同步无法理解这种语义。要同步就用"导出后同步"的静态文件,别直接同步活动目录。
Q3:多台电脑用同一个订阅,会不会互相顶掉?
绝大多数机场的订阅是按账号计并发,不是按设备数。同一个订阅在多台设备上使用一般没问题,但如果你的套餐限制"同时在线设备数",那就需要留意。配置层面,多机同步要解决的是覆写层一致性,不是订阅本身。
Q4:Git 里改了配置,客户端不生效?
先确认客户端读的是仓库里的文件,还是它自己内部复制的副本。多数客户端会把覆写内容导入内部数据库,git pull 之后必须在客户端里手动重新应用一次。
Q5:换新机后 TUN 模式失效?
检查三件事:驱动/内核扩展是否重新安装、是否有残留的旧 utun 路由(netstat -rn | grep utun)、以及 DNS 设置是否被写成了旧环境的地址。
Q6:能不能用 CI 自动拉取订阅并生成配置?
可以,但要小心。自动化的正确形态是"拉取订阅 → 应用覆写 → 输出最终配置",而不是"用脚本覆盖客户端目录"。前者可控,后者会在客户端更新时全崩。
Q7:备份频率建议多久一次?
规则是:每次手动改了覆写层就提交一次。别定周期,定事件。没有改动就没有提交,这不是靠 cron 解决的问题。
最后一句实话: 配置备份这件事,唯一有效的检验方式是——在某个周末,主动把你的客户端卸载干净,然后照着 SOP 走一遍。能不能在 30 分钟内恢复,答案只有那一次实测知道。备份不是写出来的,是恢复出来的。
#代理配置备份 #云同步 #Clash配置 #换新机还原 #Git工作流