搜索 K
Appearance
先把结论摆在最前面,省得你往下翻十分钟。
机场侧换了中转入口或落地 IP 后,你本地客户端里的节点配置不会自动失效——它只是"连不上了",而不是"消失了"。 你以为机场跑路了,实际上机场公告里三天前就写了"已完成入口迁移,请重新拉取订阅"。你要做的不是卸载重装,也不是发工单骂人,而是强制覆盖式更新订阅。
三步速通:
curl 一下。能返回内容(哪怕是乱码 base64),说明机场活着,问题在本地。If-None-Match),机场 CDN 缓存配置不当会返回 304,你以为更新了,其实还是旧配置。如果第 1 步就失败——订阅链接 404 或域名不解析,那才是真正的"跑路预警区间",本文第五节给了完整的信号判定矩阵。
很多人把订阅链接理解成"账号密码",这是个致命误解。订阅链接的本质是一个 HTTP(S) 端点,返回一份静态或半静态的配置文档(Clash 系返回 YAML,通用系返回 base64 编码的 URI 列表)。客户端拉到之后,把这份文档落盘成一份本地配置文件,之后所有连接行为都基于这份本地文件。
所以链路是这样的:
机场后台改配置 → 订阅端点内容变化 → 你手动/定时拉取 → 本地文件被覆盖 → 新连接使用新 IP
这条链上有四个断点,任何一个断了,你就卡在"旧节点 IP 全部失效"的状态:
断点一:客户端定时拉取失败但静默处理。 大多数客户端默认 24 小时自动更新一次,失败时只在角落弹个小提示,甚至完全不提示。你看到的界面还是昨天的节点列表。
断点二:HTTP 条件请求返回 304。 这个坑最隐蔽。客户端带 If-None-Match: "abc123" 请求,机场 CDN 层如果缓存策略配错,会持续返回 304 Not Modified,客户端就认定"内容没变,不覆盖本地文件"。机场明明改了配置,你永远收不到。解决办法是清掉订阅缓存或用带随机参数的 URL 强制绕过 CDN。
断点三:DNS 缓存与 TCP 长连接复用。 就算你把新配置导进来了,很多客户端对已建立的连接池不做主动断开。旧 IP 上那条 keep-alive 长连接还在挂着,你测速看到的就是旧 IP 的超时。切换订阅后必须彻底重启客户端进程,而不是关窗口。
断点四:运营商侧 DNS 污染或解析缓存。 机场把 sub.xxx.com 换成了 sub2.xxx.com,你的系统 DNS 还在返回老 IP,甚至返回了被污染的 127.0.0.1。
再往上说一层,机场为什么要换入口?无非几种情况:中转服务商机房迁移(IPLC 上游变更)、原 IP 段被 GFW 批量封禁、CDN 供应商切换、成本优化砍掉某条线路。换入口是运营常态,不是跑路信号——频繁换才需要警惕。
别急着下结论,先做分层排查。下面这张表是我们实验室处理过的 2000+ 工单里,命中率最高的判定逻辑。
| 现象 | 最可能根因 | 验证手段 | 处置动作 |
|---|---|---|---|
| 全部节点超时,但订阅链接能打开 | 本地配置未同步 | 订阅内容里的 IP 与本地节点 IP 比对 | 强制覆盖更新订阅 |
| 部分节点可用、部分超时 | 机场单条线路故障 | mtr 分别测试可用/不可用节点 | 等待机场修复,切备用分组 |
| 订阅链接 404 / 403 | 订阅 token 失效或换域名 | 浏览器无痕访问 + curl -I | 去官网/频道找新订阅地址 |
| 订阅链接域名不解析 | 域名被墙或机场弃用 | dig +short sub.example.com | 换域名或换 DNS |
| 更新后节点数量骤减 | 机场收缩线路(超售信号) | 对比历史节点数 | 观察 3 天,准备备用 |
| 官网打不开 + 客服失联 + 支付通道变更 | 高概率跑路 | 多渠道交叉验证 | 立即启动维权流程 |
| 手机能用、电脑不能用 | 客户端缓存差异 | 两端比对配置文件名 | 单独清电脑端缓存 |
| 延迟正常但无法打开网页 | 非节点问题,是分流/DNS | curl -v 测目标站 | 检查规则集与 DNS 配置 |
一个关键判据:订阅端点的 HTTP 状态码。
200 + 有内容 → 机场活着,问题 100% 在本地。304 → CDN 缓存作祟,需要强制绕过。403 → 大概率是 UA 不匹配(很多机场按 User-Agent 下发不同格式)或 token 被风控。404 → 订阅路径失效,去官网找新地址。不同客户端的缓存机制差异极大,用错方法会白折腾。
Clash Verge / Clash Verge Rev(Windows / macOS / Linux) 配置存在 profiles/ 目录下,每个订阅一个 YAML 文件加一个 profiles.yaml 索引。点"更新"按钮走的是条件请求,容易命中 304。正确做法:在订阅卡片上右键 → 删除该 profile → 重新粘贴订阅链接导入。想保留规则自定义,先把 Merge/Script 链导出来。
Mihomo(原 Clash Meta)内核 / OpenClash OpenClash 的配置文件目录在 /etc/openclash/config/,缓存文件在 /etc/openclash/cache.db。换入口后务必手动更新一次,并清空 cache.db,否则内核仍然从旧缓存读取节点组。
Shadowrocket(iOS) 订阅缓存和 iCloud 同步是两套东西。左滑订阅 → 删除 → 重新添加,是唯一可靠的覆盖方式。另外注意:Shadowrocket 的"更新订阅"默认带 UA Shadowrocket/xxx,如果机场只认 Clash UA,会下发 base64 格式导致节点解析异常。
v2rayN(Windows) 配置在 guiNConfigs/config.json,订阅分组信息在 guiNConfigs/sub_item.json。订阅 → 更新订阅(不通过代理) 这个选项在换入口场景下必须勾上——因为旧节点全挂时,通过代理更新订阅会直接死锁。
Sing-box / NekoBox(Android / 桌面) Sing-box 本身无订阅管理,依赖 sing-box 的 remote profile 功能或第三方管理器。remote profile 存在本地 cache.db,删除 profile 重加最干净。
Surge / Stash(iOS / macOS) 订阅策略可以配置 "update-interval",但手动刷新路径是「配置」→ 长按配置项 → 更新。Surge 有 "no-cache" 选项,可以在订阅 URL 后加时间戳参数绕过 CDN。
通用兜底方案:在订阅 URL 末尾加 &_t= 加当前时间戳。例如 ...?token=abc&_t=1735689600。这一招对所有带 CDN 缓存的订阅端点都有效,是目前绕过 304 最省事的办法。
别用"感觉"判断,用数据。以下命令跨平台通用(Windows 用 WSL 或 Git Bash)。
第一步:确认订阅端点是否活着
curl -sS -o /dev/null -w "dns=%{time_namelookup}s conn=%{time_connect}s tls=%{time_appconnect}s total=%{time_total}s code=%{http_code} size=%{size_download}\n" \
-A "clash-verge/v2.0" \
"https://sub.example.com/api/v1/client/subscribe?token=YOUR_TOKEN"判定:code=200 且 size 大于 1KB → 订阅正常;code=304 → CDN 缓存问题;code=403 → UA 或 token 问题;code=404 → 路径失效。
第二步:确认解析是否被污染
dig +short sub.example.com @1.1.1.1
dig +short sub.example.com @223.5.5.5两个结果不一致,或者返回 0.0.0.0 / 127.0.0.1,基本就是 DNS 层面出事。换 DoH(https://1.1.1.1/dns-query)再试。
第三步:确认旧节点 IP 是否真的死了
# 直连测试节点端口可达性(需要 tcping 或 nc)
tcping -p 443 1.2.3.4
nc -zv -w 3 1.2.3.4 443
# 如果通了,说明 TCP 层可达,问题在协议层或伪装层
openssl s_client -connect 1.2.3.4:443 -servername www.example.com < /dev/null 2>&1 | head -20第四步:路径级诊断(判断是入口挂了还是落地挂了)
mtr -rwzc 30 1.2.3.4看丢包出现的位置:
第五步:确认新配置是否真的生效
更新订阅后,直接在客户端里看节点详情里的服务器地址。把新地址复制出来再跑一次 tcping。通了,收工;不通,说明订阅拉到的还是旧内容,回到第一步。
更新完订阅还是残留旧节点?按这个清单逐项清理。
| 平台 | 需要清理的位置 | 说明 |
|---|---|---|
| Windows (Clash Verge) | %APPDATA%/io.github.clash-verge-rev.clash-verge-rev/profiles/ | 删除旧 YAML 与 profiles.yaml 中的对应条目 |
| macOS (Clash Verge) | ~/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev/ | 同上,注意 iCloud 同步冲突 |
| 路由器 (OpenWrt) | /etc/openclash/config/ 与 /etc/openclash/cache.db | 必须重启 OpenClash 服务 |
| iOS (Shadowrocket) | 左滑删除订阅 + 关闭 iCloud 同步后重加 | 双端同步会互相覆盖 |
| 通用 | 系统 DNS 缓存 | Win: ipconfig /flushdns;macOS: sudo dscacheutil -flushcache;Linux: resolvectl flush-caches |
| 通用 | 客户端进程 | 完全退出(含托盘/后台),而不是关闭窗口 |
一个被忽略的点:如果你用的是浏览器或某些应用的"系统代理"模式,切换订阅后旧连接不会立刻断。重启浏览器,或者用 netstat -ano | findstr :7890(Windows)确认代理端口上还有没有残留连接。
| 宣传话术 | 真实含义 | 验证方法 |
|---|---|---|
| "永久不限时套餐" | 一次性收费撑不了多久,跑路概率高 | 查域名注册时间与历史快照 |
| "不限速不限量" | 必然超售,晚高峰必炸 | 20:00-23:00 实测丢包率与单线程速度 |
| "原生 IP 全解锁" | 多为 DNS 解锁或分流域名 | curl -sI https://www.netflix.com 查返回码,点进剧集实测 |
| "IEPL 专线" | 可能只是普通 BGP 中转换个名字 | mtr 看是否出现内网 10.x/172.16.x 跳转 |
| "节点数 200+" | 同一台机器开多端口充数 | 对比不同节点的落地 IP 是否重复 |
| "支持 4K / 8K" | 单线程能跑 20Mbps 就算合格 | 用 speedtest-cli 或客户端内置测速峰值判断 |
超售的量化判断标准:晚高峰(20:00-23:00)连续三天实测,若单节点下行峰值低于标称带宽的 30%,或 30 次 tcping 丢包率高于 5%,基本可以判定超售。低于 1% 丢包、峰值稳定在标称 60% 以上,才算是"不超售"的正常水位。
伪解锁的判定:真正的流媒体解锁,curl -sI 请求目标站点返回 200 而非 403,且能拿到区域专属内容标题。只显示"自制剧"、点进去报错的,是典型的 DNS 污染式伪解锁。
Q1:我明明点了"更新订阅",节点还是连不上? 极大概率命中了 CDN 的 304。在订阅 URL 后加 &_t=时间戳,或直接删除 profile 重新导入。另外一个高发原因是客户端"更新订阅"走了代理通道,而代理通道已经因为旧节点失效而不可用——记得勾选"不使用代理更新"。
Q2:订阅链接打开是乱码,正常吗? 正常。通用格式(base64)在浏览器里就是一堆乱码,说明内容正常。如果是 Clash 格式,你会在浏览器里看到 YAML 明文。如果浏览器显示的是机场官网首页或错误页,说明 token 已失效。
Q3:更新后节点名字一样,但延迟全变了? 说明机场复用了节点命名,但底层 IP 换了。这本身是正常的运营行为。直接以新配置为准,别手动改回旧 IP。
Q4:手机上更新了,电脑上还是旧的? 两端是独立缓存,不存在自动同步。如果用了 iCloud 同步(Shadowrocket / Stash),双端同时改会导致冲突,建议关闭其中一端的同步。
Q5:更新后配置文件报 YAML 解析错误? 要么是订阅端点返回了不完整的响应(网络中断导致截断),要么是机场下发了带特殊字符的节点名。用 curl 把内容拉到本地,用 yq 或在线 YAML 校验器检查一下。常见元凶是节点名里的冒号或 #。
Q6:机场失联,怎么区分是换域名还是跑路? 三个信号交叉验证:官网是否可访问、Telegram 频道/群是否还在更新、订阅域名是否还能解析。官网挂了但频道在更新 = 换域名或迁移中;官网 + 频道 + 订阅全部静默超过 72 小时 = 高度疑似跑路。
Q7:旧节点缓存清不掉,一定要卸载重装吗? 不必。绝大多数情况下,删掉 profile 文件 + 清 DNS 缓存 + 完全退出进程,就能解决。只有在配置文件被外部脚本或 Merge 规则反复回写时,才需要卸载重装。
最后提醒一句:订阅更新失败这件事,99% 的情况不是技术难题,而是排查顺序问题。先验机场活着没,再验本地同步没,最后才怀疑网络。 顺序反了,你会在错误的方向上浪费一整晚。把本文的诊断表存成书签,下次节点全红时直接照着跑一遍。
#订阅更新 #机场缓存 #节点超时 #IEPL专线 #抓包排障 #AirPick实测