V2Ray 路由分流规则实战:国内直连、国外走代理的完整配置思路

以中国大陆网络环境为例,演示用 geosite、geoip 规则实现境内站点直连、境外站点走代理的完整 routing 配置,并说明规则匹配顺序与排错方法。

本文速览

本文面向已经能正常连接节点、但希望减少国内访问绕路的用户。内容从请求匹配过程开始,给出可直接核对的 routing 规则、v2rayN 操作位置、DNS 配合方式和日志排错步骤,最终实现国内域名与地址直连、其余流量进入代理出站。

先确定分流目标与处理顺序

V2Ray 路由分流不是把网络划成两个独立连接,而是让同一个入站接收应用请求,再依据域名、目标 IP、端口和网络类型选择出站。常见配置会准备名为 direct 的自由出站和名为 proxy 的代理出站。routing 规则只引用这些标签,不会自行创建连接。

国内直连、其余代理的核心目标可以压缩为三层判断:局域网与保留地址直接连接,中国大陆域名和 IP 直接连接,没有命中前述规则的请求交给代理。最后一条兜底规则不可省略,否则未命中的流量会落到 outbounds 数组中的第一个出站,结果取决于配置排列,不够直观。

应用请求读取目标逐条匹配选择出站建立连接

规则按数组中的先后顺序执行,首条匹配成功后立即停止。具体域名规则应放在宽泛规则前面,局域网地址应在公网地址规则前面,最终的 tcp,udp 兜底必须放在末尾。如果先写一条覆盖所有网络类型的代理规则,后面的国内直连规则永远没有执行机会。

geosite、geoip 与 domainStrategy 的关系

geosite 是域名分类数据,geoip 是 IP 地址段分类数据。访问一个带域名的网址时,V2Ray 最先拿到的通常是域名;是否继续解析目标 IP 并执行 IP 规则,由 domainStrategy 控制。因此,只添加 geoip:cn 并不等于所有国内域名都会稳定直连。

10808
常见本地 SOCKS 端口
10809
常见本地 HTTP 端口
3 层
私网、域名、IP 直连
2 文件
geosite.dat 与 geoip.dat

AsIs 表示按原始域名执行路由,域名规则未命中时不会为了路由判断主动解析 IP。IPIfNonMatch 表示先尝试域名规则,只有未匹配时才解析 IP 并继续检查 IP 规则。IPOnDemand 会在遇到需要 IP 的规则时更早触发解析。国内直连场景通常选择 IPIfNonMatch,兼顾域名分类与 IP 地址段兜底。

策略 匹配行为 适用情况 需要注意
AsIs 优先保留原始域名,不为 IP 路由主动解析 规则主要依赖域名分类 仅有 geoip 规则时可能无法命中域名请求
IPIfNonMatch 域名规则未命中后再解析并检查 IP 国内域名与 IP 双重直连 需要 DNS 能正常返回结果
IPOnDemand 路由判断需要 IP 时立即解析 大量规则依赖目标 IP 可能增加 DNS 查询次数

结论:默认先用 IPIfNonMatch

已经同时配置 geosite:cngeoip:cn 时,IPIfNonMatch 能先使用域名分类,再用解析结果补足未分类域名,比单独依赖其中一套数据更容易排查。

可执行的 routing 配置

下面是一段完整的 routing 对象,可以合并到已有 V2Ray 或 Xray 配置中。它假定 outbounds 中已经存在 directproxy 两个标签。粘贴前先检查原配置是否已有 routing 字段;同一级 JSON 对象不能保留两个同名字段,应替换或合并,不能简单追加。

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

第一条规则保证 192.168.0.0/1610.0.0.0/8 等私网目标保持本地访问。第二条在 DNS 解析之前就能依据域名分类决定直连。第三条处理域名分类没有覆盖但解析地址属于中国大陆地址段的情况。第四条没有指定域名或 IP,因此会接住剩余 TCP 与 UDP 请求。

  1. 先确认原配置中的直连出站标签。常见写法是协议为 freedom,标签为 direct
  2. 确认代理出站标签指向当前节点,示例使用 proxy,实际名称可以不同。
  3. 把 routing 对象放在配置根级,与 inboundsoutboundsdns 平级。
  4. 使用支持 JSON 校验的编辑器检查逗号、方括号和花括号,再重启内核加载配置。
  5. 打开运行日志,分别访问局域网管理地址、国内站点和境外站点,核对实际出站标签。

在 v2rayN 中建立对应规则

v2rayN 可通过图形界面管理路由。进入「设置」→「路由设置」,新建一个规则集并设为启用。不同版本的界面文字可能略有差别,但要核对的字段相同:域名策略、规则顺序、出站标签和最终兜底。修改后应重新加载配置或重启核心,仅保存窗口不一定会立即影响当前连接。

顺序 规则内容 出站 目的
1 geoip:private direct 保留局域网与本机服务访问
2 geosite:cn direct 中国大陆域名直接连接
3 geoip:cn direct 中国大陆 IP 地址段直接连接
4 tcp,udp proxy 其余请求进入代理节点

本地代理端口也要与应用设置一致。常见配置使用 SOCKS 端口 10808、HTTP 端口 10809,但这两个数字不是强制标准。应进入「设置」→「参数设置」查看当前本地监听端口,再检查浏览器、下载工具或系统代理是否引用了相同端口。端口不一致时,请求根本不会进入 V2Ray,路由规则自然不会生效。

结论:先证明请求进入内核

排查分流前先在日志中找到目标域名或目标 IP。日志完全没有请求记录时,优先检查系统代理、TUN 状态和 10808/10809 端口,不要先改 geosite 规则。

DNS 决定 geoip 规则能否接上

domainStrategy 使用 IPIfNonMatch 时,域名规则未命中后需要 DNS 返回地址,随后才能执行 geoip:cn。如果 DNS 查询失败、被应用自行加密处理,或浏览器没有把域名交给代理,DNS 与路由看到的目标可能不同。典型现象是同一站点有时直连、有时代理,或者日志里只有 IP 而没有域名。

最容易维护的思路是让国内域名使用可直接访问的 DNS,其余查询通过受控路径完成,同时避免系统 DNS、浏览器独立 DNS 与核心 DNS 多套策略互相覆盖。V2Ray 的 dns 字段负责解析,routing 负责选择连接方向;两者相关,但不是同一个功能。

明明写了 geosite:cn,国内网站还是走代理?

先检查兜底代理规则是否排在最前面,再确认 geosite.dat 能被核心读取。打开路由日志查看命中规则,不要只凭出口地址判断。

访问域名走代理,直接输入 IP 却能直连?

这通常说明 geoip:cn 生效而域名规则没有命中。确认配置中写的是 geosite:cn,并检查域名是否使用了未被当前数据分类的 CDN 地址。

开启分流后局域网管理页打不开?

geoip:private 放到第一条并指向 direct,同时检查 TUN 或系统代理是否设置了局域网绕过。测试时直接访问路由器实际地址。

日志显示 DNS 超时该先改哪一项?

先用系统命令确认当前 DNS 可达,再检查核心 DNS 配置和出站路径。不要同时更换节点、规则、DNS 三项,否则无法确定是哪一步恢复。

订阅更新后自定义路由消失?

把规则保存到 v2rayN 的「设置」→「路由设置」中并启用对应规则集。Android 客户端使用完整自定义配置时,更新订阅前应确认当前运行配置来源。

如果应用直接发送 IP,V2Ray 无法从连接本身还原原始域名,此时只会执行 IP、端口和网络类型规则。反过来,如果请求携带域名且 geosite:cn 已经命中,就不会继续解析 IP 做第二次路由判断。这正是规则顺序和 domainStrategy 必须一起理解的原因。

按日志逐层排查分流结果

排错时不要从大规模改规则开始。先选三个固定目标:一个局域网地址、一个确认属于国内分类的域名、一个需要代理访问的域名。每次只改一个变量,重新建立连接并记录日志中的目标、命中规则和出站标签。这样可以区分入口问题、分类问题、DNS 问题与节点问题。

  1. 确认入口: 日志中必须出现测试请求。没有记录时检查系统代理、应用代理或 TUN 接管状态。
  2. 确认目标: 看日志记录的是域名还是 IP。只有 IP 时,geosite 无法参与这次匹配。
  3. 确认顺序: 检查是否有更宽泛的规则提前命中,尤其是位于顶部的全局代理规则。
  4. 确认数据: 核对 geosite.datgeoip.dat 是否存在于核心能够读取的位置,并在更新后重启核心。
  5. 确认标签: routing 的 outboundTag 必须与 outbounds 中的 tag 逐字一致。
  6. 确认 DNS: 使用 IPIfNonMatch 时,域名未命中后必须能成功解析,否则无法继续执行 IP 分类。
  7. 确认连接重建: 关闭测试页面或应用连接后重新发起请求,避免旧连接复用干扰结果。

在 Android 上使用 v2rayNG 或 v2flyNG 时,订阅节点通常由客户端生成运行配置。若只是验证节点是否可用,先保持默认路由;需要长期应用自定义分流时,应确认客户端当前使用的是订阅生成配置还是导入的完整配置。v2rayNG 使用 Xray 内核,v2flyNG 使用 v2fly 内核,两者都应以实际运行日志和内核支持的数据格式为准。

测试 1: 192.168.1.1
预期结果: 命中 geoip:private → direct

测试 2: 国内站点域名
预期结果: 命中 geosite:cn → direct

测试 3: 未命中国内分类的域名
预期结果: 继续检查解析 IP,最终进入 proxy 或 geoip:cn

测试 4: UDP 应用请求
预期结果: 未命中直连规则时由 tcp,udp 兜底 → proxy

配置完成后的判断标准不是所有网站都能打开,而是每类请求都进入预期出站。国内站点打不开但日志已命中 direct,应继续检查本地网络和 DNS;境外站点已命中 proxy 但连接失败,应检查节点、传输参数和远端可达性。把路由判断与连接质量分开处理,能避免在正确的规则上反复修改。

特例规则应该放在哪里

实际使用中可能遇到某个国内域名必须经过代理,或某个未分类域名必须直连。此时应添加范围尽量小的特例,并放在通用分类规则之前。域名精确匹配可使用 full:,指定某一域名及其子域名可使用 domain:;不要为了一个站点扩大到整个顶级域名。

{
  "type": "field",
  "domain": [
    "full:service.example.net"
  ],
  "outboundTag": "proxy"
}

上面的结构用于说明精确域名规则的位置和写法,实际配置时应替换为需要处理的真实域名。若该特例放在 geosite:cn 后面,而目标已被国内分类命中,特例就没有机会执行。需要强制直连的域名同理,应放在最终代理兜底之前。

不要把短期 DNS 故障、节点不可用或站点自身故障直接固化成永久路由规则。先通过日志确认请求确实选错出站,再添加特例。经过这种验证的配置更短,更新 geosite 与 geoip 数据后也更容易判断哪些手工规则已经可以删除。

下载 V2Ray 客户端 Windows、macOS、Android、Linux