先分清 DNS 解析与流量路由
V2Ray 配置中的 DNS 和路由是两个连续但不同的环节。DNS 负责把域名解析成地址,路由负责决定连接交给哪个出站。解析结果正确,不代表流量一定走代理;流量命中代理规则,也不代表此前的域名解析一定经过远端服务器。排查分流问题时,需要把这两步拆开观察。
当应用向 V2Ray 提交域名目标时,路由模块可以直接依据域名规则判断出站。如果规则还需要判断目标地址,或者出站建立连接前需要取得地址,内置 DNS 模块才会参与解析。配置中的 routing.domainStrategy 会影响这一过程。常见值包括 AsIs、IPIfNonMatch 和 IPOnDemand,不同内核版本支持范围与具体行为应以当前版本文档为准。
AsIs:优先保留域名,不为了匹配 IP 路由规则主动解析。IPIfNonMatch:域名规则未命中时,再解析地址并继续检查 IP 规则。IPOnDemand:路由判断需要地址时较早触发解析,配置不当时会增加查询量。
对大多数“国内直连、其余代理”的配置,IPIfNonMatch 是较容易理解的起点。先让 geosite 域名规则工作,未命中的目标再通过 DNS 获取地址,最后交给 geoip 规则判断。这样既保留域名分流能力,也能处理只适合按地址判断的连接。
dns 配置段的核心字段
dns.servers 是整个配置的入口。数组中的项目既可以是服务器地址,也可以是带匹配条件的对象。对象形式可以设置 address、port、domains 和 expectIPs。实际支持字段会随 V2Ray、Xray 与客户端内置内核版本变化,迁移配置时不要只看客户端界面版本。
| 字段 | 作用 | 配置重点 |
|---|---|---|
servers |
定义可使用的 DNS 服务器及匹配条件 | 有 domains 的服务器优先服务对应域名,其余由默认服务器处理 |
hosts |
为指定域名提供静态映射或域名映射 | 适合固定入口和启动解析,不适合维护大量动态地址 |
queryStrategy |
控制查询 IPv4、IPv6 或两类地址 | 应与本地网络和出站可达能力一致 |
clientIp |
向支持相关机制的解析服务提供客户端网段信息 | 涉及位置判断与隐私,不应在不了解用途时随意填写 |
disableCache |
控制内置 DNS 缓存 | 长期关闭会增加重复查询,通常只用于短时诊断 |
hosts 的处理发生在向外部 DNS 查询之前。它适合解决少量固定域名的启动依赖,例如远端解析服务使用域名地址,而该域名本身又需要先解析。此时可使用已确认的固定地址建立初始映射,避免“必须先连接远端 DNS,才能解析远端 DNS 域名”的循环。
queryStrategy 需要按网络条件设置。如果所在网络只有稳定的 IPv4 连通能力,可以从 UseIPv4 开始,减少拿到不可达 IPv6 地址后的等待。网络具备完整双栈能力时,可选择同时查询。这里解决的是地址族选择,不是代理分流;即使只查询 IPv4,域名仍然可以按国内外规则选择不同解析服务器。
国内域名本地解析,其余域名远端解析
下面是一段可合并进主配置的 DNS 示例。国内域名通过 geosite:cn 选择本地解析服务器,并使用 geoip:cn 检查响应范围。其他域名没有命中这一专用规则时,交给后面的远端 HTTPS DNS。示例中的地址用于说明结构,部署时还要确认当前网络、内核版本和远端出站均可访问对应服务。
{
"dns": {
"queryStrategy": "UseIPv4",
"servers": [
{
"address": "223.5.5.5",
"port": 53,
"domains": [
"geosite:cn"
],
"expectIPs": [
"geoip:cn"
]
},
{
"address": "https://1.1.1.1/dns-query",
"domains": [
"geosite:geolocation-!cn"
]
},
"https://1.1.1.1/dns-query"
]
}
}
最后一个不带 domains 的项目是默认解析服务器。它负责未被前面规则明确覆盖的域名。保留默认项很重要,因为站点分类数据不可能覆盖所有域名,新注册域名、私有业务域名和分类尚未更新的域名都需要明确去向。
示例把同一个远端解析地址分别写成“非国内域名专用服务器”和“默认服务器”,目的是明确展示匹配逻辑。实际配置可以根据当前内核的 DNS 选择机制精简。如果版本对同地址重复项的处理不符合预期,也可以只保留默认远端服务器:国内域名命中第一项,其他域名自然落到默认项。
geosite:cn 是域名分类,不代表解析结果一定落在国内地址。部分国内站点会使用全球 CDN,解析结果可能随网络位置变化。相反,一些未归入国内分类的域名也可能返回国内节点。因此,域名分类与地址归属需要组合使用,但不能把任何一项当作绝对结论。
expectIPs 如何识别异常响应
expectIPs 用于描述某个 DNS 服务器返回结果的预期地址范围。国内域名交给本地解析时,可以设置 geoip:cn。如果响应地址不符合预期,内核可将该结果视为不满足条件,并按 DNS 服务器选择逻辑尝试其他候选项。这是降低错误解析影响的一道检查,不是单独完成全部防护的开关。
它最适合规则边界清楚的场景。例如,一个只负责国内分类域名的本地服务器,预期结果大多位于国内地址范围。若返回明显不相符的地址,继续使用远端服务器查询通常更合理。不过 CDN、跨境业务和 Anycast 会让地址归属变得复杂,过度收紧条件可能把正常结果误判为异常。
不建议给所有远端域名统一添加 geoip:!cn。许多国际服务会按访问位置返回附近节点,其中可能包含国内地址;一些域名还会同时返回多个区域的地址。强制要求每个结果都属于非国内范围,可能造成重复查询、解析失败或连接延迟。
配置 expectIPs 时可以遵循三步:
- 先只配置
domains分组,确认每类域名确实进入目标服务器。 - 再为边界稳定的服务器加入
expectIPs,观察常用站点是否出现误判。 - 最后检查回退行为,确认异常结果会转向合适的候选服务器,而不是直接终止解析。
如果加上 expectIPs 后出现间歇性失败,应先查看失败域名实际返回的地址,再决定扩大预期范围、移除该域名分类,还是取消这一服务器的地址限制。不要通过反复调换服务器顺序掩盖分类错误。
让远端 DNS 查询经过代理出站
把远端 DNS 写进 dns.servers,只说明使用哪个解析服务,并不自动保证连接路径。远端 DNS 的网络请求仍要经过路由与出站。若它直接连接,查询可能受到本地网络路径影响;若计划通过代理访问,就要为解析服务的目标地址设置明确规则。
下面的路由片段把远端解析地址交给标签为 proxy 的出站,同时让国内域名和国内地址走 direct。最后一条规则接住其余 TCP 与 UDP 流量。规则按顺序匹配,远端 DNS 地址应放在较宽泛的直连地址规则之前。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": [
"1.1.1.1"
],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private",
"geoip:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
这只是路由片段,主配置中还需要存在标签完全一致的 proxy 与 direct 出站。标签拼写区分大小写,路由引用不存在的标签会导致配置载入失败或连接无法按预期建立。
如果远端 DNS 使用域名形式的服务入口,要额外考虑启动解析。内核必须先知道这个服务入口的地址,才能建立 HTTPS 连接。可选做法包括使用地址形式的入口、通过 hosts 提供经过确认的启动映射,或让系统 DNS 只承担这一阶段。不要让远端 DNS 域名只能由它自身解析。
代理服务器地址也存在同样的启动依赖。订阅节点如果使用域名,V2Ray 在代理通道尚未建立时必须先取得节点地址。此类域名应使用可靠的启动解析路径,不能强制要求通过尚未可用的代理出站查询。
DNS 防污染的关键设置
防污染不是简单地把本地 DNS 换成另一个地址。完整链路至少包含查询选择、传输路径、响应检查、缓存和业务连接五部分。任何一部分仍走错误路径,都可能出现“首次能开、刷新失败”“解析正确但连接直连”“切换节点后仍使用旧地址”等现象。
查询服务器按域名分类
国内域名优先使用本地解析,通常能取得更接近当前网络的 CDN 地址;其他域名使用远端解析,减少本地递归链路对结果的干扰。分类规则要有默认出口,避免未分类域名无服务器可用。
远端查询走可控出站
普通 UDP 查询即使目标服务器不同,也可能受中间网络路径影响。HTTPS DNS 提供加密传输,但仍需确认它经过预期出站。只改服务器地址、不检查路由,不足以确定最终路径。
缓存调整用于诊断而非长期规避
V2Ray 内置 DNS、操作系统和应用都可能保存解析结果。修改配置后立即测试时,旧结果可能继续生效。可以重载内核、清理系统 DNS 缓存并重新启动相关应用。临时启用禁用缓存选项有助于确认问题,但长期关闭缓存会增加查询次数与首连等待。
浏览器与应用的独立解析
部分应用会使用自己的加密 DNS 设置,不一定把域名查询交给系统或 V2Ray。此时 V2Ray 可能只能看到后续连接地址,域名路由能力也会受到影响。测试时应先确认应用的解析方式,再判断内置 DNS 是否真正参与。
v2rayN 中的应用与验证顺序
v2rayN 的订阅负责提供服务器配置,DNS 与路由通常属于客户端侧运行参数。更新订阅不会自动保证自定义 DNS 规则保持原样,具体取决于所用配置模式、路由设置和客户端版本。修改前应保存当前可用配置,修改后重新载入内核,而不是只切换系统代理开关。
验证时不要一次测试大量网站。先选一个明确属于国内分类的域名,再选一个应走远端解析的域名,分别观察 DNS 日志和路由日志。检查内容包括:命中的 DNS 服务器、解析得到的地址、命中的出站标签、最终连接是否成功。
- 确认配置可以正常载入,日志中没有未知字段、标签缺失或 JSON 格式错误。
- 查询国内域名,确认命中带
geosite:cn的本地服务器对象。 - 查询其他域名,确认进入远端默认服务器,并检查远端解析连接走代理出站。
- 核对业务连接的路由结果,避免 DNS 走代理但业务流量被后续规则改为直连。
- 切换一次测试域名或清理缓存,排除旧结果影响。
如果使用 v2rayNG 或 v2flyNG,判断方法相同,但配置字段是否可用取决于应用内置的 Xray 或 v2fly 内核版本。桌面配置不能在未核对版本的情况下直接复制到安卓端。遇到字段不识别,应先检查内核类型与版本,再按对应配置格式调整。
常见故障与定位方法
国内站点打开变慢
先看国内域名是否落到了远端默认服务器。如果 geosite 数据未加载、分类文件版本不匹配或域名本身未被收录,就会进入默认项。还要检查 expectIPs 是否过严,导致本地服务器返回的正常 CDN 地址被拒绝并触发远端查询。
远端 DNS 配好后仍然解析异常
重点确认远端请求的出站。目标地址可能被 geoip 规则提前匹配到直连,也可能因为规则顺序错误没有进入 proxy。HTTPS DNS 的连接失败还可能来自系统时间异常、网络无法到达目标地址或代理节点尚未建立。
配置启动时出现循环解析
通常是代理节点域名或远端 DNS 域名只能通过代理解析,而代理本身又依赖这个解析结果。解决方向是建立独立的启动解析路径。节点域名、本地解析服务器与远端解析入口三者的依赖关系应当能从直连阶段开始逐步建立。
地址正确但网站仍走错出站
DNS 与业务路由需要分别核对。域名可能被正确解析,但后续 geoip:cn 规则把返回地址送到直连;也可能域名规则在更前面已经指定了其他出站。按照路由规则从上到下检查第一个命中项,不要只看最后的兜底规则。
修改后短时间内结果反复
这通常与多层缓存、CDN 多地址响应或应用自带解析有关。关闭并重新启动相关应用,重载 V2Ray 内核,再使用单个测试域名重复验证。日志中若能看到新的查询请求,但地址每次不同,可能是解析服务正常进行负载调度,不应仅凭地址变化判断污染。
配置收尾检查
完成 DNS 分流后,先确认国内域名、本地网络地址和远端域名都有明确处理路径。再确认远端 DNS 的连接出站、代理节点的启动解析、默认服务器和最终兜底路由均存在。最后使用日志验证,而不是只根据网页是否能打开判断。
一套可维护的配置通常保持简单:少量 DNS 服务器、清楚的域名分组、有限的 expectIPs 条件,以及顺序明确的路由规则。分类越细,维护成本越高;条件越严,CDN 和动态地址带来的误判越多。先建立可工作的两组解析,再按实际日志增加例外,比一次堆入大量规则更稳定。
需要继续核对完整 JSON 结构时,可结合本站 JSON 手册检查 dns、routing 与 outbounds 的层级关系。客户端配置载入成功后,再逐项测试订阅节点、系统代理和路由分流,避免把连接问题全部归因于 DNS。