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

讲清 domain、full、regexp、geosite、geoip 等匹配前缀的写法与差异,以及规则自上而下的命中顺序和常见冲突的改法。

本文速览

适合已经导入订阅、准备在 v2rayN 中调整分流的用户。先区分域名匹配与 IP 匹配,再理解首条命中、解析策略和出站标签。文中的 JSON 是核心配置片段,不是可直接启动的完整配置;按示例检查生成结果,可以定位“规则写了却没生效”和“例外被大规则覆盖”两类常见问题。

1. 路由规则:决定请求从哪个出站离开

订阅提供节点连接参数,路由决定哪些请求使用这些节点。VMess、VLESS 等协议属于节点连接方式,不是路由匹配前缀。把节点改成 VLESS,并不会自动改变某个网站的直连或代理选择。

请求进入核心 提取目标信息 按序匹配规则 选择出站标签 建立目标连接

在 V2Ray、Xray 的常见路由结构中,routing.rules 是有序数组。每条规则读取目标域名、目标 IP、端口或入站标签等条件,命中后用 outboundTag 指向已定义的出站。标签只是配置中的名称,proxy、direct 并不是自动存在的内置出口。

2. domain、full、regexp:按匹配范围选前缀

domain 既是规则中的字段名,也可能是字段值里的匹配前缀。下面表格中的字符串都放在 "domain": [...] 数组内。不要把网址的协议头、路径或查询参数写进去,路由域名匹配不是浏览器地址栏匹配。

写法匹配范围典型边界
full:example.com仅完整域名命中 example.com,不命中 www.example.com
domain:example.com根域名及其子域名命中 example.com、a.example.com,不命中 notexample.com
example.com普通字符串包含匹配范围比域名边界匹配宽,可能匹配 notexample.com
regexp:^api[0-9]+[.]example[.]com$正则表达式匹配命中 api1.example.com,不命中 api.example.com
geosite:cn数据文件中的域名集合取决于本地数据文件是否提供 cn 标签及其具体内容

只让一个主机走代理,用 full:。希望整个站点及其子域名统一处理,用 domain:。普通裸字符串适合明确需要包含匹配的场景,不宜当作精确域名的简写。也不要写成 domain:*.example.com:这里不是通配符语法。

{
  "type": "field",
  "domain": [
    "full:login.example.com",
    "domain:example.net",
    "regexp:^api[0-9]+[.]example[.]com$"
  ],
  "outboundTag": "proxy"
}

上面的三个数组项是“或”关系,满足其中任意一个域名条件即可。正则用 [.] 表示字面量点,避免 JSON 反斜杠转义带来的混淆。如果改用正则的 \.,在 JSON 字符串里必须写成 \\.。开头的 ^ 和结尾的 $ 用来限定完整匹配范围。

3. ip、geoip、geosite:地址集合与域名集合分开写

ip 字段接收 IP 地址、CIDR 网段或 geoip: 集合;domain 字段接收域名匹配项及 geosite: 集合。两种集合不能互换。geoip:cn 表示地址归属集合,不代表所有中文网站;geosite:cn 是域名清单,也不保证这些域名始终解析到同一地区的地址。

{
  "type": "field",
  "ip": [
    "192.168.0.0/16",
    "10.0.0.0/8",
    "geoip:private"
  ],
  "outboundTag": "direct"
}

这个片段演示私网目标直连。前两个网段与 geoip:private 可能重叠,实际配置通常选择明确网段或集合即可。若需要同时按国内域名和国内地址直连,建议拆成两条规则:一条写 domain,另一条写 ip。不要把两个字段塞进一条规则,却期待它们是“或”关系。

4. 首条命中:例外在前,宽泛规则在后

规则按数组顺序检查,首条命中后就确定路由。更精确的规则不会因为“更具体”自动获得更高优先级。若先写 domain:example.com 直连,再写 full:api.example.com 代理,后者会被前者覆盖。

{
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "domain": ["full:api.example.com"],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": ["domain:example.com"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

这段配置先保留单个主机的代理例外,再处理整个域名的直连,最后让剩余 TCP、UDP 请求走代理。它只展示 routing,需要已有名为 proxy 和 direct 的出站才能使用。若核心没有任何规则命中,常见行为是使用第一个出站;不要凭标签名称猜默认路径。

  1. 列出明确例外。例如登录接口、内部服务,或者必须使用固定出口的域名。
  2. 放入集合规则。再加入经确认的 geosite、geoip 分类。
  3. 确定兜底行为。核对最后的通用规则或第一出站,避免遗漏请求意外直连。
  4. 检查生成顺序。客户端可能同时生成预置规则与自定义规则,界面列表不一定就是最终完整数组。

端口条件同样会改变命中范围。例如在域名规则中加入 "port": "443",只会处理目标端口为 443 的请求,同域名的 80 端口连接不会命中。若目标是整个站点统一走代理,不要无意加入端口限制。

5. domainStrategy:何时把域名解析为 IP

域名规则写对了,IP 规则仍可能不命中,原因常在解析时机。routing.domainStrategy 控制路由匹配过程中是否把域名解析成地址,不负责承诺 DNS 查询一定通过代理。核心 DNS、出站解析和客户端 DNS 设置还需要分别核对。

AsIs:先按已有目标匹配

配置字段
routing.domainStrategy
配置值
AsIs
域名请求
不为路由匹配主动解析 IP
IP 请求
仍可匹配 ip 条件

适合主要依赖域名规则、希望减少路由阶段解析的方案。

IPIfNonMatch:未匹配时再解析

配置字段
routing.domainStrategy
配置值
IPIfNonMatch
触发条件
域名目标未命中现有规则
后续动作
解析后重新尝试匹配

前面若已有通用兜底命中,就不会进入未匹配后的解析流程。

另一个常见值是 IPOnDemand:匹配过程中遇到需要 IP 的规则时,可触发目标域名解析。因此,把 IP 规则放得很靠前,可能提前引入 DNS 请求。选择策略时先确定“域名分类优先”还是“地址分类优先”,再调整顺序,不要把策略切换当成万能修复。

6. v2rayN 验证:看生成配置,再看连接日志

先备份当前路由方案,再打开 v2rayN 的路由设置编辑规则。不同桌面界面的入口名称可能不同;应以当前版本可见的“路由设置”及规则编辑界面为准。本文 JSON 展示的是 V2Ray/Xray 核心字段,不应原样粘贴到只接收域名列表的输入框。

443
常见 HTTPS 目标端口
53
传统 DNS 常用端口
1–65535
规则可指定的端口范围

这些数字是端口含义,不是测速结果。端口 443 也不等于“所有网页流量”,端口 53 更不涵盖所有加密 DNS。按端口分流时,必须同时考虑实际传输方式,不能仅凭端口推断应用用途。

  1. 检查输入格式。JSON 使用英文双引号,不带注释和末尾逗号;核心字段名保持原样。
  2. 核对运行核心。确认当前选择的是预期核心,以及客户端最终生成的规则语法。不要把其他配置格式的字段混入。
  3. 核对标签与资源。检查 outboundTag 是否存在,集合标签是否可加载;先解决核心启动错误,再测试分流。
  4. 重新建立连接。保存并应用路由后,关闭测试应用的旧连接,再发起新请求。已有长连接不会因为列表变化而自动换出口。
  5. 对照访问日志。在可用的日志详情中检查目标域名或 IP、目标端口、入站与出站标签。必要时临时提高日志级别,测试结束后恢复。

做域名规则验证时,至少准备三组输入:精确例外 api.example.com、同域其他主机 www.example.com、不属于该域的目标。前两项用于区分 full: 与 domain:,第三项确认兜底。示例域名仅用于展示边界;连接测试请换成自己有权限使用且确实提供服务的域名。

7. 常见问题:从覆盖、地址输入和集合错误查起

单独写了代理规则,为什么还是直连?

先看它前面是否有范围更大的直连规则。把精确例外移到大集合之前,应用后重新建立连接,再从日志核对出站标签。若生成配置顺序与界面不同,还需检查预置规则是否先行命中。

写了 domain 规则,日志里却只有 IP,怎么办?

先确认应用是否已经在本地完成解析,以及入站是否传递域名。再检查当前核心的嗅探设置;嗅探只能从支持的流量中提取信息,不能保证所有连接都能恢复域名。已知固定内网目标可以改用明确 IP 或网段规则。

加入 geosite 后核心启动失败,应该改哪里?

先读日志中的资源文件路径和标签名称。确认当前数据文件包含所用标签,必要时通过客户端提供的资源更新入口更新。可暂时用一条 full: 规则验证基础路由,再恢复集合,避免同时修改多个变量。

切换节点后规则失效,是协议不支持分流吗?

通常应先查生成配置,而不是归因于 VMess 或 VLESS。确认切换后规则仍引用正确的代理出站,当前路由方案仍被选中,也没有切到另一份自定义配置。节点连接失败和路由选错出口是两类问题,应分别看日志。

稳定的调整顺序是:先用单个精确域名验证出口,再扩大到子域名或集合,最后添加 IP 补充与兜底。每次只改变一类条件,并保留可回退的路由方案。更多基础概念可查看概念速查,需要继续排查 DNS 与分流联动时可查看配置进阶。

客户端下载安装到这里