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

拆解 domain、full、regexp、ip、geosite、geoip 几类规则的写法,说明规则自上而下的匹配顺序,以及代理、直连、阻断的排布方法。

本文速览

本文适合已经导入节点、准备调整分流的桌面用户。先分清域名规则与 IP 规则,再把具体例外放在通用规则前面,最后用日志验证出口。示例采用 Xray/V2Fly 的路由字段语义;v2rayN 图形界面负责生成配置,不能把完整内核 JSON 直接粘到单个域名输入框。

一、路由规则先看匹配顺序

系统代理决定应用是否把请求交给 v2rayN,路由规则决定内核收到请求后选择哪个出口。两者不是同一个开关。应用若绕过系统代理直接联网,修改域名规则不会影响它;使用 TUN 接管时,还需要检查流量是否确实进入内核。

Xray/V2Fly 的常规路由规则按数组顺序检查,首个满足条件的规则决定出口。不是“越精确越优先”,也不会自动让 full: 压过 domain:。若第一条已将 domain:example.com 送往代理,后面针对 full:files.example.com 的直连例外就不会生效。

排列位置规则意图示例出口
最前面明确的域名例外或阻断目标direct / block
中间业务域名、局域网 IP、地区集合proxy / direct
最后剩余 TCP、UDP 请求的兜底proxy 或按需直连

同一条规则里,domain 数组中的多个条目通常是“或”;ip 数组中的多个条目也通常是“或”。不同条件字段之间则是“且”。例如把域名、目标端口和网络类型写在同一条规则里,表示三个条件都满足才命中,不是满足任意一个就命中。

二、domain、full、regexp 的写法

域名规则写主机名,不写协议、路径和查询参数。访问 https://api.example.com:443/v1/status 时,域名条件应填写 api.example.com。端口 443 是另一个条件,路径 /v1/status 不属于这类路由规则的匹配范围。

写法匹配含义容易误解的地方
domain:example.com匹配根域名及其子域名会匹配 api.example.com,不会匹配 notexample.com
full:api.example.com只匹配这个完整主机名不会匹配 v2.api.example.com
regexp:^api[0-9]+\.example\.com$按正则表达式匹配点号须转义;锚点限制整个域名
example未带类型前缀时按普通字符串包含关系匹配范围比后缀域名匹配更宽,可能误命中

domain: 不是通配符表达式。覆盖整个域名家族时,写 domain:example.com 即可,不要写 domain:*.example.com。只希望一个主机走特定出口时,选 full:;需要匹配有规律的编号主机时,再考虑正则。

{
  "type": "field",
  "domain": [
    "full:files.example.com",
    "regexp:^api[0-9]+\\.example\\.com$"
  ],
  "outboundTag": "direct"
}

上面是内核 JSON 片段,所以反斜杠写成 \\。在 v2rayN 的普通域名文本框中,通常填写单个反斜杠:regexp:^api[0-9]+\.example\.com$。把 JSON 的转义写法原样搬进普通文本框,可能改变正则含义。请先判断输入位置究竟是 JSON 编辑器还是规则字段。

结论:先用 full,再扩大范围

新加业务例外时,先用一个 full: 主机验证出口。确认命中后再改成 domain:,只有确实需要模式匹配时才使用 regexp:,这样更容易定位误分流。

三、ip、CIDR 与 geoip 的边界

IP 条件写在 ip 字段中,常用形式是单个地址、CIDR 网段或 geoip: 集合。这里匹配的是目标 IP。不要把源设备的局域网地址误填成目标规则;按来源分流属于其他条件,不能用目标 IP 字段替代。

32 位
IPv4 地址长度;/32 精确到单个地址
128 位
IPv6 地址长度;/128 精确到单个地址
443
常见 HTTPS 目标端口;不代表固定出口
{
  "type": "field",
  "ip": [
    "192.168.50.0/24",
    "203.0.113.10/32",
    "2001:db8::10/128",
    "geoip:private"
  ],
  "outboundTag": "direct"
}

192.168.50.0/24 覆盖这个 IPv4 子网。203.0.113.10 与 2001:db8::10 是文档示例地址,不是可连接节点。实际配置应换成需要分流的目标网段。局域网直连规则优先使用明确网段,再按需要补充 geoip:private。

geoip:cn 根据加载的 IP 数据集合判断,geoip:private 用于该数据集合定义的私有或本地地址范围。集合内容会随数据文件变化,不宜把某一条集合规则当成永久准确的地域结论。特别是 CDN、跨区服务和新分配网段,可能需要单独添加例外。

四、geosite 数据集与 DNS 策略

geosite:cn 是域名集合,geoip:cn 是 IP 集合,两者不能互换。前者不表示“解析结果一定在国内”,后者也不表示“这个域名属于国内业务”。用域名集合做业务分类,用 IP 集合补充地址分类,才能减少判断混乱。

{
  "type": "field",
  "domain": [
    "geosite:cn"
  ],
  "outboundTag": "direct"
}

传统 Xray/V2Fly 配置引用这些集合时,需要内核能够找到相应的数据文件,常见文件名为 geosite.dat 和 geoip.dat。集合名称以实际加载的数据内容为准。不能仅凭文章中的名字就假定本机存在某个分类;数据缺失或标签不存在,可能导致配置加载失败。

domainStrategy路由解析行为排查重点
AsIs路由阶段不主动为匹配 IP 规则解析域名域名请求没有命中 IP 集合,不一定是规则语法错
IPIfNonMatch域名阶段没有规则命中时,尝试解析并再次匹配过早命中的通用规则可能阻止这次补充匹配
IPOnDemand匹配过程需要目标 IP 时,尝试解析域名检查 DNS 可用性与解析结果是否符合预期

尤其注意 IPIfNonMatch 与兜底规则的关系:如果第一轮检查域名时,最后的 network: tcp,udp 已经命中代理出口,就不会因为前面的 geoip:cn 没匹配而自动重试。若希望依赖 IP 集合分流,需要连同解析策略和默认出口一起设计,不能只追加一条 IP 规则。

五、代理、直连、阻断的配置示例

下面的片段先阻断一个明确主机,再允许文件主机直连,然后让同域名下的其他请求走代理。局域网目标直连,剩余 TCP、UDP 请求走代理。为了让域名目标也能参与 IP 条件判断,示例选择 IPOnDemand;使用前应确认内核 DNS 配置可用。

{
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [
      {
        "type": "field",
        "domain": ["full:telemetry.example.com"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "domain": ["full:files.example.com"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["domain:example.com"],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "ip": ["192.168.50.0/24", "geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

这只是 routing 配置片段,不是完整节点配置。proxy、direct、block 必须与实际 outbounds 中的 tag 对应。标签只是名字,本身不会创建出口:直连通常对应 freedom 出站,阻断通常对应 blackhole 出站,代理出口则使用已有节点。

具体例外优先

推荐

把单个主机和明确网段放在通用分类前面,改动范围容易检查。新增例外只需核对其上方是否存在抢先命中的规则。

适合:已有日常分流,希望补充少量业务例外

代理兜底

未被直连或阻断规则覆盖的请求交给代理。覆盖面清楚,但代理节点必须承担更多请求,内网目标应提前排除。

适合:多数外部业务需要代理,并能维护直连清单

直连兜底

只把明确列出的业务交给代理,其余请求直连。新业务和遗漏域名不会自动走代理,需要持续维护清单。

适合:代理目标少且稳定,其余访问以直连为主

没有任何路由规则命中时,Xray/V2Fly 通常使用出站列表中的第一个出口。不要把这个默认行为当成“必定直连”。v2rayN 生成配置时可能调整出站排列,因此需要核对实际配置,或用符合当前解析策略的明确兜底规则表达意图。

六、在 v2rayN 中添加并验证规则

操作前先备份现有路由。以下以带有「设置」→「路由设置」入口的 v2rayN 桌面界面为例;跨平台界面和经典界面的按钮位置可能不同。应编辑一套路由方案,再在主界面的路由选择入口启用它。只保存规则但没有选择该方案,是常见的“不生效”原因。

  1. 备份方案

    进入「设置」→「路由设置」,先导出或记录当前方案与规则顺序。保留原方案,测试时新建一套,避免一次改坏全部日常分流。

  2. 打开规则

    在「路由设置」中选择要修改的方案,进入方案的规则编辑窗口。新增规则时先选择出口,再在域名字段填写 full:files.example.com,不要粘贴完整 JSON。

  3. 调整顺序

    将明确主机的例外移到 domain:example.com 等宽泛规则之前。域名字段与 IP 字段分别建规则;多条输入按界面提示的分隔方式填写,不自行假定逗号会被拆分。

  4. 启用方案

    保存后回到主界面的路由选择入口,选中刚编辑的方案。确认内核已重新加载;若日志出现配置错误,先恢复备份,不继续叠加新规则。

  5. 检查出口

    把示例域名换成自己有权限测试的真实主机,建立一次新连接,再查看内核日志。若开启了访问日志,核对目标与出站标签;不要仅凭网页能打开判断已经直连。

路由一般在建立连接时确定。浏览器已有的长连接可能继续使用原出口,因此保存规则后,应关闭测试站点的连接或重启测试应用,再重新访问。不要用旧页面刷新一次就判定规则失败。日志若没有这次请求,先检查系统代理、应用代理或 TUN 接管,而不是立即重写正则。

七、自定义路由常见问题

写了 full,为什么还是走代理?

先在「设置」→「路由设置」确认当前启用的方案,再把这条精确规则移到通用域名规则前面。关闭旧连接重新测试,同时核对请求是否实际使用了另一个下载或登录主机名。

geosite:cn 与 geoip:cn 要都写吗?

不必机械地同时添加。需要两类判断时分成两条规则:一条填域名集合,一条填 IP 集合。再确认路由解析策略,否则域名请求可能无法参与 IP 集合匹配。

能不能只让某个 HTTPS 路径直连?

这里介绍的域名规则不能按加密请求中的 URL 路径分流。可按完整主机名分流,或在确有需求时给规则增加目标端口 443;端口条件仍无法区分同一主机下的两个路径。

为什么加了 geosite 后内核启动失败?

先看启动日志是否提示数据文件缺失或集合不存在。使用客户端提供的路由数据更新入口维护数据,再核对当前内核的数据路径。暂时改成一个 full: 规则验证配置,不要随机替换集合名。

订阅更新会改变自定义规则吗?

节点订阅与路由方案属于不同配置,但切换节点、内核或路由预设后,生成配置可能发生变化。更新后检查当前路由方案及出口标签;不要把节点订阅链接粘进域名规则字段。

处理分流问题时,按“请求进入内核 → 目标信息可用 → 首条命中规则 → 对应出口存在”的顺序检查。域名写法负责描述目标,解析策略负责补充 IP,规则顺序负责决定优先级。每次只修改一处,并保留能恢复的方案,比反复切换整套预设更容易定位问题。

下载v2rayN