V2Ray 路由分流实战:用 geosite 与 geoip 规则区分境内外流量

以中国大陆境内直连、境外走代理为例,讲解 geosite、geoip 规则写法、domainStrategy 的选择,以及规则排列顺序的常见误区。

本文速览

本文适合已能通过 v2rayN 连接节点、准备调整路由的 Mac 用户。先区分域名列表与 IP 地址库,再配置“私有地址直连、境内域名与 IP 直连、其余交给代理”的规则。示例展示可读的 routing 片段,并说明默认出站、DNS 与规则顺序如何共同决定实际结果。

geosite 与 geoip:匹配对象不同

分流不是根据网页语言或设备所在地判断线路。V2Ray 核心接收请求后,读取可用的目标域名、目标 IP、端口等信息,再按 routing.rules 的顺序寻找匹配项。命中规则后,流量交给该规则指定的 outboundTag。这里的标签必须对应 outbounds 中真实存在的 tag。

写法匹配对象主要限制
geosite:cn域名分类列表依赖所用 geosite 数据文件,不等于全部境内网站
geoip:cn被数据库归入中国的 IP 网段不代表网站所属公司或内容语言
geoip:private私有及特殊用途地址集合具体范围应以所用数据文件为准
domain:example.com指定域名及其子域名不覆盖名称相似的其他域名
full:example.com精确域名不包含其子域名

geosite:cn 是分类条目,不是按域名后缀猜测位置。某个 .com 域名也可能在列表中;反过来,网站使用境外 CDN 时,域名分类与 IP 归属可能给出不同结果。域名信息存在时优先按域名分流,通常比只看解析后的地址更容易维护。

v2rayN 路由设置:先备份,再修改

v2rayN 是配置与连接管理客户端,真正执行规则的是选定的核心。Project V、V2Fly 与 Xray 生态中的配置有共同字段,也有各自扩展。本文只使用常见的 field 规则,不把某一核心的扩展参数直接移植到另一核心。

  1. 记录当前配置

    在主界面记录当前服务器、路由模式及系统代理状态。打开「设置」→「参数设置」,记录当前使用的核心及本地监听端口。界面分组会随版本变化,以实际显示为准;不要为套用示例切换一个不支持现有节点协议的核心。

  2. 备份路由规则

    进入「设置」→「路由设置」,先备份现有规则内容,再新建或编辑用于测试的路由配置。确认主界面实际选中了这套路由,而不是仍处于全局代理或全局直连模式。

  3. 核对出站标签

    查看核心实际加载的配置,核对代理与直连出站的 tag。本文使用 proxy 和 direct,它们只是示例标签;实际标签不同时,必须同步替换规则中的 outboundTag。

  4. 应用并看日志

    保存规则后让客户端重新加载核心配置,再查看日志中的启动结果。出现未知出站、数据文件加载失败或 JSON 解析错误时,先恢复备份,不要继续叠加规则。

客户端通常会重新生成运行配置。直接修改临时 config.json,可能在换节点或重启后被覆盖。日常使用应优先通过路由设置保存规则;手工配置用户则在自己的配置源中维护下面的片段。

routing 示例:境内直连,其余走代理

下面是一个独立的路由片段,不是完整客户端配置。使用前必须已有可用的代理出站,以及 protocol 为 freedom 的直连出站;两者标签分别为 proxy 与 direct。还需确认核心能读取包含相应分类的 geosite 与 geoip 数据文件。

{
  "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"
      }
    ]
  }
}

没有规则命中时,核心通常使用 outbounds 中的第一个出站。因此,“其余走代理”既可以用显式规则实现,也可以依赖代理作为默认出站。两种方式对 IPIfNonMatch 的影响不同,不能只复制 rules 而忽略出站顺序。

domainStrategy:何时为路由解析域名

routing.domainStrategy 决定路由匹配过程中是否尝试把域名转换为 IP。它不是系统 DNS 开关,也不等同于直连出站自己的域名处理策略。更改这个字段,不会自动完成 DNS 请求的接管、加密或上游选择。

IPIfNonMatch

推荐

先用已有目标信息匹配;域名没有匹配任何规则时,再尝试解析,并使用结果重新匹配。适合作为起点,但要检查末尾是否已有覆盖所有请求的规则。需要解析补判时,使用代理首出站作为默认行为更清楚。

适合:域名规则优先、明确管理默认出站的配置

AsIs

路由阶段不主动为匹配而解析域名。域名请求主要依赖 domain 规则;本来就以 IP 为目标的请求仍可匹配 ip 规则。它不能保证整个连接过程完全不发生 DNS 查询。

适合:域名列表较完整、希望减少路由解析依赖的配置

IPOnDemand

域名请求匹配到需要 IP 信息的规则时,尝试解析再判断。若第一条就是 geoip:private,可能很早便触发解析,因此 DNS 的可用性与返回地址会更直接地影响分流。

适合:确实需要按解析地址决策、且已验证 DNS 路径的配置

结论:先确定兜底,再选解析策略

需要“域名列表之外再按 IP 补判”时,先把代理设为第一出站,删除末尾全匹配规则,再使用 IPIfNonMatch 验证。若保留显式兜底,应明确接受未知域名直接走代理,或单独测试 IPOnDemand 的解析结果。

同一域名可能返回多个 IPv4 与 IPv6 地址,也可能随 DNS 上游改变 CDN 落点。某次命中 geoip:cn,不代表以后所有连接都会命中。若业务需要稳定出口,应为明确的域名建立专用规则,而不是把偶然出现的 CDN 地址长期固定到规则里。

规则顺序:首条命中,不是自动择优

规则列表按从上到下的顺序检查,命中后就使用相应出站。核心不会比较两条规则谁“更具体”。把专用例外放在宽泛分类之前,把全匹配兜底放在最后,是维护规则的基本顺序。

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

例如,某个域名虽然被域名库归入直连分类,但实际业务要求固定走代理,可以把上面的专用规则放在 geosite:cn 之前。example.com 是说明语法的示例域名,应用时要改成实际目标。若只覆盖根域名、不覆盖子域名,应改用 full:。

验证与排错:看目标、规则和出站

网页能打开,只能证明这次请求完成,不能证明它经过了预期出口。先确认核心启动成功,再用固定请求观察访问日志中的目标与出站标签。不同核心的日志格式不同,有些格式会显示入站到出站的对应关系;日志级别较低时,需临时提高记录级别,测试完成后恢复。

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

这里的 10809 只是演示用 HTTP 代理端口,不是对当前 v2rayN 默认值的断言。请替换为「设置」→「参数设置」中实际启用的 HTTP 或混合监听端口。命令显式指定本地代理,便于把“终端是否遵循系统代理”这个变量排除;这两条请求主要验证 TCP 路径,不验证浏览器的 UDP 行为。

国内网站为什么还是走代理?

先从日志确认目标是域名还是 IP,再检查该域名是否在当前 geosite 数据中。若使用 IPIfNonMatch 且末尾有全匹配代理规则,域名不会再解析补判。可以先加一条精确域名直连规则测试,不要立刻改成整段 IP 直连。

加了 geoip:cn 后部分网站打不开?

检查 DNS 返回地址以及日志中的实际出口。若目标 IP 被判为境内,但该服务在当前网络无法直连,可先为该服务的域名添加代理例外,并放在境内直连规则前。每次只改一条规则,保留失败时的目标记录用于对照。

日志提示找不到 geosite 分类怎么办?

核对规则中的分类名、核心实际加载的数据文件路径及启动日志。不同数据发行内容不一定相同;订阅更新也不等同于规则数据库更新。使用客户端对应的数据更新入口后重启核心,仍失败就恢复已确认存在的分类。

改完规则没变化,需要重装吗?

先确认已切换到新路由配置,重新加载核心,并关闭测试应用的旧连接再发起请求。已建立的长连接不会因为修改规则就自动换出口。还应确认改的是配置源,而不是会被客户端覆盖的运行时文件。

最后保留三项记录:使用的核心、路由规则内容、测试请求对应的出站标签。公开日志前删除订阅地址、节点凭据和私人访问记录。分流配置的验收目标是“指定请求稳定进入指定出站”,而不是用一次测速结果判断所有规则是否正确。

下载v2rayN按平台选择客户端