V2Ray 路由规则实战:geosite 与 geoip 的国内外分流写法

用真实 routing 片段演示中国大陆站点直连、境外站点走代理的分流写法,并讲清 domainStrategy 的取舍与规则匹配顺序。

本文速览

本文面向已经能连接节点、准备调整分流规则的用户。先区分域名表与 IP 地址表,再组合中国大陆站点直连、局域网直连与默认代理。示例重点说明 IPIfNonMatch 的解析条件、第一条出站的兜底作用,以及如何用客户端日志验证实际命中的出口,避免把“页面能打开”当作分流正确的证据。

一、geosite 与 geoip 分别匹配什么

geosite 是域名分类数据,geoip 是 IP 地址范围数据。二者不是两套自动识别网站归属的服务,也不会实时查询网站运营主体。路由结果取决于本机数据文件、请求交给内核时携带的目标信息,以及规则顺序。

写法匹配对象使用边界
geosite:cn数据集中 cn 分类的域名需要内核获得域名;不是所有使用中文的站点
geoip:cn数据集中中国大陆 IP 网段依赖目标 IP,不能直接说明网站属于哪家公司
geoip:private私有、保留等特殊用途地址集合常用于局域网直连;具体范围以所用数据文件为准
domain:example.com指定域名及其子域名用于手动补充单个站点,不依赖分类标签
full:example.com精确域名不会同时匹配 www.example.com

网站可能使用跨地区 CDN。同一个域名在不同网络下解析到不同地址,因此“域名命中 cn”和“解析地址命中 cn”不是同一个判断。浏览器先自行解析再把 IP 交给代理时,域名规则也可能失去直接匹配的机会;嗅探可以在部分协议中补充域名信息,但不能保证恢复所有请求的域名。

二、可合并的 routing 片段与默认出口

下面是完整的 routing 对象片段,不是可以直接连接节点的完整配置。将它合并到已有的 V2Ray 或 Xray 配置前,必须核对出站标签:本文约定 direct 指向使用 freedom 协议的直连出站,proxy 指向已经测试可用的代理出站。标签只是名字,不会自动创建出口。

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

这个片段要求已有配置的 outbounds 第一项是代理出站。在本文这种普通路由配置中,没有规则命中时,流量使用第一条出站;它不由 proxy 这个标签名自动决定。如果第一项实际是直连,未命中的境外站点也会直连。不要仅为了满足顺序而复制一条缺少服务器信息的代理出站。

这里的“境外站点走代理”准确含义是:未被上述直连规则接收的流量默认走代理。它不是实时、完整的国家归属判定。需要严格按某个域名指定出口时,应添加显式域名规则,而不是期待 IP 地址归属始终符合业务需求。

结论:先核对兜底,再改分类

保存规则前,先检查生成配置中 outbounds[0] 的实际协议与标签。默认出口正确后,再用一条域名例外验证规则顺序;否则分类列表调整得再细,也可能把未命中流量送到错误出口。

三、domainStrategy 的选择与兜底陷阱

routing.domainStrategy 控制路由阶段是否为了匹配 IP 规则解析域名。它不等同于 DNS 服务器选择,也不等同于出站连接时的地址选择策略。相同名称的设置出现在不同配置层级时,应先确认所在对象。

IPIfNonMatch

推荐

先按已有目标信息匹配规则;没有规则命中时,再尝试解析域名并重新匹配。本文片段采用此策略,并通过第一条出站兜底,不添加全匹配末尾规则。

适合:域名分类优先,同时需要中国大陆 IP 补充直连的配置。

AsIs

路由阶段不为域名额外解析 IP。已有目标 IP 仍可匹配 IP 规则,但仅以域名进入的请求不会因此获得 geoip 分类结果。连接阶段仍可能需要解析域名。

适合:以域名规则为主,希望减少路由阶段额外 DNS 查询的配置。

IPOnDemand

匹配过程中需要判断 IP 规则时,可以触发域名解析。IP 规则放得越靠前,越可能提前发生查询;不能简单理解为每个请求都一定先解析。

适合:明确需要在规则流程中较早执行 IP 判断,并能接受对应查询开销的配置。

常见错误是在 IPIfNonMatch 配置末尾再加 network: "tcp,udp" 的代理规则。它可以在第一轮直接匹配请求,使“没有规则命中”这个条件不再成立。结果是域名不在 geosite:cn 中时,可能直接走代理,而没有机会通过解析结果命中 geoip:cn。

路由解析也有隐私与连通性成本。哪些域名发给哪台 DNS 服务器,需要结合完整的 dns 配置、查询流量路径以及浏览器自身的解析方式判断。把 domainStrategy 改为某个值,不能单独保证 DNS 查询使用代理,也不能单独解决解析污染。

四、规则顺序:例外优先,分类其次

同一次规则匹配从上到下检查,首个匹配的规则决定出口。若一个规则对象同时含有 domain 和 ip 等多个条件,这些条件需要同时满足;同一个 domain 数组里的多个条目则是任选其一。需要“域名命中或 IP 命中就直连”时,应像本文一样拆成两条规则。

例如某个站点虽然在 cn 分类中,业务测试却要求它固定走代理,可以把以下对象插入 rules 数组首位。这里的 example.com 是说明语法用的保留域名,实际使用时应填写需要测试的域名。

{
  "type": "field",
  "domain": [
    "domain:example.com"
  ],
  "outboundTag": "proxy"
}

“私有 IP 必须最先匹配”也不是对所有场景都成立。如果希望域名例外优先于其解析地址,就要保持相应顺序;如果要求任何私有地址都直连,则还需考虑域名例外、DNS 返回结果与解析策略之间的关系。企业内网尤其应先确认地址规划,不能把一套公共网络示例直接覆盖到现有策略上。

五、在客户端中应用并核对实际配置

v2rayN 是桌面客户端;v2rayNG 使用 Xray 内核,v2flyNG 使用 v2fly 内核。客户端界面负责生成或载入配置,真正执行规则的是所选内核。完整自定义配置与普通节点模式的设置入口、覆盖范围并不相同,不应同时修改两套设置后猜测哪一套生效。

  1. 备份当前配置

    记录当前启用的节点、路由方案与本地监听端口,并保存现有自定义配置。先确认未改路由时节点能连接,再开始调整分流。

  2. 进入路由设置

    v2rayN 常见入口为「设置」→「路由设置」;v2rayNG 常见入口为侧边菜单→「路由设置」。不同版本的名称可能变化,应以当前界面为准。先查看现有规则,不要直接删除整套方案。

  3. 选择配置方式

    使用界面规则编辑器时,分别填写域名、IP 与目标出口,并核对排序。使用完整自定义配置时,才合并本文的 routing 对象;不要把整个 JSON 对象粘进只接收域名列表的输入框。

  4. 检查实际标签

    核对生成或载入的配置,确认 direct、proxy 都存在,并检查第一条出站。界面上的“直连”“代理”选项可能映射到其他标签,应使用实际配置中的名称。

  5. 重启并看日志

    保存并启用对应路由方案后,停止再启动连接。查看运行日志是否出现规则解析、资源文件或出站标签错误。仅保存编辑窗口,不代表运行中的内核已经重载。

若要比较内核行为,应分别记录所用内核及版本,而不是只记录客户端版本。v2rayNG 与 v2flyNG 不应被当作同一内核的两个界面;自定义配置中的扩展字段和资源加载方式需要分别核对。基础字段的进一步说明可参阅本站JSON 手册。

六、用请求与日志验证分流结果

测试必须先证明请求进入了内核,再证明命中了预期出口。浏览器扩展、系统代理绕过列表、终端环境变量都可能改变入口。下面以本机已经启用 127.0.0.1:10808 SOCKS 监听为前提;10808 是测试端口,不代表所有安装的默认值,执行前应替换为当前监听端口。

curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://www.baidu.com/
curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/

socks5h 让 curl 把域名交给代理端处理,适合观察域名规则;它并不等于 DNS 查询一定经过远端代理。第一条请求用于观察 cn 域名分类,第二条用于观察非直连分类的兜底行为。HTTP 响应成功只能说明连接完成,实际出口仍应以访问日志中的目标地址和出站标签为准。

测试项目预期观察异常时优先检查
数据中属于 cn 的域名日志选择直连出口geosite 数据、域名是否传入、前置规则
实际存在的局域网地址日志选择直连出口private 数据、IP 规则、内网连通性
不属于直连范围的域名日志选择代理出口第一条出站、额外规则、解析结果
手动指定代理的例外域名优先命中例外规则例外位置、domain 与 full 的区别

测试局域网地址时,应使用自己网络中确实存在的设备,例如管理地址为 192.168.1.1 的路由器;该地址只是示例。设备未提供网页服务时,连接失败不意味着路由规则错误。日志能够显示选择了哪个出站,目标服务是否响应则属于下一层检查。

加了 geoip:cn,为什么部分国内网站还走代理?

先查看请求是域名还是 IP,再检查 domainStrategy。如果使用 AsIs,域名不会为 IP 规则额外解析;如果使用 IPIfNonMatch,检查末尾是否有全匹配规则提前接收请求。最后核对实际解析地址是否在所用 cn 数据中。

国内域名为什么连接到了境外地址?

域名分类不保证服务器地址所在地区。若 geosite:cn 已经命中直连,后面的 geoip 规则不会再改变出口。需要按 IP 决策时,应明确调整策略和顺序,并重新测试 CDN 解析结果。

规则保存了,日志为什么还是旧的出口?

确认启用的是刚编辑的路由方案,再停止并启动内核。完整自定义配置可能不使用普通节点模式的路由编辑结果;应检查本次实际加载的配置,而不是只看编辑窗口。

所有请求都直连,应该先改哪一项?

先检查 outbounds 第一项是否为直连,以及是否存在靠前的全匹配规则。再用上述带明确 SOCKS 端口的 curl 命令确认流量进入内核。没有对应访问日志时,先处理入口问题,不要继续扩大规则列表。

v2rayN / v2rayNG 下载