进阶技巧 预计阅读 13 分钟

路由规则分流实战:用 geosite 与 geoip 实现直连代理精确分离

以中国大陆访问场景为例,讲解 geosite:cn 与 geoip:private 等规则的匹配顺序、domainStrategy 取值影响,并给出一套可直接套用的三段式路由模板。

先把路由分流拆成三个判断对象

v2rayN 中的路由规则最终交给 Xray 内核执行。每一条连接进入内核后,路由模块会读取目标域名、目标 IP、端口、网络类型和入站标签等属性,再从上到下检查规则。首条满足条件的规则决定连接使用哪个出站。常见出站通常包括代理、直连和阻断,其中本文只处理代理与直连的精确分离。

在中国大陆的日常网络环境中,一套容易维护的规则可以分成三个逻辑层。第一层处理局域网和本机私有地址,避免访问路由器、存储设备或本地服务时绕入代理链路。第二层处理明确属于中国大陆站点或地址段的目标,使其直接连接。第三层不再枚举域名类别,而是把剩余流量交给代理出站。

  1. 私有地址层:匹配 geoip:private,使用直连出站。
  2. 中国大陆目标层:分别匹配 geosite:cngeoip:cn,使用直连出站。
  3. 默认处理层:匹配其余 TCP 与 UDP 连接,使用代理出站。

这里的“层”是策略结构,不代表每层只能写一个规则对象。域名条件与 IP 条件最好拆成独立规则,因为同一条规则中不同字段通常是同时满足关系,而同一字段内的多个值才是任一命中关系。把 domainip 不加区分地塞进一个规则,可能让实际匹配范围比预期更窄。

geosite 与 geoip 分别解决什么问题

geosite 根据域名类别判断

geosite 数据按域名特征整理类别。geosite:cn 用于匹配被归入中国大陆类别的域名。应用访问目标时,如果内核能够取得原始域名,域名规则可以在建立目标连接之前完成判断,不必先依赖目标地址属于哪个 IP 段。

域名类别适合处理使用内容分发网络、动态地址或多地址调度的站点。某个站点的解析结果可能随运营商、地区和时间变化,但域名归属通常更稳定。将这类域名直接匹配到直连出站,可以减少因地址变化造成的规则漂移。

需要注意,geosite:cn 表示数据文件中的域名分类,不等于“当前解析结果一定位于中国大陆”。站点可能使用跨区域节点,企业也可能调整托管位置。因此,geosite 更适合表达域名策略,不能替代实时网络测量。

geoip 根据目标地址判断

geoip 数据把 IP 地址段按用途或地区归类。geoip:private 覆盖局域网等非公网目标,常用于直连本机网段、家庭路由器管理地址、局域网打印服务和内部存储设备。它应放在普通地区规则之前,因为私有地址不是一个适合交给远端代理处理的目标类别。

geoip:cn 则用于匹配归入中国大陆地址段的目标。当应用直接连接某个 IP,或者域名没有命中已有 geosite 规则但随后完成了解析,IP 规则便可以补充判断。它与 geosite:cn 不是替代关系,而是分别覆盖“按域名识别”和“按地址识别”两条路径。

规则项 判断依据 典型用途 建议出站
geoip:private 目标 IP 属于私有地址范围 局域网、本机网段、内部服务 直连
geosite:cn 目标域名属于对应分类 按域名识别中国大陆站点 直连
geoip:cn 目标 IP 属于对应地址段 直接访问 IP 或域名解析后的补充判断 直连
network: tcp,udp 连接使用 TCP 或 UDP 接收前面规则未命中的常规流量 代理

domainStrategy 决定何时把域名解析成 IP

只写 geosite 与 geoip 还不够。域名请求是否会继续进入 IP 判断,取决于路由配置中的 domainStrategy。这个参数影响路由阶段的解析行为,不是简单的“DNS 开关”。理解它,可以解释很多“域名规则正常,IP 规则却没有接管”的现象。

AsIs:保持原始目标形式

AsIs 表示路由阶段优先按连接携带的原始目标进行判断。目标是域名时,主要使用域名相关规则;路由模块不会为了尝试 geoip 规则而主动把域名解析成 IP。目标本身就是 IP 时,geoip 规则仍然可以正常匹配。

这种模式解析动作少,路径直观,但对“域名未被 geosite 收录、希望再按解析地址判断”的场景覆盖不足。例如某个中国大陆域名没有命中 geosite:cn,即使它解析到 geoip:cn 地址段,也可能直接落入最后的代理规则。

IPIfNonMatch:域名规则未命中后再解析

IPIfNonMatch 适合本文的三段式分流。内核先使用域名信息尝试规则;当域名规则没有得到结果时,再解析目标域名,并使用得到的 IP 尝试地址规则。这样可以先发挥 geosite:cn 的分类优势,再让 geoip:privategeoip:cn承担补充判断。

这一策略在准确性和额外解析之间较为平衡。它不会在每次域名连接开始时立即要求 IP 判断,但当域名分类不足时仍有第二条匹配路径。对于“国内域名直连、国内地址直连、其余代理”的常规桌面配置,通常比 AsIs 更符合预期。

IPOnDemand:存在 IP 条件时提前解析

IPOnDemand 会在路由判断需要 IP 信息时更积极地解析域名。配置中存在可参与匹配的 IP 规则时,解析可能较早发生。它适合确实依赖目标地址进行细粒度控制的配置,但也意味着 DNS 路径、缓存状态和解析结果会更直接地影响路由过程。

如果规则目标只是常见的国内直连与其余代理,没有必要仅为了“看起来更彻底”而选择更积极的解析策略。先使用 IPIfNonMatch,再根据日志中未命中的具体目标调整,通常更容易定位问题。

可直接调整的三段式路由模板

下面的片段只展示 routing 部分。它假定现有完整配置中已经存在标签为 direct 的直连出站和标签为 proxy 的代理出站。若当前配置使用其他标签,应将模板中的 outboundTag 改成实际值。标签必须完全一致,包括大小写。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": [
          "geosite:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

从策略上看,这仍然是三段。第一条对应私有地址层;第二、第三条共同构成中国大陆目标层,但为了避免不同字段间的同时满足关系而拆开;第四条是代理兜底层。

当目标是局域网 IP 时,第一条规则直接命中。目标是 geosite:cn 分类中的域名时,第二条规则命中。目标是直接输入的中国大陆 IP,或未命中域名分类但在 IPIfNonMatch 阶段解析到中国大陆地址时,第三条规则接管。其余常规 TCP、UDP 流量进入最后的代理出站。

如果完整配置中还包含阻断特定域名、固定某个业务走代理、指定某个进程使用特定出站等规则,应把这些更具体的规则放在兜底之前。是否放在中国大陆直连规则之前,则取决于优先级。例如某个被归入 geosite:cn 的域名必须走代理,对它的单独代理规则就要排列在 geosite:cn 之前。

在 v2rayN 中落地时先确认四个位置

一、确认规则使用的出站标签

模板中的 directproxy 只是常见标签。实际运行配置可能由 v2rayN 根据当前服务器、路由模式和内核设置生成。修改自定义配置或高级路由前,先查看当前出站标签,确保规则引用的目标确实存在。引用不存在的标签会导致规则无法按设计转发,内核日志通常会给出对应错误。

二、确认 geosite 与 geoip 数据可被当前内核读取

geosite:cngeoip:cn 依赖数据文件。内核程序本身负责执行规则,分类内容则来自配套数据。若日志提示类别无法加载、文件不存在或条目未知,应先处理内核与数据文件的配套状态,而不是反复改变规则顺序。

更新数据后应重新启动相关内核进程,使新进程重新读取资源。只关闭设置窗口并不一定代表运行中的内核已经重载。测试前可在 v2rayN 中停止并重新启动连接,再观察新生成的日志。

三、确认系统流量确实进入 v2rayN

路由规则只能处理已经进入内核的连接。使用系统代理时,应用需要遵循系统代理设置;使用 TUN 模式时,则要检查 TUN 是否启动、路由是否建立以及 DNS 是否按预期接管。如果某个应用完全绕过当前入口,修改 geosite 或 geoip 规则不会改变它的网络路径。

排查时不要先根据网页打开速度猜测分流结果。更可靠的方法是观察访问目标时是否产生连接日志、命中了哪个出站标签,以及目标在日志中以域名还是 IP 出现。没有任何对应记录时,应先检查流量入口,而不是继续增加路由条件。

四、确认订阅更新不会覆盖自定义路由

订阅负责提供服务器节点及相关连接参数,路由规则属于客户端本地策略。更新订阅后,节点列表会变化,但自定义路由是否保留取决于规则保存位置和当前配置方式。应把长期使用的规则保存在 v2rayN 提供的路由设置或明确管理的自定义配置中,不要只修改一次性生成的临时运行文件。

规则顺序错误时会出现哪些典型现象

兜底代理放在最前面

如果 network: tcp,udp 的代理规则位于列表开头,大多数常规连接会立即命中,后面的 geoip:privategeosite:cngeoip:cn 没有机会执行。表现通常是国内站点和局域网目标都进入代理。修正动作不是新增排除项,而是把宽泛兜底移动到末尾。

单独例外放在 geosite:cn 后面

假设某个中国大陆分类中的业务域名因测试需求必须使用代理,而它的单独规则排在 geosite:cn 后面,那么连接会先被国内直连规则接管。应将具体域名规则放到类别规则之前。路由列表越靠前,越适合放置范围窄、意图明确的例外。

只写 geosite:cn,没有 geoip:cn

这种配置能处理大量带域名的访问,但无法覆盖直接连接中国大陆 IP 的场景,也无法利用解析结果补充未收录域名。日志中如果目标经常直接显示为 IP,增加独立的 geoip:cn 规则会比不断扩展域名列表更有效。

只写 geoip:cn,没有 geosite:cn

只依赖地址判断会让解析过程承担更多工作,并受内容分发节点和地址调度影响。某个中国大陆业务域名可能解析到不属于预期类别的地址,进而落入代理。域名策略明确时,优先使用 geosite:cn 表达意图,再用 geoip:cn 补充更合适。

把多个条件误当成任一命中

若一条规则同时写入 domainipportnetwork,通常意味着连接需要同时满足这些字段。规则没有命中时,应逐个检查字段,而不是只验证其中一个域名是否在列表里。为了降低维护难度,可以把不同判断维度拆成多条意图单一的规则。

用日志验证,而不是用感觉判断

一套分流规则完成后,至少选择四类目标进行测试:局域网地址、中国大陆分类域名、中国大陆直连 IP,以及预期进入代理的普通外部域名。每次只测试一个目标,并记录目标形式、解析结果和最终出站标签。

  1. 访问路由器或局域网服务,确认连接使用 direct
  2. 访问一个稳定的中国大陆域名,确认 geosite:cn 对应的直连路径生效。
  3. 对一个明确的中国大陆 IP 发起连接,确认 geoip:cn 能够独立命中。
  4. 访问不属于前述类别的目标,确认最终由 proxy 兜底。

如果内核日志级别过低,看不到足够的路由信息,可以在排查期间提高日志详细程度,完成后再恢复日常设置。日志中重点关注目标地址、域名解析、规则错误和出站标签。测试期间还应避免浏览器缓存、已有长连接或后台请求混入判断;关闭目标页面后重新建立连接,结果更容易辨认。

从基础模板扩展时保持“具体在前,宽泛在后”

三段式模板适合作为起点,不适合无限堆叠未经验证的类别。扩展时可以先写清业务意图,再决定使用域名、IP、端口还是入站标签。某个固定域名必须代理,就添加具体域名代理规则;某个内部网段必须直连,就添加对应 IP 网段直连规则;某类 UDP 业务需要特殊出站,再单独添加网络与端口条件。

每增加一条规则,都应回答三个问题:它要覆盖什么目标,它必须排在哪条规则之前,它未命中时应落到哪里。无法回答时,说明规则范围或优先级还不清楚。比起大量规则,顺序明确、字段单一、日志可验证的短规则集更容易长期维护。

对于本文场景,最终原则可以压缩为一句话:先保护私有网络,再识别明确的中国大陆域名和地址,最后把剩余连接交给代理。geosite:cn 负责域名层面的策略,geoip:privategeoip:cn 负责地址层面的补充,IPIfNonMatch 则连接两种判断路径。只要出站标签准确、数据文件可读、流量确实进入内核,这套结构就能提供可解释、可排查的直连代理分离。

下载 v2rayN