V2Ray 路由规则实战:geosite 与 geoip 分流配置思路

讲解 domain、ip、geosite、geoip 规则的匹配顺序,演示境内直连、境外走代理的常见分流写法,以及规则冲突时的排查办法。

本文速览

本文面向已经能通过节点访问网络、准备调整分流的用户。先区分域名规则与 IP 规则,再用一段路由配置建立“明确例外优先、境内直连、其余代理”的基线,最后结合 DNS、客户端生成配置和连接日志定位误分流。示例针对 V2Fly 与 Xray 常见 JSON 路由结构,不是可直接替换整份客户端配置的文件。

1. 先确认请求是否进入内核

路由规则只处理已经进入内核的连接。v2rayN 是桌面客户端,v2rayNG 是使用 Xray 内核的安卓客户端,v2flyNG 使用 V2Fly 内核;图形界面负责管理配置,具体匹配由当前运行的内核完成。VMess、VLESS 是代理协议,切换协议不会自动修复规则顺序错误。

应用请求 入站接收 目标识别 路由匹配 出站连接

系统代理通常只影响遵循系统代理设置的应用;应用自行直连时,内核日志中不会出现对应连接。安卓 VPN 模式还可能配置了按应用绕过。排查第一步不是增加 geosite 分类,而是确认目标应用的连接确实进入了预期入站。

10808
本文测试用 SOCKS 端口
53
传统 DNS 常用服务端口
443
HTTPS 常用目标端口

10808 仅是本文的测试约定,不代表每个版本的默认值。先在客户端当前入站配置中核对监听地址、端口及是否启用 SOCKS;端口对应的是本机入口,443 则通常属于远端网站,二者不要混淆。DNS 也可能使用加密传输,不能把所有解析请求都等同于 UDP 53。

2. domain、ip 与数据集分别匹配什么

domain 和 ip 是路由规则字段;geosite: 和 geoip: 是对应字段中引用数据集的写法。前者不是“域名所属国家的实时查询”,后者也不是网站业务归属判断。它们依据随客户端或内核部署的数据文件进行匹配,结果受数据来源和更新日期影响。

规则写法匹配对象使用边界
full:example.com完整域名仅匹配该域名,不包含子域名
domain:example.com域名及子域名包含 example.com 与 www.example.com
geosite:cn数据集中的域名分类不保证包含所有境内业务域名
192.168.0.0/16IPv4 地址段必须有可供匹配的目标 IP
geoip:cn数据集中的地址段不能据此确定访问者的实际位置

有明确域名边界时,优先用 full: 或 domain:。不带前缀的普通字符串通常按子串处理,容易把名称相似但不相关的域名一起命中。分类名称必须在实际安装的数据文件中存在;从别处复制一个分类名,并不意味着本机数据文件一定提供它。

判断:业务例外用域名,地址范围用 IP

需要固定某个站点的出口时,先写明确域名规则;需要访问本地网段时,再配置地址段规则。不要用 CDN 的单个解析地址代替整个业务域名。

3. 规则按顺序匹配,不按精确程度排序

常见 field 规则从上到下检查,第一条满足条件的规则决定出口。内核不会因为下方规则更具体,就自动覆盖上方的宽泛规则。因此,应把手工例外放在分类规则之前,把分类规则放在兜底行为之前。

  1. 先放明确例外:例如某个测试域名必须代理,即便它也属于直连分类。
  2. 再放本地与分类规则:如私有地址、境内域名、境内地址段。
  3. 最后确定默认出口:没有规则命中时,使用配置约定的兜底路径。

同一条规则内,domain 数组中的多个条目是“任一匹配”;但把不同条件字段放进同一条规则,通常是要求它们同时满足。例如 domain 加 port,表示指定域名且端口符合条件,并不是“域名或者端口符合即可”。域名分类和地址分类要表达两种独立直连依据时,应分成两条规则。

4. 一份境内直连、其余代理的路由片段

下面只展示 routing 对象。它假定现有配置中已存在标签为 direct 的直连出站和标签为 proxy 的代理出站,并将 proxy 放在 outbounds 数组第一项,作为未命中时的默认出站。标签是引用关系,不能仅凭界面显示“直连”就假定内部标签也叫 direct。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": ["full:example.com"],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:cn"],
        "outboundTag": "direct"
      }
    ]
  }
}

example.com 是保留的示例域名,用来说明例外优先级,并不代表业务推荐。配置的含义是:指定域名固定走代理;可识别的私有目标地址直连;命中境内域名或境内地址分类时直连;剩余请求使用第一项代理出站。这是一种策略选择,不是所有网络环境都应采用的固定答案。

5. domainStrategy 与 DNS 的关联

AsIs 不为路由主动解析域名;如果入站提供的是域名,IP 规则通常无法仅靠它完成匹配。IPIfNonMatch 则在域名未命中规则时尝试解析,再利用 IP 进行匹配。IPOnDemand 在匹配过程遇到需要 IP 的规则时就可能触发解析,解析时机不同,也会改变前置 IP 规则参与判断的机会。

策略路由解析时机配置关注点
AsIs不为路由额外解析主要依靠域名规则或已有目标 IP
IPIfNonMatch域名未命中后尝试解析前置宽泛域名规则可能使 IP 规则失去机会
IPOnDemand匹配需要 IP 的条件时注意前置 IP 规则和解析结果的影响

在上面的片段中,未命中域名规则的请求才有机会通过解析结果命中 geoip:cn。如果在 rules 末尾加一条覆盖全部域名的代理规则,域名阶段已经成功命中,IPIfNonMatch 就不会再因为“尚未匹配”而执行 IP 回退。想保留这条回退路径,应使用默认出站兜底,而不是随手补一条全匹配规则。

路由解析策略与最终出站如何解析目标不是同一个设置。即使路由采用 AsIs,直连出站也可能仍需解析域名。DNS 返回不同地区的 CDN 地址、只返回 IPv4 或同时返回 IPv6,都可能改变地址分类结果;应分别记录域名、解析结果和出站标签,而不是只看网页是否打开。

操作:先保留域名,再验证地址回退

先用明确域名规则验证出口标签正确,再去掉临时规则测试 IP 回退。每次只改变一个条件,才能区分域名分类缺失、DNS 结果变化与规则顺序问题。

6. 用固定测试过程定位规则冲突

在 v2rayN 中先进入「设置」→「路由设置」核对启用的规则集;不同版本的入口名称可能调整,以实际界面为准。v2rayNG 与 v2flyNG 应分别检查自己的路由设置和当前运行配置,不能把另一款客户端的界面选项名称直接套用。跨内核复制配置时,还应确认字段与数据文件格式兼容。

  1. 记录基线:保存当前内核名称、路由模式、规则顺序和本地监听端口。先确认代理节点本身可以建立连接。
  2. 核对入站:桌面端可用下面的命令,显式经过本地 SOCKS 入口,并把域名交给代理处理。端口必须替换为实际配置值。
  3. 观察出口:在客户端提供的连接日志或访问日志中查找测试域名、目标 IP 和出站标签。日志格式因内核版本而异。
  4. 隔离规则:临时将测试域名的 full 规则放到第一条,分别指向 direct 和 proxy;若出口随之变化,说明路由入口与标签基本有效。
  5. 恢复分类:删除临时规则,分别测试一个境内业务域名、一个其他域名和一个本地地址,确认分类与兜底行为。
curl --socks5-hostname 127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/

这里的 10 秒是连接阶段超时,20 秒是整个命令的时间上限,不是性能测试结果。--socks5-hostname 与本地先解析再提交 IP 的测试路径不同,适合验证域名规则。测试 HTTP 请求成功只能说明这条路径可用,不能据此推断 UDP、所有应用或 TUN 接管也已正确配置。

7. geosite 与 geoip 分流常见问题

加了 geosite:cn,为什么某个境内网站仍然走代理?

先看连接实际使用的域名,网页可能另用资源域名;再确认分类数据包含该域名、当前模式启用了这套规则。可把对应域名写成 full 规则置顶测试;确认需要长期直连后,再改为范围合适的 domain 规则。

geoip:cn 为什么一直没有命中?

检查入站提供的是域名还是 IP。如果使用 AsIs 且只有域名,IP 条件缺少匹配依据;如果使用 IPIfNonMatch,则检查前面是否已有域名规则或全匹配规则提前结束判断。之后再核对实际解析地址是否属于对应地址集。

更新订阅后,自定义分流会不会跟着变?

订阅通常更新节点集合,路由规则和地域数据往往由其他入口管理,但具体行为取决于客户端和订阅格式。更新后检查当前节点、活动路由集及生成配置;需要保留手工规则时,先导出备份,不要只保存订阅地址。

启用嗅探就能让所有 IP 连接按域名分流吗?

不能这样预期。嗅探只能从受支持且可识别的流量信息中提取域名,效果受协议和内核配置影响。优先让应用通过支持传递域名的代理入口连接;确需嗅探时,再核对目标覆盖与仅供路由使用等选项的版本支持。

稳定的分流配置不在于规则数量,而在于每条规则都有明确作用范围,且能通过日志解释其结果。先维持少量例外、分类和默认出口,再根据真实误分流逐项修正,比一次导入大量重叠规则更容易回溯。有关客户端与内核的分工,可继续查阅协议参考与概念速查。

客户端下载安装按平台选择 v2rayN / v2rayNG