开着代理刷不动微博:Shadowrocket国内网站变慢排查
一句话结论
开启小火箭后国内服务变慢,基本可以确定国内流量也走进了节点。四个信号可以确认:当前处于代理或全局模式、配置里缺少国内直连规则组、FINAL 规则被写成了代理、或某个自定义规则位置靠前把国内域名一并匹配了。定位顺序是先切回「配置」模式观察,再检查规则清单里国内规则组是否存在且位于 FINAL 之前。
打开小火箭之后,推特和 YouTube 都很顺,反倒是微博刷不动、外卖 App 转圈、国内视频卡在加载条上——这个组合看起来矛盾,其实指向同一个原因:本该在本地直接出去的国内流量,也被塞进了那条跨境隧道。数据包先飞到日本或香港的落地服务器,再从境外回头访问国内 CDN,一来一回多绕了上万公里,慢是必然的。
这类问题的麻烦之处在于它不报错。连接是通的,页面最终也能打开,只是每一次请求都多等两三秒。很多人会误以为是机场线路变差,于是去换节点、换协议,折腾一圈毫无改善——因为问题根本不在节点,而在小火箭把哪些流量交给了节点。
排查思路要和"境外打不开"那类故障反过来。境外打不开是做减法,把规则清空看最简链路通不通;国内变慢是做定位,链路本身没坏,要找的是"哪一条规则把国内域名一起收走了"。下面按由粗到细的顺序收敛。
怎么快速确认国内流量确实被送出去了
不用装抓包工具,小火箭自带的记录就够用。在设置里打开日志或直接看主界面的连接列表,访问几个典型的国内站点,观察这些请求的出站标记是 DIRECT 还是某个节点名。
更快的一招是看 IP 归属。开着小火箭访问任意一个能显示来源 IP 的国内站点,如果显示的归属地是新加坡、香港或美国,说明这条连接是从境外发起的。四个可观察信号可以对号入座:
| 信号 | 观察方法 | 指向的原因 |
|---|---|---|
| 全局路由不在「配置」 | 主界面底部的路由开关 | 处于代理模式,规则完全不参与判断 |
| 国内站点出站标记为节点名 | 连接日志逐条查看 | 分流规则没有覆盖到该域名 |
| 所有请求都走同一个节点 | 日志里没有任何 DIRECT | 规则组缺失或 FINAL 写成了代理 |
| 只有部分 App 慢 | 对比几个国内 App 的表现 | 某条自定义规则误伤了特定域名 |
四条里命中哪一条,后面就从哪一节往下读,不必全部走一遍。
第一步为什么是切回配置模式而不是改规则
小火箭底部的全局路由有三档:配置、代理、直连。只有在「配置」这一档,你导入的规则集才真正生效;选「代理」时所有流量无差别走节点,规则写得再完美也不会被读取。
先切档位是因为它成本最低、结论最硬。切到「配置」后重新访问刚才卡顿的国内站点:
- 恢复正常 — 问题到此为止,原来只是路由档位没切回来。很多人是在排查境外问题时临时切到「代理」,事后忘了改回去。
- 仍然慢 — 说明规则确实在生效,但规则内容有问题,继续往下查规则清单。
- 国内正常、境外也断了 — 说明当前配置里根本没有可用的代理规则,属于另一类问题,应先确认订阅是否完整导入。
顺序不能反过来。在「代理」档位下改规则,无论怎么改现象都不变,很容易得出"规则没用"的错误结论,进而把好好的配置删掉重来。
配置里缺少国内直连规则组会怎样
机场下发的配置文件质量参差不齐。有些订阅只提供节点列表,不带任何规则集;有些规则集只写了广告拦截和流媒体分流,唯独没有国内直连的那一组。这种配置装上去,境外访问一切正常,国内则全线绕路。
一份能正常工作的规则集,至少要包含下面这三类条目(以下为结构示例,地址一律用 example.invalid):
[Rule]
# 国内域名列表,命中即直连
RULE-SET,https://example.invalid/rules/cn-domain.list,DIRECT
# 局域网与保留地址,不应走节点
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
# 国内 IP 段兜底
GEOIP,CN,DIRECT
# 剩余流量的去向
FINAL,PROXY
判断依据很简单:在小火箭的「配置」页面点开当前配置,如果通篇搜不到 GEOIP,CN 或任何指向 DIRECT 的规则集,那这份配置就是缺国内直连组。此时不必删掉重导,补一份国内域名规则集进去即可,具体写法见分流规则的完整配置方法。
FINAL 写成代理和写成直连,后果差在哪
FINAL 是规则列表的最后一行,负责处理所有前面没匹配上的流量。它只有两种写法,而这两种写法的失败方式完全不同:
| FINAL 写法 | 未匹配流量去向 | 典型症状 | 适合谁 |
|---|---|---|---|
FINAL,PROXY | 走节点 | 规则集不全时,漏网的国内域名一并出境,表现为部分国内 App 慢 | 规则集覆盖国内域名较完整的人 |
FINAL,DIRECT | 直连 | 规则集不全时,漏网的境外站点打不开 | 只需要访问少数几个境外站点的人 |
多数机场配置默认 FINAL,PROXY,这本身是合理的选择——宁可慢一点也不要打不开。但它有一个前提:前面的国内规则集必须足够全。规则集一旦老旧或缺失,FINAL,PROXY 就会把所有新出现的国内域名统统送出国,而这正是"用了一年突然开始卡"的常见成因。
改成 FINAL,DIRECT 是一个见效很快但代价明确的做法:国内立刻恢复,但从此每遇到一个新的境外站点都要手动加规则。除非你的境外访问需求非常固定,否则不推荐。
自己加的规则太靠前会误伤哪些服务
规则匹配是自上而下、先命中先生效的,这意味着位置比内容更容易出错。最常见的翻车写法是为了让某个境外服务走特定节点,在列表最前面加了一条范围过宽的规则:
# 危险写法:关键词匹配范围过大,排在最前面
DOMAIN-KEYWORD,api,PROXY
DOMAIN-KEYWORD,cdn,PROXY
DOMAIN-KEYWORD,video,PROXY
api、cdn、video、img 这类关键词几乎出现在所有国内服务的域名里。这三行放在国内规则组之前,等于把国内绝大多数接口请求和图片、视频资源全部指向节点,而页面主框架因为域名不含关键词仍然直连——结果就是网页骨架秒开、图片和视频卡死,体验比全部走代理还差。
正确的位置关系是:精确规则在前,国内直连组居中,FINAL 收尾。自定义的关键词规则要么写成完整域名匹配,要么就放到国内直连组之后。
银行、支付、打车类 App 受影响时要额外注意什么
这几类 App 出问题时,表现往往不是慢,而是直接报错、验证码收不到、或者提示"网络环境异常"。原因不只是路径变长,还多了一层:这些服务会校验请求来源 IP 的归属地,一个从境外机房 IP 发起的登录请求,风控系统会当成异常处理。
涉及资金的 App 建议单独加一条直连规则,并放在所有自定义规则之前。这不是性能优化,而是避免账号因为来源 IP 频繁跨国跳变而被临时限制。
需要说明的是,IP 归属地的判定逻辑本身比较复杂,同一个机房的不同 IP 段可能被判为不同地区,这部分背景可以参考出口 IP 归属与解锁差异的说明。对小火箭用户来说,结论只有一条:这类 App 不要让它出境。
改完之后怎么验证国内域名确实走了直连
改完不验证等于没改,因为规则文件保存后不一定立即重载。按顺序做三步:
- 重启当前配置 — 在配置页面重新点选一次当前配置,或直接关闭再打开总开关,确保新规则被加载。仅保存文件不足以生效。
- 看连接日志的出站标记 — 访问三到五个刚才卡顿的国内站点,确认日志里对应条目显示 DIRECT 而不是节点名。这是唯一直接的证据。
- 用 IP 归属地做交叉验证 — 访问一个显示来源 IP 的国内站点,确认归属地回到了本地运营商。日志显示 DIRECT 但 IP 仍在境外,说明还有一层系统级代理或 DNS 没处理干净。
三步都通过后,再回头看境外站点是否仍然正常。国内恢复而境外断掉,说明改动过头了,通常是 FINAL 被顺手改成了 DIRECT。
小结
国内网站变慢和境外网站打不开是两种相反的故障,前者是"该直连的出了境",后者是"该出境的没出去",排查方法不能套用。先切回「配置」档位排除路由模式问题,再看规则集里有没有国内直连组,然后确认 FINAL 的写法与自定义规则的位置,四步之内基本能定位。规则匹配先命中先生效,所以自定义关键词规则的位置比内容更容易出错。银行和支付类 App 建议单独写直连规则,理由是风控而不是速度。改完必须重载配置并用日志和 IP 归属地双重验证,只看"感觉快了"不算数。
常见问题
为什么境外网站正常,只有国内网站变慢?
这恰恰是分流失效的典型特征。境外流量本来就该走节点,所以感觉不出差别;国内流量被一起送出去后要绕一圈再回来,往返路径被拉长几倍,表现就是国内站点和 App 变卡而境外正常。
切到「直连」模式国内就快了,是不是说明节点有问题?
不能这么推。直连模式下小火箭不接管任何流量,快是理所当然的,它只能证明变慢发生在被接管之后,不能说明节点质量。真正有诊断价值的是「配置」模式下国内是否恢复正常。
规则里已经有 GEOIP,CN,DIRECT 了,为什么还是慢?
规则是自上而下匹配的,先命中先生效。如果上面还有一条范围更大的自定义规则(比如按关键词或按进程匹配的代理规则),国内域名会在走到 GEOIP 之前就被截走。看有没有这条规则不够,要看它排第几。
国内 App 变慢会不会是 DNS 的问题而不是分流?
有可能,而且两者经常同时存在。如果域名解析请求也被送去了境外服务器,返回的会是离你很远的 CDN 节点,即便流量本身是直连的也一样慢。判断方法是看直连时打开正常、开启配置模式后打开变慢但地址栏 IP 归属地发生变化。