Xray 路由按规则列表从上到下检查,通常由第一条匹配规则决定出站;domainStrategy 则影响路由阶段何时把域名解析为 IP,以便匹配 IP 规则。本文拆解规则优先级、三种域名策略和 DNS 的职责边界,并给出可合并到现有配置的 JSON 片段、验证步骤与误匹配排查方法。适合已经能启动 Xray、希望精细控制直连与代理分流的用户。
路由规则优先级:从上到下,命中即停
Xray 的路由器会依次检查 routing.rules 中的规则。某条规则的条件全部满足时,请求被分配给该规则的 outboundTag;默认情况下,后面的规则不会再覆盖这个决定。因此,规则列表的顺序不是展示顺序,而是分流逻辑的一部分。把范围很大的规则放在前面,可能会让后面更具体的例外永远没有机会生效。
一条规则可根据 domain、ip、port、network、protocol、inboundTag 等条件进行匹配。同一条规则中同时填写多个条件时,通常需要这些条件同时成立;同一条件字段中的多个值则按该字段支持的匹配方式判断。理解这一点很重要:域名规则与 IP 规则写在同一条规则里,并不等于“域名或 IP 任意命中即可”。
例如,规则一把 domain:example.cn 指向 direct,规则二把 geoip:cn 指向 direct,末尾再把其余流量交给 proxy。域名已被第一条规则匹配时,就会直连;即使该域名解析出的 IP 还符合后面的规则,后面的规则也不会重新选择出站。若希望某个特殊域名走代理,应把它放在更宽泛的直连域名规则之前。
- 具体例外优先:先写必须代理或必须直连的特定域名,再写范围较大的分类规则。
- 分类规则居中:按需要安排
geosite:、geoip:或自定义 IP 段规则。 - 默认出口收尾:使用最终兜底规则处理未匹配流量;检查其
outboundTag确实对应已定义的出站。 - 不同入口可分开:如有多个入站,可用
inboundTag限定规则作用范围,避免管理入口和普通代理入口共用同一套分流。
结论:宽规则越靠前,越要确认它不会吞掉例外
新增规则前先找到它会命中的目标,再检查它前面是否已有更宽泛的匹配。排查时从日志里的目标地址和出站标签反推第一条命中规则,比不断调整 DNS 更有效。
domainStrategy:决定何时用 IP 参与路由
domainStrategy 配置在 routing 对象中,控制路由器面对域名目标时如何处理 IP 规则。它不会改变域名规则的书写顺序,也不负责把所有应用的 DNS 请求强制改走某个服务器。常用值是 AsIs、IPIfNonMatch 与 IPOnDemand;大小写应按配置示例准确填写。
AsIs
- 域名处理
- 保留域名形式进行路由匹配
- IP 规则
- 不因该策略主动解析域名以匹配 IP 规则
- 适用情况
- 主要依靠域名规则分流
- 注意事项
- 域名未命中时,不能期待仅凭 geoip 规则完成域名目标分流
适合规则明确以域名为主、希望避免路由阶段按需解析的场景。
IPIfNonMatch 与 IPOnDemand
- IPIfNonMatch
- 域名规则未能匹配时,解析目标域名并尝试 IP 规则
- IPOnDemand
- 路由检查到 IP 条件时,按需解析域名以供匹配
- 适用情况
- 规则需要结合域名和 IP 分类
- 注意事项
- 解析结果和 DNS 可用性会影响 IP 规则判断
两者都可能让 IP 规则参与域名目标的分流,但触发时机不同。
IPIfNonMatch 的关键是先尝试现有规则;域名匹配成功时,不需要为了后续 IP 规则再解析一次。没有规则匹配时,路由器才解析域名并尝试 IP 匹配。IPOnDemand 则侧重在路由检查遇到 IP 条件时按需解析。它可能让 IP 分类更早参与判断,但也意味着路由结果依赖解析是否成功。
选择策略时应看规则结构,而不是简单认定某个值“更精准”。如果分流主要依赖域名列表,AsIs 可以避免把解析结果当作必要条件;若需要用 geoip:cn 等 IP 条件处理域名目标,通常应考虑 IPIfNonMatch 或 IPOnDemand,并配合可用的 DNS 配置和清晰的规则顺序。
JSON 示例:组合域名规则、IP 规则与兜底出口
下面是一个可移入现有配置的 routing 片段,不是完整的可启动配置。示例假设现有 outbounds 已定义 proxy 和 direct 两个标签;如果标签名称不同,必须同步修改规则中的 outboundTag。示例先处理特定域名,再处理私有地址和中国大陆 IP,最后将未命中流量交给代理。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"domain:internal.example",
"full:portal.example.net"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "block"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
示例中的 block 标签也必须在现有出站中定义,否则配置无法按预期工作;如果不需要拦截规则,可删除对应规则。示例把广告域名规则放在末尾兜底之前,表示命中时交给拦截出站。若某个特定域名需要绕过广告分类,应将其例外规则放在分类规则前面。geosite: 与 geoip: 的匹配依赖 Xray 可读取的规则数据文件,分类名称和数据版本应以实际部署为准。
这段配置不是“所有国内域名直连”的完整保证。域名规则和 IP 规则覆盖的对象并不完全相同:有的应用只提供 IP 目标,无法按原始域名匹配;有的域名解析到境外 CDN 地址,也可能不符合 geoip:cn。如果需要让某条连接按域名分流,应先确认 Xray 收到的是域名,而不是已经被应用解析并直连的 IP。
DNS 与路由的边界:解析服务器不等于分流规则
DNS 配置回答“域名如何解析、向谁查询”;路由配置回答“已经进入内核的连接交给哪个出站”。两者会在需要 IP 匹配时发生关联,但不能互相替代。把 DNS 服务器改成某个地址,不会自动创建直连或代理规则;设置 IPIfNonMatch 也不等于所有应用的 DNS 查询都会通过代理服务器发出。
Xray 可以根据配置处理 DNS 请求,也可能从其他 DNS 行为中获得解析结果。实际使用时,应一起核对 dns.servers、路由规则、内核日志和客户端入口方式。若启用了嗅探,应用协议中识别出的域名还可能影响后续路由;但嗅探不应被当作所有连接都能还原域名的保证。应用若直接向外部 DNS 查询,或连接本身只携带 IP,观察到的结果可能与预期不同。
| 观察现象 | 先检查 | 判断重点 |
|---|---|---|
| 域名规则生效,geoip 规则似乎无效 | domainStrategy 是否为 AsIs |
若希望域名目标进一步按 IP 分类,检查是否需要解析策略 |
| 规则更改后仍走旧出口 | 规则顺序、客户端生成的最终配置、旧连接 | 域名是否已在前面的规则命中;测试时重建连接 |
| 域名目标未命中 IP 分类 | DNS 解析结果、可用 DNS、IP 数据文件 | 结果地址是否属于预期网段,分类数据是否可用 |
| 只有一个应用分流异常 | 应用是否使用系统代理、TUN 或自有 DNS | 该连接是否实际进入 Xray,以及内核拿到的是域名还是 IP |
不要只凭“网页能打开”推断 DNS 和路由都正确。可先选一个域名规则明确的目标,再选一个需要 IP 分类的目标,分别观察日志中的目标地址、匹配规则和出站标签。若日志没有给出足够信息,先缩减规则到一条域名规则和一条兜底规则,确认基础行为后再逐条加回。
动手配置与验证:每次只改一项
在 v2rayN 中,客户端界面会根据所选内核生成运行配置。自定义路由入口和菜单名称可能随版本调整,常见流程是从主界面打开「设置」→「路由设置」或路由规则管理界面;应以当前版本实际显示为准。若界面提供路由预设,先确认预设是否会覆盖自定义规则,再决定在客户端中修改还是编辑独立配置。
-
备份当前配置
记录 v2rayN 版本、Xray-core 版本、当前路由模式和出站标签,并复制现有配置文件。不要在测试时同时更换节点、升级内核和改 DNS,否则很难定位变化来源。
-
确认运行入口
在「设置」→「参数设置」检查本地代理端口。常见示例是
127.0.0.1:10808,但端口和入口类型必须以当前配置或启动日志为准。确保待测应用确实连接到该入口,或确认 TUN 已接管该流量。 -
整理规则顺序
把特定域名例外放在分类规则之前,确认私有 IP、国内 IP 与兜底规则的先后关系。检查
domainStrategy的值,并确认每个目标出站标签已定义。 -
启动并查看日志
保存后让客户端重新生成并启动配置。检查 Xray 启动日志是否有 JSON 解析失败、规则数据加载失败或出站标签不存在等报错;出现启动错误时先恢复备份,不要继续叠加修改。
-
逐个目标复测
分别测试一个明确命中的域名、一个预期由 IP 分类处理的域名,以及一个兜底目标。每次关闭旧连接并重新访问,记录目标、预期规则和日志显示的出站标签。
例如,测试记录可以写成:“目标 portal.example.net,预期规则为第一条域名规则,预期出站 direct,日志实际出站 direct”。如果目标解析到 IP 后仍走代理,先确认它是否在域名规则之前被其他规则命中,以及 Xray 实际收到的是域名还是 IP。示例记录用于说明记录方式,不是本站实测结果。
检查监听端口时,避免把本机入口端口与远端节点端口混为一谈。端口 10808 只是常见配置示例;改成其他数值不会改变路由规则本身。遇到“连接被拒绝”先确认对应入口是否监听,再检查应用代理设置;遇到“出站标签不存在”则回到配置中的 outboundTag 和 outbounds.tag 核对拼写。
误匹配排障:从日志定位第一条命中规则
路由结果与预期不同时,先不要立刻交换所有规则。采用固定顺序检查:确认流量已进入 Xray,读取日志中的目标地址和出站标签,再按规则列表从上到下验证条件。域名规则没有命中时,检查目标是否以域名形式到达、域名表达式类型是否正确,以及是否被更早的规则处理;IP 规则没有命中时,再检查解析结果和 IP 分类数据。
报错:outbound not found
原因与解法:outboundTag 指向的标签没有对应出站,或大小写不一致。逐项对照 routing.rules 与 outbounds 中的 tag,修正后重新启动内核。
现象:国内目标仍然走代理
原因与解法:可能是域名在前面的代理规则已命中、解析结果不属于预期 IP 分类,或流量未携带可识别域名。查看目标形式与出站日志,再调整具体规则顺序并逐条复测。
现象:自定义规则保存后没有效果
原因与解法:客户端可能重新生成配置,或当前启用的是另一组路由预设。确认运行中的最终配置包含修改内容,并检查重启后加载的内核日志,而不是只检查编辑器中的文本。
把 domainStrategy 改成 IPIfNonMatch 后,所有域名都会按 IP 分流吗?
不会。它只在域名规则未匹配时尝试解析并匹配 IP 规则;若前面的规则已经命中,后续 IP 规则不会再覆盖结果。检查规则顺序和日志中的目标形式。
规则里有 geoip:cn,为什么某个国内网站还走代理?
先确认域名是否解析到中国大陆 IP、IP 规则是否位于已命中规则之后,以及对应数据文件是否加载。CDN 地址可能不属于预期分类,不能只根据网站运营方所在地推断 IP 归属。
改了 DNS,路由结果却没变化,正常吗?
可能正常。DNS 服务器选择与规则命中是不同配置环节,且域名规则可能在需要 IP 匹配前已经命中。对照日志里的目标地址、解析结果和出站标签,再判断是否需要调整解析策略。
建立一份简短的规则说明也有助于长期维护:每条规则注明匹配对象、预期出站和放置位置;更新规则数据后,重新抽查一个域名目标和一个 IP 分类目标。需要进一步核对配置字段时,可查看 JSON 手册;需要客户端安装入口时,可前往下载。