本文面向已经能连接节点、需要调整 Xray DNS 的 v2rayN 与 v2rayNG 用户。配置按“境内域名使用指定的境内解析器,其余域名使用经代理传输的 DoH”拆解,并说明内置 DNS 的触发条件、回退边界和验证步骤。示例是合并到现有配置的片段,不包含可直接连接的节点参数。
一、内置 DNS 的处理范围:解析请求与业务连接分开看
Xray 的 dns 对象为内核提供域名解析能力,并不等于操作系统的全部 DNS 流量已经被接管。应用可以先通过系统解析器拿到 IP,再把 IP 交给代理;也可以把域名交给代理协议,由本地内核或远端服务器继续处理。两种路径会得到不同的日志和检测结果。
只有触发内置解析时,dns.servers 才参与选择。例如,路由策略需要把域名转成 IP 后匹配,或者直连出站设置了按 IP 建立连接,都会使用内核的解析能力。反过来,如果代理出站将目标域名交给远端处理,本地 DNS 日志中没有该域名也可能是正常现象。
- DNS 分流:决定某个域名向哪一个解析器查询。
- 业务分流:决定访问目标网站时使用
direct还是proxy出站。 - DNS 传输分流:决定发往解析器的 UDP 或 HTTPS 请求本身从哪里发出。
- 系统接管:决定浏览器、其他应用和系统服务的 DNS 请求是否进入同一套处理链。
二、核心字段:servers、domains 与回退策略
servers 可以同时包含普通 DNS 地址和 DoH 地址。对象形式的服务器条目能够配置域名匹配及回退行为。这里的“本地解析”指从当前网络直连指定的境内解析器,不是 localhost,也不是自动读取路由器提供的 DNS。
境内域名解析器
- address
223.5.5.5- port
53- domains
geosite:cn- skipFallback
true
只处理命中的域名集合,不参加其他域名的通用回退。
其余域名解析器
- address
https://1.1.1.1/dns-query- 传输端口
443- queryStrategy
UseIPv4,由全局继承- 查询出站
proxy,由路由规则指定
使用普通 HTTPS DoH 地址,经后文的规则送入代理出站。
| 字段 | 本文设置 | 实际含义 |
|---|---|---|
domains | ["geosite:cn"] | 为该解析器指定优先匹配的域名范围,不是业务出站规则。 |
queryStrategy | UseIPv4 | 内置 DNS 只查询 IPv4 地址,便于先排除 IPv6 连通性变量。 |
skipFallback | 境内条目为 true | 该条目不加入未匹配域名所使用的通用回退服务器集合。 |
disableFallbackIfMatch | true | 域名命中服务器匹配规则后,不再转向通用回退服务器。 |
tag | dns-internal | 为内置 DNS 产生的查询流量提供路由标记,可由 inboundTag 匹配。 |
UseIP 表示可查询 IPv4 与 IPv6,UseIPv6 表示只查询 IPv6。这里选择 UseIPv4 是排障基线,不是所有网络都应关闭 IPv6。确认节点出口、系统路由和直连网络均支持 IPv6 后,再调整策略并重新验证。
geosite:cn 来自所用域名数据文件,不是对域名所属地区的实时判断。数据更新和收录范围都会影响命中结果。geoip:cn 则是 IP 地址集合,不能替代 DNS 条目中的域名分类。
三、DNS 配置片段:境内命中、其余回退到 DoH
下面的 JSON 包含顶层 dns 对象。已有同名对象时应合并其内容,不能在同一配置中重复添加两个 dns 键。示例使用 IP 形式的 DoH 地址,避免为了访问解析器又先解析其域名;该地址仍须通过正常的 HTTPS 证书验证。
{
"dns": {
"tag": "dns-internal",
"queryStrategy": "UseIPv4",
"disableFallbackIfMatch": true,
"servers": [
{
"address": "223.5.5.5",
"port": 53,
"domains": [
"geosite:cn"
],
"skipFallback": true
},
{
"address": "https://1.1.1.1/dns-query"
}
]
}
}
- 命中境内域名集合:使用
223.5.5.5:53。如果该查询失败,当前设置不会再向通用 DoH 条目回退,便于保持解析边界。 - 未命中域名集合:境内条目因
skipFallback: true被排除,查询交给 DoH 条目处理。 - 境内解析器不可达:先检查当前网络对 UDP 53 的限制。若确需冗余,可增加另一条具有相同
domains的境内解析器,并同步补齐传输路由。 - 内网域名:企业内部域名通常需要企业 DNS。应为实际内部域名后缀添加专用匹配,不要直接发送给公共解析器。
四、路由配套:让 DoH 真正经过代理
DoH 只说明查询通过 HTTPS 传输,不说明连接一定经过代理。下面是与上一个 DNS 对象配套的路由示例,要求现有配置中已经存在名为 proxy 和 direct 的出站。节点由客户端生成时,实际标签可能不同,应先查看运行配置,再统一替换引用。
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"inboundTag": ["dns-internal"],
"ip": ["223.5.5.5"],
"port": "53",
"network": "udp",
"outboundTag": "direct"
},
{
"type": "field",
"inboundTag": ["dns-internal"],
"ip": ["1.1.1.1"],
"port": "443",
"network": "tcp",
"outboundTag": "proxy"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
前两条只匹配带有 dns-internal 标记的查询连接,必须放在通用规则之前。第三条处理境内域名的业务连接,第四条处理已经是私有 IP 的目标,最后一条兜底。AsIs 不会为了 IP 路由匹配而主动解析域名,所以这个示例没有把“路由查 IP”和“DNS 分流”混在一起。
为了让境内域名的直连连接使用上述内置 DNS,可将现有 direct 出站的相关部分设置如下。不要额外创建一个同名出站;应修改原有对象,并保留其他必要设置。
{
"tag": "direct",
"protocol": "freedom",
"settings": {
"domainStrategy": "UseIP"
}
}
判断:先验证 DNS 连接的出站,再判断解析结果
日志里出现 DoH 地址,只能证明选择了该解析器。还要确认发往 1.1.1.1:443 的查询连接命中 proxy;如果落到 direct,应先修正规则顺序和标签,再继续排查污染。
- 普通 HTTPS 与本地模式:本文采用
https://地址。不要随意改成https+local://,后者的本地处理路径不适合直接套用本文的路由假设。 - 节点启动依赖:代理服务器地址如果是域名,建立代理前仍需要可用的解析路径。不要让节点域名的首次解析依赖尚未建立的同一个代理。
- 规则合并:已有广告拦截、局域网或自定义域名规则时,需要逐条合并,不能把已有路由整体覆盖。
五、客户端落地与验证:先查运行配置,再查请求
v2rayN 可生成不同内核的配置,本文字段仅针对 Xray。v2rayNG 使用 Xray,但界面选项可能生成或覆盖部分 DNS 参数。v2flyNG 使用 V2Fly,不能仅凭字段名称相似就把本文片段直接套入。具体设置入口会随客户端版本变化,验证应以启动后的实际配置和日志为准。
- 备份:保留当前可连接的配置和路由设置,记录活动节点、所选内核及系统代理或 VPN 状态。
- 合并:通过当前客户端实际提供的 DNS 编辑或自定义配置入口写入片段。若只允许填写 DNS 对象内容,不要连外层
{"dns": ...}一起粘贴。 - 检查:核对运行配置是否保留
dns-internal、两条 DNS 传输规则和正确的出站标签。重新启动内核后查看是否有未知字段、缺少数据文件或出站不存在的错误。 - 分组测试:选择一个确认在当前
geosite:cn集合中的域名,再选择一个未匹配域名。清除相关缓存或使用新的测试域名后,观察实际查询连接。 - 复核应用:分别检查浏览器安全 DNS、Android 私有 DNS 和应用排除列表。不要把浏览器自行发出的 DoH 请求误认为内置 DNS 查询。
Windows 可在需要时执行下面的命令清理系统 DNS 缓存。它不会清理浏览器独立缓存、远端服务器缓存或内核自身缓存,因此执行后没有新增查询日志,并不能直接说明配置失效。
ipconfig /flushdns
nslookup example.com 223.5.5.5 只是在测试系统到指定解析器的路径,不会自动调用 Xray 的内置 DNS。同样,浏览器能够打开网站只证明业务链路可用,不足以证明 DNS 分流正确。验证需要同时观察域名是否进入内核、查询发给谁,以及使用哪个出站。
六、防污染与防泄漏:分别定位故障层
解析污染通常表现为错误地址、异常地址或解析失败,但单次结果不同不一定是污染。内容分发网络会按递归解析器位置、运营商和网络状态返回不同地址。应结合连接错误、证书异常和多次查询结果判断,不能仅用“两个 DNS 返回值不同”下结论。
| 现象 | 先检查 | 调整方向 |
|---|---|---|
| 境内域名解析超时 | 是否命中境内条目,UDP 53 是否可达 | 检查当前网络限制,按相同域名范围添加备用解析器。 |
| DoH 连接超时 | proxy 标签、规则顺序、节点自身连通性 | 先恢复代理通路,保留正常的 TLS 验证。 |
| 网页能开,但没有本地查询日志 | 域名是否交由代理远端解析,是否已有缓存 | 追踪域名传递路径,不强求所有连接都产生本地查询。 |
| 检测结果出现预期外的解析器 | 浏览器安全 DNS、系统私有 DNS、应用绕行 | 逐项统一测试路径,再确认解析器的实际归属。 |
| 改用双栈后部分站点卡顿 | IPv6 直连、节点出口及路由覆盖 | 临时恢复 UseIPv4 对照,确认 IPv6 链路后再开启。 |
DNS 泄漏的判定取决于预期策略。本文明确允许境内域名使用直连解析器,因此观察到这部分查询并不等于策略失效。真正需要查的是:原本应走代理的查询是否从本地直接发出,以及未纳入接管的应用是否绕过了设置。
七、常见问题:配置已改,结果为什么没变?
只改 queryStrategy,能阻止应用使用 IPv6 吗?
不能。UseIPv4 约束的是这套内置 DNS 查询,不会关闭系统 IPv6,也不会阻止应用自行查询 AAAA 记录。先确认应用请求进入了哪条解析链,再检查 VPN 或其他流量接管范围。
填了远程 DNS,为什么日志仍显示 direct?
远程地址不等于代理出站。检查 dns.tag 是否与规则里的 inboundTag 一致,发往 1.1.1.1:443 的规则是否在兜底规则之前,以及真实代理出站是否确实叫 proxy。
境内 DNS 失败后,为什么没有自动改用 DoH?
本文开启了 disableFallbackIfMatch,命中域名规则后不会进入通用回退。需要冗余时,优先添加具有相同域名匹配条件的备用条目;若改成允许跨组回退,要重新验证域名发送范围。
订阅更新后,DNS 设置又恢复了怎么办?
先确认修改的是客户端保存的设置,还是每次启动重新生成的临时配置。把调整放到客户端实际支持的持久化 DNS 或自定义配置入口,再重新生成并核对运行配置;保留备份,避免更新时丢失规则。