机场实测室JICHANGTUIJIAN.MOM
搜索线路 / 教程/
客户端教程

让国内App走直连:Shadowrocket分流规则读懂与自定义

一句话结论

分流规则是一张自上而下匹配的清单,每条指定「符合某个域名或 IP 范围的流量,走代理、走直连还是拒绝」,第一条命中即生效,末尾的 FINAL 规则兜底。多数机场提供的配置已内置国内直连规则组,用户通常只需要在某个网站被误判时,手工在列表靠前的位置补一条 DOMAIN-SUFFIX 规则,而不必重写整份规则集。

分流规则这个词听起来像是高级功能,实际它只是一张清单:每一行说明「什么样的流量,交给谁处理」。小火箭在转发每一个请求之前,都会拿这个请求的目标域名或 IP 去和清单从上往下比对,碰到第一条对得上的就照办,后面的行直接不看了。

理解这一点,大部分规则相关的困惑就散了。为什么规则写了不生效?因为上面有更宽的一条先命中。为什么改了一个字整个境外全断?因为改的是兜底那一行。为什么机场给的配置国内不用管就已经直连?因为配置里已经预置了一整组国内域名和 IP 段的直连规则。

绝大多数人其实不需要写规则。机场提供的配置已经把常用分流做完了,只有当某个具体网站被判错——境外服务被送去直连打不开,或者国内服务被送出国变得极慢——才需要动手补一条。这篇讲的就是怎么只改那一条,而不是重写整份清单。

规则从上往下匹配,位置为什么比内容还重要

小火箭的规则表是有序的,不是集合。一个请求进来,引擎从第一行开始逐条判断,命中就执行对应策略并结束匹配。这意味着同一条规则放在第 3 行和第 300 行,效果可能完全相反。

举个最容易踩的例子。配置里通常有一条覆盖面很宽的国内域名规则组,如果你把某个被误判的境外站点规则加在它下面,那条规则永远不会被执行——请求早在上面就被判成直连了。你会看到自己明明加了规则、保存了、也重连了,行为一点没变。

补规则前先想清楚它要「抢在谁前面」。绝大多数误判问题的正确位置是:紧挨着那条把它判错的规则的上方,而不是列表开头,也不是列表末尾。放在最开头虽然一定生效,但改动多了容易互相干扰,后期很难排查。

三种域名规则:DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD 怎么选

这三种都针对域名,匹配的严格程度依次放宽。选错的后果不是不生效,而是影响范围超出预期。

规则类型匹配方式example.invalid 时会命中适用场景
DOMAIN完全相同才算命中example.invalid 本身只想处理一个确切主机名
DOMAIN-SUFFIX按域名层级从右往左匹配该域名及其全部子域日常最常用,处理一整个站点
DOMAIN-KEYWORD域名里包含这串字符即命中任何含该字符串的域名域名散乱、后缀不统一时的兜底

DOMAIN-KEYWORD 的风险在于它不理解域名结构。写一个太短的关键词,可能把一堆完全无关的第三方域名一起卷进来,而且这种误伤很难被发现——你只会觉得某些 App 偶尔怪怪的。真要用,关键词至少要长到不可能出现在其他域名里。

配置里长这样(以下为结构示例,策略名以你自己配置里的实际名称为准):

[Rule]
DOMAIN,api.example.invalid,PROXY
DOMAIN-SUFFIX,example.invalid,PROXY
DOMAIN-KEYWORD,exampleuniquestring,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY

IP-CIDR 和 GEOIP:什么时候域名规则不够用

有些流量根本没有域名可用——App 直接连 IP,或者用的是私有协议。这时域名规则一律匹配不上,只能靠 IP 层的规则。

IP-CIDR 用来指定一段 IP 范围,常见于把某个已知机房段整体判给直连或拒绝。GEOIP 则按 IP 所属国家判断,GEOIP,CN,DIRECT 这一条几乎是所有国内分流配置的核心:凡是目标 IP 归属中国大陆的,一律直连。

需要注意 IP 规则的一个副作用:引擎为了拿到目标 IP,可能需要先做一次 DNS 解析。如果一条 IP 规则位置很靠前,它会让本来可以纯靠域名判断的请求多绕一步。规则集里通常把域名规则放前面、IP 规则放后面,原因就在这里。

你遇到的情况该用的规则类型
某个网站整站要走代理DOMAIN-SUFFIX
只有某个 API 子域要走代理DOMAIN
某个 App 不用域名、直连固定 IP 段IP-CIDR
想让所有国内 IP 走直连GEOIP,CN
想屏蔽某类广告或统计域名DOMAIN-SUFFIX 配 REJECT

一个境外网站被判成直连,怎么只改这一条

这是最高频的实际需求。表现通常是:某个境外站点打不开或一直转圈,但换成代理模式立刻恢复——说明节点没问题,是规则把它判错了。

  1. 先确认它现在走了哪条路。在首页的最近请求列表里找到该域名,看它对应的策略。这一步不能跳,否则你可能在修一个根本不存在的问题。
  2. 找到把它判错的那一条。多数情况是国内域名规则组或 GEOIP 判定,请求列表里通常会显示命中的规则。
  3. 在那一条的上方插入新规则。类型选 DOMAIN-SUFFIX,填该站点的主域名,策略选代理或你常用的节点组。
  4. 保存后断开重连。规则在连接建立时加载,不重连的话你看到的还是旧规则,很容易误判成「改了没用」。
  5. 回到最近请求复核。同一个域名的策略应该已经变成代理,如果没变,回到第 3 步检查插入位置。

不要为了省事直接长期停在代理模式。那样国内网站、支付和视频 App 都会被送出国,访问明显变慢,套餐流量也消耗更快。模式与规则的分工,可以对照路由模式的选择说明理解。

FINAL 是兜底,改错它等于改了全局

规则表末尾那条 FINAL 没有匹配条件,它管的是「前面所有规则都没命中的流量」。互联网上域名的数量远超任何规则集的收录量,所以实际上有相当大比例的请求都是靠 FINAL 决定去向的。

它被改成直连,后果是大批境外网站突然打不开,而国内一切正常——很多人会误以为是节点坏了或者机场出了问题,反复换节点毫无效果。反过来改成代理,则会让所有未收录的域名都出国,包括不少国内小站和 App 接口。

FINAL 策略典型表现适合谁
代理未收录域名一律出国,境外访问容错高大多数人,机场默认值
直连未收录域名一律直连,境外站点大面积失败只在特定内网场景才有意义
拒绝未收录域名直接被断掉严格白名单玩法,普通用户不建议

机场规则和自己加的规则冲突时,听谁的

不存在「谁优先级更高」这种设定,只有位置先后。你的规则在上面就你的生效,在下面就机场的生效。所以冲突问题本质上是排序问题。

真正需要留意的是持久性。远程配置每次更新都会被重新拉取,如果你直接在拉下来的内容上改,下次更新时改动就没了;而保存成本地配置后再编辑,改动会一直在,但机场后续新增的规则你也拿不到。两种取舍各有代价,配置的来源、导出和迁移方式写在配置文件的备份与迁移那一篇。

折中做法是:日常用远程配置保持规则集新鲜,只把少数几条个人化规则记在备忘里,更新后重新补上。需要长期稳定、不希望被覆盖的,才转成本地配置。

改完之后,怎么确认某个域名真的走对了路

不要靠「感觉快了」判断,那不可靠。小火箭本身提供了可核对的依据:

  • 最近请求。首页下方的请求记录会显示每个域名实际命中的规则和使用的策略,这是最直接的证据。
  • 对比测试。用同一个域名在切换规则前后各访问一次,观察记录里的策略变化,而不是只看网页能不能打开。
  • 查出口地址。访问一个显示当前 IP 的服务,确认返回的是节点所在地区还是本地。这一步能验证「确实出国了」,但验证不了具体命中哪条规则,只能作为补充。

如果记录里的策略已经正确、网站却依旧打不开,那问题就不在规则层了,应该转向节点可用性或解析层面,按故障排查栏目里的现象分类继续走。

小结

规则表是有序清单,第一条命中即生效,位置决定一切。日常只需在被误判的规则上方补一条 DOMAIN-SUFFIX,不必重写整份配置。三种域名规则里 DOMAIN-SUFFIX 是默认选择,DOMAIN-KEYWORD 因为不理解域名结构容易误伤,能不用就不用。FINAL 决定所有未收录流量的去向,改动它等同于改全局行为。每次改完都要重连再看最近请求,那份记录是判断规则是否生效的唯一可靠依据。

常见问题

规则写在最后一条,是不是也一样会生效?

不一定。规则是自上而下匹配、第一条命中即生效的,如果前面已经有一条更宽的规则把这个域名吃掉了,写在后面的那条永远轮不到执行。所以补规则时位置比内容更容易出错。

DOMAIN-SUFFIX 和 DOMAIN-KEYWORD 我该用哪个?

优先用 DOMAIN-SUFFIX。它按域名层级从右往左匹配,范围明确;DOMAIN-KEYWORD 只做字符串包含判断,很容易连带命中一堆无关域名,属于实在没办法时才用的兜底手段。

自己加的规则会被订阅更新覆盖吗?

取决于规则加在哪里。写在本地配置的自定义规则段里通常会保留,直接改远程配置拉下来的那份内容则会在下次拉取时被覆盖。想让改动长期存在,应该保存成本地配置。

FINAL 改成 DIRECT 会怎样?

所有没被前面任何规则命中的流量都会走直连,表现是大量境外网站突然打不开,而国内访问一切正常。这是最常见的一种误改,恢复方法是把 FINAL 的策略改回代理。