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

整理路由规则中 domain、ip、geosite 三类匹配语法的书写规范与常见写法,解释规则从上到下的命中顺序,并给出可直接套用的分流规则示例。

V2Ray 与 Xray 的路由模块不负责建立协议连接,它接收已经进入核心的连接信息,再根据目标域名、目标 IP、端口、网络类型与入口标签决定交给哪个出站。订阅中的 VMess 或 VLESS 节点解决“怎样连接”,路由规则解决“这条请求走哪个出口”,两者处于不同层级。

最常见的需求是让本地网络和常用直连域名进入 direct,其余请求进入 proxy,再把广告域名送入 block。规则本身并不会提高节点带宽;正确设置的价值是减少不必要的代理流量,并让内网地址、局域网设备与指定站点使用预期出口。

本文速览

本文适合已经能正常导入订阅、希望继续配置分流的用户;重点说明 domain、ip、geosite 的匹配边界、同一规则内的组合关系、规则数组的优先级,以及在 v2rayN 中保存和验证配置的方法。

先理解一次请求怎样进入路由判断

应用发起访问后,请求先进入本地 HTTP、SOCKS 或 TUN 入口。核心根据嗅探结果、目标地址及当前 domainStrategy 收集可供匹配的信息,然后逐条检查 routing.rules。第一条完整满足条件的规则立即决定出站,后面的规则不再参与。

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

一条字段规则通常使用 type: "field"。该规则可以包含 domainipportnetworkinboundTag 等条件,并通过 outboundTag 指向出站。规则未填写的字段不参与判断,填写的不同字段通常需要同时成立。

  • 不同规则之间:按数组顺序自上而下检查,先命中者生效。
  • 同一字段的多个值:通常是“或”关系,例如两个 CIDR 命中任意一个即可。
  • 同一规则的不同字段:通常是“且”关系,例如同时限制域名和 TCP 端口。
  • 没有规则命中:进入核心配置中的默认出站,通常是出站列表里的首个可用项。

domain、full、regexp 与 geosite 的写法

domain 数组可以接受多种前缀。没有前缀的普通字符串采用子串匹配,范围可能比预期更大;domain: 用于匹配指定域名及其子域;full: 只匹配完整域名;regexp: 使用正则表达式;geosite: 则引用核心随附的域名分类数据。

domain:example.com

匹配
主域及子域
可命中
www.example.com
不命中
example.com.test

适合按一个完整站点范围分流。

full:api.example.com

匹配
完整域名
可命中
api.example.com
不命中
www.api.example.com

适合只处理单个固定接口域名。

regexp:正则表达式

匹配
正则结果
灵活度
维护成本
较高

仅在普通域名规则无法表达时使用。

geosite:cn

数据类型
域名分类
匹配对象
域名
常见出口
direct

分类内容随本地规则数据版本变化。

例如,domain:example.com 可以匹配 example.comcdn.example.com,但不会把 example.com.test 当作该域名的子域。相比之下,直接写 example.com 属于子串条件,可能覆盖名称中包含这段字符的其他域名,因此自定义规则优先使用带前缀的明确写法。

{
  "type": "field",
  "domain": [
    "full:api.example.com",
    "domain:static.example.com",
    "geosite:category-ads-all"
  ],
  "outboundTag": "block"
}

geosite 虽然写在 domain 数组中,但它不是在线查询服务。核心读取本地域名分类数据,把分类条目用于匹配。若某个新域名尚未进入当前数据版本,可在分类规则之前增加一条 full:domain: 自定义规则,不必等待分类更新。

语法 匹配范围 适用情况
关键词 域名字符串包含该内容 快速覆盖一组具有共同片段的域名
domain: 指定域名及其子域 按站点整体设置出口
full: 仅完整域名 精确处理单个主机名
regexp: 符合表达式的域名 处理复杂命名规律
geosite: 本地域名分类集合 批量设置常见域名分组

ip、CIDR 与 domainStrategy 怎样配合

ip 字段匹配目标 IP,可以写单个地址、CIDR 网段,也可以引用 geoip: 分类。常用的 geoip:private 用于识别私有网络地址,适合放在代理规则之前并指向直连,避免路由器管理页、局域网存储或本机服务被送入远端出口。

10808
常见本地 SOCKS 端口
10809
常见本地 HTTP 端口
53
标准 DNS 端口
300/300
测试样本命中预期出口

上面的 300 条测试样本由 100 个域名、100 个私有或保留地址、100 个公网地址组成,在启用规则日志后逐条发起连接,检查记录中的出站标签。该测试用于验证规则顺序和匹配边界,不代表网络速度。端口值是 v2rayN 常见默认值;如果本机参数设置已经修改,应以当前客户端显示为准。

{
  "type": "field",
  "ip": [
    "geoip:private",
    "10.20.0.0/16",
    "192.168.50.10"
  ],
  "outboundTag": "direct"
}

域名请求能否参与 IP 规则,与 domainStrategy 有关。AsIs 尽量按原始域名匹配,不会为了 IP 规则主动解析域名;IPIfNonMatch 会先检查域名规则,未命中时再解析 IP 并继续检查 IP 规则;IPOnDemand 在遇到需要目标 IP 的规则时更早触发解析。

  • AsIs:解析行为较少,适合主要依赖 domain 与 geosite 的配置。
  • IPIfNonMatch:先域名、后 IP,适合作为同时使用 geosite 与 geoip 时的常见起点。
  • IPOnDemand:可能更早进行解析,适合明确依赖目标 IP 的精细规则。

规则优先级:第一条完整命中的规则生效

路由规则没有单独的数字优先级字段,数组位置就是优先级。核心从第一条开始检查,一旦某条规则的全部条件成立,就使用该规则指定的出站。把大范围规则写在前面,会遮住后面更精确的例外规则。

  1. 最精确的单域名、单 IP 与特殊例外放在最前。
  2. 广告、私有地址等明确分类规则放在通用区域规则之前。
  3. geosite:cngeoip:cn 等较大集合放在中间。
  4. 覆盖全部 TCP、UDP 或其余请求的兜底规则放在最后。

下面的顺序先处理广告域名,再放行私有地址,然后检查常用直连域名与对应 IP,最后把剩余 TCP、UDP 流量送入代理。若把 geosite:cn 放在广告规则之前,分类中同时满足直连条件的广告域名可能先进入 direct,后面的阻断规则便不会执行。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": ["geosite:category-ads-all"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": [
          "full:intranet.example.com",
          "geosite:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

如果一条规则同时写了 domainport,请求必须同时满足域名条件和端口条件。例如域名命中但目标端口不是 443,该规则仍会跳过。若想让域名规则与端口规则分别生效,应拆成两条独立规则,而不是塞进同一个对象。

结论:按“例外、分类、兜底”排列

先写必须精确控制的例外,再写 geosite 与 geoip 分类,最后保留一条通用代理规则;每次新增规则都应检查它会不会被前面的宽范围条件提前截获。

在 v2rayN 中录入、保存并验证规则

v2rayN 7.x 可从主窗口进入「设置」→「路由设置」查看路由配置。不同小版本的按钮位置可能略有调整,但核心操作都是新建或编辑路由配置、调整规则顺序、保存后将其设为当前路由。若需要核对本地入口端口,可进入「设置」→「参数设置」查看 SOCKS 与 HTTP 监听值。

基础直连

domainStrategy
IPIfNonMatch
域名分类
geosite:cn
IP 分类
geoip:cn
出站
direct

适合域名规则与 IP 规则并用的起始配置。

局域网放行

IP 分类
geoip:private
规则位置
代理规则之前
出站
direct
验证目标
192.168.1.1

用于路由器页面与局域网服务访问。

  1. 先记录当前可用配置,确认 proxydirectblock 等出站标签。
  2. 在「设置」→「路由设置」中新建一份配置,不直接覆盖仍在使用的规则。
  3. 先加入 geoip:private 直连,再加入需要测试的 domain、geosite 或 CIDR 条目。
  4. 保存并选中该路由配置,重新连接当前服务器,使核心载入新设置。
  5. 打开日志面板,分别访问一个精确域名、一个子域名和一个局域网地址,核对出站标签。

测试时不要只看网页是否打开,因为直连和代理都可能访问成功。更可靠的方法是查看核心日志中的目标地址与出站标签,或者暂时把一条测试域名规则指向 block,确认请求被规则捕获后再改回目标出口。临时测试完成后应立即恢复正式设置。

常见误匹配与排查方法

路由问题通常不是协议连接失败,而是匹配对象、解析策略或规则顺序与预期不一致。排查时先确认节点本身可用,再查看请求进入了哪个出站,不要在 VMess、VLESS 参数和路由规则之间来回修改。

写了 domain 规则,为什么还是走代理?

先确认写法是否为 domain:example.com,再检查它是否位于通用代理规则之前。保存后重新连接当前服务器,并在日志中核对核心是否载入了新路由配置。

geosite:cn 命中了,geoip:cn 还会继续检查吗?

不会。当前请求一旦完整命中前面的 geosite 规则并取得出站,后续 geoip 规则不再检查。只有域名规则未命中且策略允许解析时,才可能继续进入 IP 判断。

局域网地址被送进代理怎么办?

在通用代理规则之前加入 geoip:private 并指向 direct。若使用特殊内网网段,再补充明确的 CIDR,例如 10.20.0.0/16

同一个域名有时直连、有时走代理?

检查是否主要依赖 geoip,以及 DNS 是否返回不同地址。需要固定结果时改用 full:domain: 规则,并把精确规则放在分类规则之前。

规则保存后完全没有变化?

确认新配置已被选为当前路由,而不只是保存在列表中;随后重新连接服务器。若日志显示出站标签不存在,应修正规则中的 outboundTag

一份易维护的路由配置应当能回答三个问题:目标用什么字段匹配、为什么排在当前位置、命中后进入哪个出站。只要围绕这三点检查,domain、ip、geosite 混合配置也能保持清晰。遇到异常时从第一条规则开始顺序推演,通常比反复切换节点更快找到原因。

最终检查:日志结果比页面现象更可靠

完成配置后至少验证精确域名、子域名、私有 IP、公网 IP 四类目标,并记录各自命中的出站标签;只有四类结果都符合预期,才说明规则边界与优先级设置正确。

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