
规则匹配的基本逻辑
从上到下的逐条匹配机制
Shadowrocket在处理网络请求时,规则引擎会从配置文件的第一条规则开始,按照从上到下的顺序逐条比对每个请求的目标域名或IP地址。一旦某条规则成功匹配当前请求,引擎会立即执行该规则定义的动作(如PROXY、DIRECT或REJECT)并停止后续所有规则的检查。这种“首次命中即停止”的机制意味着规则的排列顺序直接决定了流量的最终去向,排在靠前位置的规则拥有绝对的优先级优势。
精确匹配与模糊匹配的权重差异
虽然匹配顺序由规则在文件中的物理位置决定,但不同类型的规则在匹配效率上存在内在差异。精确的域名规则(如DOMAIN-SUFFIX,google.com)在匹配时只需简单的字符串比对,执行速度快且精准度高。而模糊匹配规则(如GEOIP,CN)需要查询IP地理位置数据库,计算开销相对较大。如果大量请求需要遍历整个规则列表,批量规则的性能损耗会累积,因此高频命中的精确规则应当优先放置。
兜底规则作为匹配链条的终点
配置文件末尾的FINAL策略是整个规则匹配链条的最终裁决者,任何未被所有前置规则匹配的请求最终都会执行FINAL策略指定的动作。无论FINAL设置为PROXY还是DIRECT,其执行顺序都处于规则列表的最末端,不会影响任何前置规则的优先匹配权。用户可以通过调整FINAL策略的取值来快速切换配置文件的整体分流倾向,而无需重构整个规则列表。
规则类型的优先级层级
DOMAIN类型规则的最高优先级
在所有规则类型中,DOMAIN规则(即指定具体域名的规则)享有最高的实际优先级,因为其匹配的精准度最高且确定性最强。当配置文件的前置位置放置了DOMAIN-SUFFIX或DOMAIN-KEYWORD规则时,任何匹配这些规则的请求都会被立即处理,不会进入后续的GEOIP批量匹配阶段。用户应当将所有需要精确控制的关键域名规则放在配置文件的最前面,确保这些重要流量的路由策略不受后续批量规则的干扰。
DOMAIN-SET集合规则的批处理优先级
DOMAIN-SET规则引用的是外部域名集合文件,其匹配逻辑与DOMAIN-SUFFIX类似但以批量方式处理,适用于需要覆盖大量域名的场景。在规则顺序中,DOMAIN-SET规则通常放置在DOMAIN-SUFFIX精确规则之后、GEOIP批量规则之前,起到承上启下的作用。如果DOMAIN-SET规则被放置在GEOIP规则之后,其匹配效果会因GEOIP的提前拦截而大打折扣。
GEOIP批量规则的中段位置
GEOIP规则基于IP地理位置数据库进行批量匹配,其覆盖面广但精确度不及域名规则,因此应当放置在所有DOMAIN类型规则之后。将GEOIP规则放置在配置文件中段,可以确保特定域名的精确分流不受批量地理规则的影响,同时又能将大量未被域名规则覆盖的国内IP段流量批量直连,有效减轻后续规则的处理负担。GEOIP规则的位置一旦过于靠前,所有特定域名的精确控制能力都会被批量规则覆盖而失效。
IP-CIDR与最终兜底规则的位置
IP-CIDR规则基于IP地址段进行匹配,其精确度介于DOMAIN规则和GEOIP规则之间,通常放置在GEOIP规则之后、FINAL兜底规则之前。这种位置安排使得特定IP段的流量可以在地理批量规则之后得到更精细的控制,而FINAL规则则作为所有未匹配流量的最终出口,确保任何流量都不会因为没有匹配到规则而被丢弃。
同类型规则之间的优先级规则
DOMAIN-SUFFIX之间的匹配顺序
当配置文件中包含多条DOMAIN-SUFFIX规则时,排在靠前位置的规则优先匹配,后置的同类型规则不会被引擎检查。这意味着如果用户同时拥有DOMAIN-SUFFIX,google.com,PROXY和DOMAIN-SUFFIX,googleapis.com,DIRECT两条规则,访问googleapis.com时如果后者排在前面则会直连,如果前者排在前面则会走代理。用户需要合理安排同类型精确规则的排列顺序,确保最频繁访问的域名规则排在列表前端以优化匹配效率。
同类IP规则的前后优先级
GEOIP规则和IP-CIDR规则在处理IP地址匹配时遵循相同的顺序优先级逻辑,排在前面的规则优先匹配。如果配置文件中有IP-CIDR,192.168.0.0/16,DIRECT和IP-CIDR,10.0.0.0/8,DIRECT两条规则,访问10.x.x.x的请求需要匹配到第二条规则,如果第一条规则无法匹配则继续往下检查。多个同类型IP规则在排列时,应当将覆盖范围更小的精确IP段放在前面,覆盖范围更大的批量段放在后面,避免因顺序不当导致匹配效率下降。
命名空间与规则类型的兼容性
当DOMAIN-SUFFIX规则和DOMAIN-KEYWORD规则同时匹配同一个请求时,排在靠前位置的那条规则会生效,另一条规则即使匹配程度更高也不会被执行。用户应避免为同一个域名同时配置不同类型的多条规则,因为这会导致配置的冗余和不确定性。如果必须保留多条规则,应当将覆盖范围更小、匹配更精确的规则放在前面,覆盖范围更大的规则放在后面。
规则集与内联规则的解析顺序
RULE-SET引用的展开与整合
RULE-SET指令引用外部规则集文件时,这些外部规则在逻辑上会被展开并插入到指令所在的位置,按照外部文件内部的规则顺序依次参与匹配。当一个RULE-SET指令位于配置文件中段时,其引用的所有规则会在该位置整体插入,这些外部规则的内部顺序被完整保留,但整个规则集被视为一个逻辑单元。外部规则集中的规则与配置文件中其他内联规则之间的优先级顺序,完全取决于RULE-SET指令在文件中的物理位置。
多个RULE-SET之间的优先级关系
当配置文件中包含多个RULE-SET指令时,排在靠前位置的规则集整体具有更高的匹配优先级,即使两个规则集之间存在规则重复,前面的规则集也会先于后面的规则集被匹配。如果用户引用了多个广告拦截规则集和多个直连规则集,应当将广告拦截规则集放置在直连规则集之前,确保广告域名在直连判断之前就被拦截。多个RULE-SET之间的顺序安排同样遵循“从精确到通用、从拦截到放行”的通用原则。
规则集内部顺序与文件管理的优化
规则集文件内部的规则顺序同样重要,用户在维护外部规则集文件时应当按照与主配置文件相同的逻辑组织内部顺序,将最关键的精确规则放在文件开头。如果一个规则集文件包含数百条规则但内部顺序混乱,即使该规则集在整个配置中放置的位置正确,其匹配效率也会因为内部遍历过多低优先级规则而下降。定期对规则集文件进行内部顺序审查和优化,是维持配置文件整体性能的重要环节。
策略组与节点选择的顺序影响
策略组内节点优先级的手动与自动模式
在策略组中,节点列表的排列顺序直接影响选择结果:当策略组类型为select(手动选择)时,列表顺序仅影响界面的显示位置;当策略组类型为url-test(自动延迟测试)时,列表顺序对选择结果没有影响,因为引擎会按照实际测速结果排序。但如果策略组类型为fallback(故障转移),则节点列表的顺序直接决定了优先尝试的顺序,排在第一位的节点会作为首选节点,只有在其不可用时才会尝试后续节点。
策略组嵌套时的匹配顺序
当策略组作为PROXY策略的目标时,其内部的节点或策略组选择在规则匹配阶段之后执行,与规则匹配顺序无关。策略组的嵌套深度不会影响规则匹配的优先级,但会影响具体节点选择的复杂度和执行时间。深度嵌套的策略组在每次匹配时需要遍历多个层次的策略组定义,虽然这种开销在单次请求中很小,但在大量请求并发时会产生累积延迟。
策略切换对规则顺序的影响
用户手动切换PROXY策略指向的节点或策略组,并不会改变规则匹配的顺序,只会改变PROXY策略执行时的具体转发目标。无论用户选择了哪个节点,规则匹配的顺序始终由配置文件决定,PROXY策略在匹配后执行的只是转发动作的出口变化。理解这种顺序与动作的解耦关系有助于用户区分“规则匹配问题”和“节点连通性问题”这两种不同类型的故障。
基于最佳实践的标准规则顺序
标准配置文件的推荐规则顺序
一个经过优化的标准配置文件应当按照以下顺序组织规则:首先是REJECT拦截规则(广告域名、恶意软件域名),其次是PROXY强制代理规则(关键境外服务),接着是DIRECT精确直连规则(国内主流网站),然后是GEOIP,CN批量直连规则,随后是IP-CIDR精细控制规则,最后是FINAL兜底策略。这种分层顺序覆盖了从最特殊需求到最通用需求的全部场景,确保了精确规则不被批量规则覆盖,同时保持了规则列表的整体逻辑清晰。
高频命中规则的排序优化策略
在维持逻辑顺序的前提下,用户应当将最高频命中的规则(如访问量最大的国内网站直连规则)放置在对应类别的最前端,以减少规则引擎匹配这些高频请求时的遍历深度。例如在DIRECT直连规则类别中,应当将“百度”、“腾讯”、“淘宝”等最常访问的网站规则放在该类别的靠前位置。这种基于访问频率的排序优化不会改变规则的逻辑结构,但可以显著提升整体的匹配效率。
动态调整规则顺序的调试流程
当用户发现某个特定域名的分流结果与预期不符时,应当首先通过Shadowrocket的实时日志确认该请求实际命中了哪条规则,然后根据日志结果调整规则顺序或修改规则内容。调试过程中可以在配置页面临时启用“编辑模式”拖动规则条目的位置,调整后保存并重新加载配置,然后再次检查该域名的匹配结果。反复调整直到分流行为完全符合预期后,将最终的稳定顺序固定下来作为配置文件的永久版本。