V2Ray 自定义路由规则写法:domain、ip 与 geosite 匹配优先级详解

拆解 routing 规则里 domain、ip、geosite 三类匹配语法与书写格式,说明规则自上而下的命中顺序与常见冲突场景,并给出可直接套用的分流规则组织思路。

本文速览

本文适合已经能够导入节点、希望进一步控制直连、代理与拦截范围的用户。重点包括域名与 IP 条件的实际匹配方式、geosite 与 geoip 数据集的定位、规则冲突时的处理顺序,以及一份可以按现有出站标签调整的 routing 配置。

先理解 routing 的匹配过程

V2Ray 路由不会改变 VMess、VLESS 等节点协议本身。它处理的是请求进入核心之后应交给哪个 outbound,也就是决定某个连接走代理、直连、拦截出站或其他已经定义的出口。路由结果依赖请求目标、规则顺序和出站标签,节点能够连接并不代表分流规则一定正确。

一次请求通常先由本地 SOCKS、HTTP 或透明代理入口接收,再进入 routing.rules。核心从数组第一条规则开始检查,遇到第一条满足条件的规则便停止继续匹配,并使用该规则的 outboundTag 或 balancerTag。后面的规则即使写得更具体,也不会覆盖已经命中的前置规则。

应用发起请求入口接收连接读取目标信息逐条匹配规则选择对应出站

同一条规则里的多个字段通常是“同时满足”的关系。例如一条规则同时设置 network: "tcp"port: "443",它只匹配 TCP 443 连接;字段内部的数组则是“任意一个匹配即可”,例如 domain 数组包含三个域名条件,命中其中一个就满足该字段。

domain、full、regexp 与 geosite 怎么写

domain 字段接收一个字符串数组,但数组中的字符串可以采用不同匹配语法。普通字符串用于域名子串匹配;domain: 用于匹配指定域名及其子域名;full: 只匹配完整域名;regexp: 使用正则表达式;geosite: 则引用外部域名分类数据。日常分流优先使用 domain、full 和 geosite,只有现有语法无法表达目标范围时才考虑 regexp。

精确与后缀匹配

完整域名
full:api.example.com
域名及子域
domain:example.com
普通字符串
example
正则表达式
regexp:^.+\.example\.com$

已知固定主机名时优先使用 full,覆盖整站及子域时使用 domain。

分类数据匹配

境内常见域名
geosite:cn
广告分类
geosite:category-ads-all
非境内分类
geosite:geolocation-!cn
数据来源
核心加载的数据文件

分类名称能否使用取决于当前核心实际加载的数据文件及其版本。

domain:example.com 可以覆盖 example.com 以及 www.example.com,适合整站策略;full:example.com 不会自动覆盖子域名,适合只处理一个固定主机名。普通字符串的范围更宽,容易意外匹配域名中包含相同字符的其他站点,因此不建议把过短的单词作为规则。

{
  "type": "field",
  "domain": [
    "full:api.example.com",
    "domain:static.example.com",
    "geosite:cn"
  ],
  "outboundTag": "direct"
}

geosite 不是实时联网查询服务,而是核心读取的本地域名分类数据。更新客户端或核心后,分类内容可能随数据文件变化。如果日志提示找不到某个 geosite 分类,应先确认分类名称是否存在,再检查客户端使用的是 V2Ray 还是 Xray 内核,不要通过反复调整规则顺序掩盖数据缺失问题。

ip、CIDR 与 geoip 的匹配条件

ip 字段针对连接目标的 IP 地址进行判断,可以填写单个地址、CIDR 网段或 geoip: 分类。常见写法包括 127.0.0.0/8192.168.0.0/16geoip:privategeoip:cn。CIDR 后缀表示网络前缀长度,写错一位就可能扩大或缩小匹配范围。

10808
常见本地 SOCKS 端口
10809
常见本地 HTTP 端口
53
传统 DNS 服务端口
5 组
推荐的基础规则层级

如果应用直接请求 IP,核心可以立即使用 ip 规则判断;如果应用请求的是域名,是否为路由匹配执行解析取决于 routing.domainStrategy。AsIs 主要保留原始域名进行判断,IPIfNonMatch 会在域名规则没有得到结果时尝试解析并继续进行 IP 匹配,IPOnDemand 则可能在匹配过程需要 IP 条件时触发解析。

写法 匹配范围 典型用途
127.0.0.0/8 本机回环地址段 避免本地服务进入远程代理
192.168.0.0/16 常见局域网地址段 访问路由器、存储设备和内网服务
geoip:private 数据文件定义的私有地址 集中处理多个私有网段
geoip:cn 数据文件归类的境内地址 作为域名分流之外的补充条件

结论:域名规则负责主要分流,IP 规则负责补充

先用 full、domain 和 geosite 表达清晰的业务范围,再用 geoip:private、geoip:cn 或明确 CIDR 处理直接访问 IP 的连接。这样可以减少不必要的 DNS 解析,也更容易从日志判断请求为什么命中某个出站。

使用 IPIfNonMatch 时还要注意解析路径:路由判断得到的 IP 与实际远端连接使用的解析结果应尽量一致。若内置 DNS、系统 DNS 和远端解析采用不同结果,同一域名可能在不同时间落入不同地址分类。遇到分流偶尔变化的问题,应同时检查 dns 配置、domainStrategy 和核心日志中的目标地址。

规则优先级与常见冲突

V2Ray 不会自动判断哪条规则“更具体”。数组靠前就是更高优先级,因此规则组织应遵循“例外在前、范围在后、兜底最后”。例如某个域名需要代理,但它同时属于 geosite:cn,就必须先写该域名的代理规则,再写 geosite 的直连规则。

  1. 先放必须拦截或必须单独处理的精确规则,例如 full: 域名。
  2. 再放局域网和私有地址直连规则,避免本地设备请求进入代理。
  3. 然后放业务域名组、geosite 分类与指定网段规则。
  4. 最后放覆盖范围较大的代理或直连兜底规则。
  5. 修改后用核心日志逐个验证域名、IP、TCP 和 UDP 请求。
{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": [
          "full:service.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"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

上面的第一条规则是 geosite 直连范围中的例外,因此放在最前;第二条先保护局域网访问;第三、第四条分别处理境内域名和地址;最后一条将剩余 TCP、UDP 请求交给 proxy。实际使用前必须确认 outbounds 中确实存在 proxydirect 两个标签,否则核心会因引用不存在的出站而启动失败。

在 v2rayN 中配置与验证路由

v2rayN 的菜单名称可能随版本调整,常见入口是「设置」→「路由设置」。创建自定义规则集后,应先确认当前规则集已被选中,再保存配置并重启当前核心。若使用完整自定义配置文件,则要检查客户端是否会在切换节点或更新订阅时重新生成配置,避免手动修改被覆盖。

检查项目 具体操作 预期结果
本地入口 在「设置」→「参数设置」核对 SOCKS 10808、HTTP 10809 浏览器或测试程序连接到实际启用的端口
出站标签 检查规则中的 proxy、direct 是否对应现有 outbound tag 核心启动日志不出现未知出站标签
规则顺序 分别测试精确域名、geosite 域名、直接 IP 和局域网地址 四类请求命中预期出站
UDP 请求 确认兜底规则包含 udp,并核对节点及入口相关设置 DNS 或其他 UDP 流量不被遗漏

验证时不要只看网页能否打开。应开启核心日志,准备至少六个目标:一个精确代理域名、一个 geosite 直连域名、一个境内 IP、一个局域网 IP、一个应拦截的域名和一个未被前述规则覆盖的域名。逐个请求后记录命中的 outboundTag,能够比对规则序号时也应一并记录。

结论:每次只调整一组条件

先固定 domainStrategy 和出站标签,再移动一条规则或修改一个匹配项。一次同时改变 DNS、geosite 分类和规则顺序,会让日志结果无法对应到单一原因,排查时间反而更长。

高频问题与排查顺序

路由问题通常表现为某个网站走错出口、局域网设备无法访问、规则保存后没有变化,或者核心直接启动失败。排查时应先确认配置是否实际加载,再检查标签和顺序,最后才处理 DNS 解析与分类数据。按这个顺序可以先排除配置未生效等基础问题。

写了 domain 规则,为什么还是命中前面的 geosite?

把精确 domain 或 full 规则移动到 geosite 规则之前,保存后重启核心。规则不会按精确程度自动排序,先命中的 geosite 已经结束了本次匹配。

访问 IP 能分流,访问域名却没有走 geoip?

检查 routing.domainStrategy。使用 AsIs 时,域名请求不会为了所有 IP 规则统一执行解析;需要域名规则未命中后再尝试 IP 判断时,可评估使用 IPIfNonMatch。

添加 geosite 后核心启动报错怎么办?

先删除刚加入的分类并恢复启动,再核对分类名称与当前核心加载的数据文件。分类不存在或数据文件无法读取时,调整规则顺序不能解决错误。

局域网地址为什么被送进代理?

在宽泛代理规则之前加入 geoip:private,或明确加入 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。随后测试路由器和内网服务地址是否命中 direct。

规则看起来正确,保存后仍没有变化?

确认当前启用的是刚编辑的路由配置,然后重启核心并查看生成配置。若切换节点后规则消失,应检查客户端是否重新生成了 routing 段。

一套可维护的分流配置不需要堆积大量重复规则。先保留精确例外、私有地址、主要 geosite 或 geoip 分类以及最终兜底,再根据日志补充确有必要的条目。新增规则时写明用途、目标出站和验证结果,后续更新数据文件或更换核心时就能快速判断哪些规则仍然必要。