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

系统梳理路由规则三类匹配对象的语法差异,结合真实规则示例讲解匹配顺序与优先级,帮助按需写出直连、代理、拦截三向分流规则。

本文速览

本文适合已经能正常使用 v2rayN、v2rayNG 或 v2flyNG,希望进一步控制哪些请求直连、代理或拦截的用户。重点说明 domain、ip、geosite 的匹配边界、从上到下的优先级以及多条件组合方式,并给出可直接核对结构的 Xray 路由示例。

先理解路由规则处理什么

三个判断维度

操作要点

V2Ray 与 Xray 的路由模块不负责建立节点连接,它处理的是连接进入核心之后应该交给哪个出站。常见出站标签是 proxydirectblock,分别对应代理、直连和拦截。标签名称不是协议关键字,而是配置中已经定义的 outboundTag;如果客户端生成的标签不同,规则也要使用客户端实际生成的名称。

操作要点

一次请求可能同时带有域名、目标端口、来源入口和解析后的 IP。规则数组按顺序检查,通常由第一条完整匹配的规则决定出站。因此,“更具体的规则放前面、范围更大的规则放后面”是最重要的排序原则。把覆盖面很大的 geosite:cngeoip:cn 放在前面,可能会让后面的单域名代理规则永远没有机会生效。

操作要点

同一字段中的多个值是“任一匹配即可”,不同字段之间则是“必须同时满足”。例如一条规则同时写入 domain 与 port,表示域名条件和端口条件都成立才命中;domain 数组里写三个域名,则命中其中任意一个即可。这一差异经常导致规则看起来正确,实际却没有覆盖预期请求。

匹配对象 典型写法 适合场景 关键限制
域名 domain:example.com 网站、接口、下载域名分流 应用必须向核心提供域名,或允许核心进行解析
IP 192.0.2.0/24 固定网段、局域网与解析结果分流 域名请求是否转为 IP 匹配受 domainStrategy 影响
geosite geosite:category-ads-all 按维护好的域名分类批量匹配 依赖客户端当前使用的地理数据文件及分类标签
geoip geoip:private 私有地址或国家、地区 IP 段 只匹配目标 IP,不等同于 geosite 域名分类

domain 的五种常用写法

匹配边界

操作要点

domain: 是最适合日常维护的域名写法。domain:example.com 会匹配 example.com 及其子域名,例如 api.example.com,但不会把 notexample.com 当作同一域名后缀。希望覆盖某个站点及其所有服务子域名时,优先使用这种形式。

操作要点

full: 只做完整域名匹配。full:api.example.com 可以命中该主机名,但不会命中 www.example.comv2.api.example.com。它适合把某个接口单独送入代理,同时让同一主域名下的其他服务继续遵循通用规则。

操作要点

不带前缀的纯字符串属于子串匹配。例如 example 可能匹配域名中任何包含该文本的位置,范围通常比预期更大。regexp: 支持正则表达式,灵活度最高,但规则数量多时不易排查,也更容易因边界书写不严谨而误匹配。能用 domain:full: 表达时,没有必要先上正则。

domain 后缀匹配

推荐

操作要点

同时覆盖主域名与全部下级子域名,语义清楚,适合多数网站规则。

适合:整站代理、整站直连

full 完整匹配

操作要点

只处理一个确定主机名,不扩大到同一主域名下的其他服务。

适合:单接口、单下载域名

regexp 正则匹配

操作要点

可以描述复杂命名规律,但需要自行处理点号转义与首尾边界。

适合:大量规律性子域名

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

操作要点

上例三个 domain 条目是“或”关系。请求只要命中其中一个,就会继续确认该规则的其他字段;因为示例没有额外字段,所以可直接进入 proxy 出站。正则中的点号必须转义,而 JSON 字符串本身还要再保留反斜杠,因此配置文本中会看到 \\.

ip、CIDR 与 domainStrategy 的联动

地址规则

操作要点

IP 规则既可以写单个地址,也可以写 CIDR 网段。IPv4 单地址可写为 192.0.2.10,网段可写为 192.0.2.0/24;IPv6 可写为 2001:db8::/32。CIDR 后面的数字表示网络前缀长度,/24 覆盖 256 个 IPv4 地址,不能把它理解成端口或地址数量。

操作要点

geoip:private 常用于直连私有地址,可以覆盖典型局域网地址段。实际配置还应保留对回环地址与本地服务的处理,避免访问路由器管理页、NAS 或运行在 127.0.0.1 的程序时被送入远端代理。v2rayN 常见本地 SOCKS 监听端口为 10808,HTTP 端口可能由同一混合入口或相邻端口提供,具体值应以「设置」→「参数设置」中的本地监听配置为准。

  • AsIs:优先按请求携带的域名进行匹配,不为了尝试 IP 规则而主动解析域名。
  • IPIfNonMatch:先检查域名规则;域名规则没有结果时,再解析目标域名并尝试 IP 规则。
  • IPOnDemand:检查到可能需要目标 IP 的规则时就可以触发解析,适合明确依赖 IP 分流的配置,但会更早引入 DNS 结果。
  • 直接 IP 请求:应用本身连接的是 IP 时,不需要把域名转为地址,IP 与 geoip 规则可以直接参与匹配。
{
  "domainStrategy": "IPIfNonMatch",
  "rules": [
    {
      "type": "field",
      "ip": [
        "geoip:private",
        "127.0.0.0/8",
        "192.0.2.0/24"
      ],
      "outboundTag": "direct"
    }
  ]
}

结论:域名例外先于 IP 大类

如果某个域名必须代理,而它可能解析到会被直连规则覆盖的地址段,应把该域名的代理规则放到对应 IP 直连规则之前,并用日志确认请求最初携带的是域名还是 IP。

geosite 分类怎么用

分类与例外

操作要点

geosite 是按域名集合组织的数据分类,不是实时查询服务。geosite:cn 表示数据文件中归入相应分类的域名,geosite:category-ads-all 通常用于广告域名集合。分类内容会随客户端附带的数据版本变化,因此 geosite 适合承担大范围基础分流,自定义的关键域名例外仍应单独写在前面。

操作要点

geosite 与 geoip 不能互换。一个域名属于某个 geosite 分类,不代表它当前解析出的 IP 一定属于同名 geoip 分类;使用内容分发网络时,同一域名还可能在不同网络环境中得到不同地址。先用 geosite 处理域名语义,再用 geoip 为未命中的连接兜底,通常比只看 IP 更容易维护。

操作要点

拦截分类要特别注意顺序。假设某个业务接口被收录进广告分类,但该接口又是页面正常加载所必需,那么通用拦截规则会把它一起挡掉。解决方式不是删除全部广告分类,而是在拦截规则之前增加一条 full:domain: 例外,并将其指向 directproxy

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

匹配优先级与规则编辑步骤

排序原则

操作要点

规则优先级不是由 domain、ip 或 geosite 的类型自动决定,而是主要由规则在数组中的位置决定。核心从第一条开始检查,命中后不再让后面的规则覆盖结果。因此,单域名例外应排在分类规则前,分类规则应排在最终兜底前,拦截规则也不能无条件压在业务例外之上。

操作要点

v2rayN 7.x 的界面文字可能随小版本调整,但检查顺序可以保持一致:先确定正在使用的核心,再打开路由设置,最后核对启用的路由方案和规则顺序。修改后应重启核心或重新载入配置,不能只保存窗口而继续使用旧的运行配置。

  1. 确认核心

    打开「设置」→「参数设置」→「Core 类型」,确认当前配置使用 Xray 或 v2fly 对应核心;协议与路由字段必须由所选核心支持。

  2. 打开路由

    进入「设置」→「路由设置」,选择当前启用的路由配置。若界面存在多个方案,先确认主界面实际选中的方案名称。

  3. 添加例外

    先添加必须代理或必须直连的 full:domain: 规则,再添加 geosite、geoip 等范围较大的分类规则。

  4. 核对出站

    检查规则目标是代理、直连还是拦截。编辑原始配置时,还要确认 outboundTag 与现有出站标签逐字一致。

  5. 重载验证

    保存后重启核心,分别测试一个命中例外的域名、一个命中分类的域名和一个局域网地址,并查看核心日志中的实际路由结果。

结论:按范围从小到大排序

完整域名、域名后缀、geosite 分类、geoip 网段、最终兜底依次展开,可以减少大范围规则提前截走请求的问题;真正的业务例外始终放在所属大类之前。

直连、代理、拦截三向规则示例

操作要点

下面是一组用于理解结构的完整路由片段。它先让指定 API 走代理,再拦截广告分类,然后让局域网与指定域名直连,最后让未被前述规则处理的连接走代理。使用前需要确认配置中已经存在名为 proxydirectblock 的三个出站。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": [
          "full:api.example.com",
          "domain:services.example.net"
        ],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": [
          "geosite:category-ads-all"
        ],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "domain": [
          "domain:printer.example.lan",
          "geosite:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:private",
          "127.0.0.0/8"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

操作要点

最后一条规则只限定 network,覆盖 TCP 与 UDP,因此承担兜底作用。它必须位于数组末尾;如果放在第一条,几乎所有常见连接都会立刻进入代理,后面的直连和拦截规则不会被检查。若只希望代理 TCP,不要把 UDP 一并写入兜底,否则 DNS 或实时通信流量也可能改变出站。

操作要点

端口条件同样可以与域名组合。例如 domain 指定 domain:example.com,port 指定 443,则只有访问该域名的 443 端口时才命中。访问同一域名的 80 端口会继续检查后续规则。端口范围可写成核心支持的范围格式,但日常配置应尽量限制在明确业务端口,避免难以解释的宽范围覆盖。

  • 测试代理例外:访问明确写入第一条规则的域名,确认日志显示 proxy
  • 测试拦截规则:选择确定属于当前 geosite 分类的域名,确认连接被送入 block
  • 测试局域网直连:访问路由器或局域网服务地址,确认命中 geoip:private 或明确 CIDR。
  • 测试最终兜底:选择不属于任何前置分类的目标,确认最后一条规则承担出站。

规则不生效时逐项排查

先确认运行状态

操作要点

排查的核心是确认“核心实际收到什么目标”以及“哪条规则先命中”。浏览器访问域名时,核心可能收到域名,也可能只看到由上游应用解析后的 IP;透明入口、系统代理和应用内代理产生的信息并不完全相同。不要只凭浏览器地址栏判断核心一定拿到了域名。

操作要点

其次检查客户端是否重新生成并载入了配置。v2rayN 修改路由方案后,如果当前选择的并不是刚编辑的方案,保存内容不会改变实际流量。v2rayNG 或 v2flyNG 使用订阅配置时,也要区分订阅更新与本地路由修改,避免更新订阅后覆盖此前调整。

单独写了域名,为什么还是直连?

把该域名规则移动到 geosite:cngeoip:cn 之前,并确认它的 outboundTag 指向代理。随后重启核心,用日志检查是否先命中了更靠前的直连规则。

geosite 标签一加就启动失败?

查看核心错误日志中的具体标签名,确认当前数据文件包含该分类。先用常见分类做最小测试,不要同时加入多个来源不明的标签;标签不存在时应改用明确的 domain: 规则。

域名规则能命中,IP 规则不命中?

检查 domainStrategy。需要在域名规则未命中后继续解析并尝试 IP 规则时,可使用 IPIfNonMatch;改动后同时核对 DNS 是否能够返回预期地址。

局域网管理页被送进代理了?

在最终代理兜底之前加入 geoip:private 与所需局域网 CIDR 的直连规则。若访问使用自定义局域网域名,再补充对应的 full:domain: 直连项。

规则保存后结果完全没变化?

确认主界面启用的是刚编辑的路由方案,然后重启核心。再检查「设置」→「参数设置」→「Core 类型」,避免把只适用于另一核心或另一数据集的配置当作当前运行配置。

操作要点

维护规则时,建议一次只调整一个目标:先解决明确域名的出站,再扩展到 geosite 分类,最后处理 IP 与 geoip 兜底。每次修改都保留一个代理、一个直连和一个拦截测试目标。这样即使订阅、核心或地理数据更新,也能快速定位变化发生在哪一层。

获取图形客户端 按平台选择 v2rayN 或 v2rayNG