Xray 路由规则与 domainStrategy 深度解析:进阶分流配置指南

深入理解 Xray routing 的规则匹配顺序,以及 domainStrategy 如何影响域名解析和 IP 规则命中。文章提供实用 JSON 配置示例,讲解 DNS 配合方式、分流验证与常见故障排查,帮助技术用户搭建可控、易维护的代理路由。

Xray 的路由规则不是把“国内直连、国外代理”自动变成网络事实,而是按规则顺序检查连接信息,并将命中的请求交给指定出站。配置分流时,最容易混淆的是域名匹配、IP 匹配和 DNS 查询:它们有关联,却不是同一件事。尤其是 domainStrategy,它决定路由器何时尝试把域名解析成 IP 以便匹配 IP 规则,不负责单独定义 DNS 服务器,也不会替代路由规则本身。

本文速览

本文拆解 Xray 路由的先后顺序、AsIs、IPIfNonMatch 与 IPOnDemand 的差异,并给出可合并到现有配置中的 JSON 片段。适合已经能启动 Xray、希望控制域名与 IP 分流的用户;读完可以按规则意图选择策略,再用日志和显式代理请求检查命中结果。

路由如何匹配:规则顺序决定优先级

Xray 收到连接后,会根据连接携带的信息依次检查 routing.rules。规则可以按域名、目标 IP、端口、网络类型、来源地址或协议等条件匹配;匹配成功后,通常由 outboundTag 指定要使用的出站。比如目标域名命中某条规则,就可能被交给 proxy;命中 IP 规则时,也可能交给 direct。标签必须与现有 outbounds 中的标签一致。

实际配置应先写范围明确、优先级高的规则,再写较宽泛的规则。若目标同时满足多条规则,前面的匹配可能已经决定出站,后面的规则就不会按预想生效。不要只检查规则有没有写,还要确认规则是否排在会提前匹配的条目之前。

接收连接检查域名规则按需解析检查 IP 规则选择出站
匹配条件常见用途检查重点
domain按域名、域名后缀或规则集分流连接进入 Xray 时是否仍带有域名;规则集是否可用
ip按目标 IP、私有网段或 IP 规则集分流路由是否已取得目标 IP;CIDR 或 geoip 条目是否正确
port、network按目标端口或 TCP、UDP 等网络类型筛选实际连接属性是否符合条件,且规则顺序没有被提前匹配截断
outboundTag指定命中后交给哪个出站标签与 outbounds 定义逐字一致

域名规则常用 domain:、full: 或内置规则集等写法,具体匹配范围要按规则类型理解。比如 full:example.com 用于精确匹配该域名,而 domain:example.com 可用于匹配该域名及其子域。规则集写法依赖相应数据文件和内核支持;配置能通过 JSON 解析,不代表所引用的数据文件一定存在。

domainStrategy 的三种策略:解析时机不同

domainStrategy 位于 routing 配置中,影响的是路由判断过程中何时尝试将域名解析为 IP。它不表示“走代理 DNS”或“走直连 DNS”,也不等于 DNS 服务器的选择策略。若只有域名规则,通常可以先按域名直接判断;当规则需要目标 IP 时,是否解析、何时解析便会影响命中结果。

AsIs
保持域名信息,不因路由策略主动解析后再匹配 IP
IPIfNonMatch
域名规则未命中时,再尝试解析并匹配 IP 规则
IPOnDemand
遇到需要 IP 信息的规则时,按需尝试解析
策略大致行为适合的配置思路需要留意
AsIs保留域名进行路由判断,不主动为 IP 规则补做域名解析主要依靠域名规则分流,希望减少路由阶段解析仅有 IP 规则时,不能假定域名目标一定会被解析后命中
IPIfNonMatch域名规则未匹配时,尝试解析,再继续匹配 IP 规则域名规则优先,同时需要 IP 规则作为补充解析结果受 DNS 配置、解析可达性和目标地址影响
IPOnDemand路由判断遇到 IP 条件时,才尝试取得目标 IP配置中确有 IP 条件,并希望在需要时才解析要结合规则排列和具体连接路径验证,不应只按名称推断效果

一般分流配置可以先从 IPIfNonMatch 开始理解:有域名规则时先看域名规则,域名规则没有决定出站时,再看能否通过解析结果匹配 IP 规则。它并不会保证所有域名都能解析成功,也不会把 DNS 查询失败自动改写成直连或代理。若规则只按 IP 判断,或客户端传入的是已经解析好的 IP,行为也可能与“域名先命中”的设想不同。

结论:先决定规则看什么,再选解析策略

若分流依据主要是域名,先把域名规则写清楚;若还要用 IP 段兜底,再选能够在路由阶段取得 IP 的策略。不要用更激进的解析选项掩盖规则顺序或 DNS 配置错误。

DNS 与路由分开设计:避免把两个策略混为一谈

Xray 的 DNS 配置决定解析请求可使用哪些 DNS 服务器及相关查询行为;路由的 domainStrategy 则影响路由判断是否需要域名对应的 IP。两者配合工作,但一个不替代另一个。即使设置了可用的 DNS 服务器,也要确认目标连接经过的客户端和内核确实使用这套解析路径;浏览器的安全 DNS、操作系统缓存或其他网络组件可能让实际查询方式不同。

下面是路由部分的示例片段。它假设现有配置已经定义了 proxy 和 direct 两个出站标签;请把片段合并到原有配置,而不是直接覆盖完整文件。geosite:cn 与 geoip:cn 依赖相应规则数据文件,文件缺失时应先补齐数据或换成自己明确维护的规则。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": ["full:example.com"],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:cn"],
        "outboundTag": "direct"
      }
    ]
  }
}

这段规则中,精确域名规则放在较宽的规则之前;后续规则再分别处理规则集域名和 IP。若目标没有命中任何规则,实际去向还会受到配置中默认出站顺序等因素影响,因此应明确检查未命中时会使用哪个出站。不要为了“补全”示例而随意添加不存在的标签,也不要把 DNS 服务器地址写进 domainStrategy。

两层配置:先让域名解析可用,再让路由规则可解释

DNS 层
  • 确认 Xray 当前使用的 DNS 配置及服务器可达性。
  • 按需要设置查询策略,不将其当作出站分流规则。
  • 检查缓存或客户端自带解析是否影响测试结果。
路由层
  • 先列出需要按域名判断的目标。
  • 再补充需要按 IP 判断的范围。
  • 确认规则顺序与出站标签都能对应现有配置。

DNS 决定解析路径,路由决定连接去向;逐层验证,比同时更换 DNS 和规则更容易定位问题。

动手验证:从配置检查到请求命中

修改前先备份正在使用的配置,并确认 Xray 实际读取的是哪一个文件。客户端管理的节点列表、订阅内容和内核运行配置可能不是同一份 JSON;直接改错文件,即使配置语法正确,运行中的路由也不会改变。以下步骤适用于能够查看或管理 Xray 配置的桌面环境,界面入口因客户端版本而异。

  1. 核对规则标签。在配置的 outbounds 中查找规则引用的标签,例如 proxy、direct。大小写和拼写必须一致;同时确认默认出站的预期行为。
  2. 检查规则顺序。把精确域名规则放到宽泛规则前,再查看是否有更早的端口、协议或域名规则会先命中。一次只改一类规则,便于比较修改前后的日志。
  3. 检查数据文件。若用了 geosite: 或 geoip: 条目,确认运行环境中存在内核需要的规则数据。启动日志里的加载错误应先处理,不能仅凭配置文本推断规则集有效。
  4. 验证配置并重启内核。使用客户端提供的配置检查功能,或按当前部署方式运行 Xray 的配置校验命令。确认检查通过后重启内核,并查看启动日志是否提示未知字段、无效规则或数据文件缺失。
  5. 发起显式代理请求。若本机 SOCKS 入站监听在 127.0.0.1:10808,可在终端执行下面的请求;若实际端口不同,先替换端口。使用 socks5h 将域名交给代理端处理,更适合检查 Xray 收到域名后的路由行为。
  6. 结合日志确认出站。临时提高 Xray 日志详细程度并检查请求对应的目标与出站结果。验证完成后恢复常用日志级别,避免长期记录过多连接信息。
curl.exe --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 -I https://example.com/

这条请求只示范测试方式,不保证目标站点在每个网络中都可达,也不代表示例域名应被分到某个特定出站。要验证规则,应挑选自己控制或能够确认预期结果的目标;对比请求日志、出站标签和实际连接结果。若使用普通 socks5 而非 socks5h,客户端可能先在本机解析域名,再把 IP 交给代理,测试重点就不再是 Xray 对域名的解析与路由过程。

常见故障:规则没命中时逐层缩小范围

排查时先回答三个问题:Xray 收到的是域名还是 IP?解析是否发生在预期的位置?最终选择了哪个出站?把这三项分开,可以避免把“DNS 解析失败”“路由未命中”和“出站连接失败”混成一种故障。下列现象尤其容易造成误判。

设了 IPIfNonMatch,为什么 IP 规则还是不命中?

检查域名是否先命中了前面的规则、解析是否成功,以及 IP 条目和规则数据是否有效。逐项查看启动与请求日志,不要只通过网页是否打开来判断路由命中。

换了 DNS 服务器,出站就会跟着改变吗?

不一定。DNS 改变的是解析结果或查询路径;出站仍由路由规则决定。分别确认解析得到的地址和请求最终对应的出站标签。

能打开网站,怎么确认走的是哪条规则?

通过显式代理发起新请求,并结合 Xray 日志查看目标和出站。浏览器缓存、长连接或自身 DNS 设置可能使单次打开结果不足以说明路由命中情况。

维护复杂分流时,建议给每条规则写清目标范围、出站标签和验证方法,并保留一份可回滚的配置。新增规则后先做语法检查,再用少量已知目标验证;确认有效后再扩大规则范围。若需要调整默认出站,也应单独验证未命中规则的连接,避免把未知流量误送到预期之外的路径。

下载v2rayN按系统选择客户端