本文速览

本文面向已经能连接节点、需要调整 Xray DNS 的 v2rayN 与 v2rayNG 用户。配置按“境内域名使用指定的境内解析器,其余域名使用经代理传输的 DoH”拆解,并说明内置 DNS 的触发条件、回退边界和验证步骤。示例是合并到现有配置的片段,不包含可直接连接的节点参数。

一、内置 DNS 的处理范围:解析请求与业务连接分开看

Xray 的 dns 对象为内核提供域名解析能力,并不等于操作系统的全部 DNS 流量已经被接管。应用可以先通过系统解析器拿到 IP,再把 IP 交给代理;也可以把域名交给代理协议,由本地内核或远端服务器继续处理。两种路径会得到不同的日志和检测结果。

域名进入内核触发内置解析匹配解析器发送查询返回地址

只有触发内置解析时,dns.servers 才参与选择。例如,路由策略需要把域名转成 IP 后匹配,或者直连出站设置了按 IP 建立连接,都会使用内核的解析能力。反过来,如果代理出站将目标域名交给远端处理,本地 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"]为该解析器指定优先匹配的域名范围,不是业务出站规则。
queryStrategyUseIPv4内置 DNS 只查询 IPv4 地址,便于先排除 IPv6 连通性变量。
skipFallback境内条目为 true该条目不加入未匹配域名所使用的通用回退服务器集合。
disableFallbackIfMatchtrue域名命中服务器匹配规则后,不再转向通用回退服务器。
tagdns-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"
      }
    ]
  }
}
  1. 命中境内域名集合:使用 223.5.5.5:53。如果该查询失败,当前设置不会再向通用 DoH 条目回退,便于保持解析边界。
  2. 未命中域名集合:境内条目因 skipFallback: true 被排除,查询交给 DoH 条目处理。
  3. 境内解析器不可达:先检查当前网络对 UDP 53 的限制。若确需冗余,可增加另一条具有相同 domains 的境内解析器,并同步补齐传输路由。
  4. 内网域名:企业内部域名通常需要企业 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,应先修正规则顺序和标签,再继续排查污染。

五、客户端落地与验证:先查运行配置,再查请求

v2rayN 可生成不同内核的配置,本文字段仅针对 Xray。v2rayNG 使用 Xray,但界面选项可能生成或覆盖部分 DNS 参数。v2flyNG 使用 V2Fly,不能仅凭字段名称相似就把本文片段直接套入。具体设置入口会随客户端版本变化,验证应以启动后的实际配置和日志为准。

53
示例境内 DNS 的 UDP 端口
443
示例 DoH 的 HTTPS 端口
2
需要核对的出站标签
  1. 备份:保留当前可连接的配置和路由设置,记录活动节点、所选内核及系统代理或 VPN 状态。
  2. 合并:通过当前客户端实际提供的 DNS 编辑或自定义配置入口写入片段。若只允许填写 DNS 对象内容,不要连外层 {"dns": ...} 一起粘贴。
  3. 检查:核对运行配置是否保留 dns-internal、两条 DNS 传输规则和正确的出站标签。重新启动内核后查看是否有未知字段、缺少数据文件或出站不存在的错误。
  4. 分组测试:选择一个确认在当前 geosite:cn 集合中的域名,再选择一个未匹配域名。清除相关缓存或使用新的测试域名后,观察实际查询连接。
  5. 复核应用:分别检查浏览器安全 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 或自定义配置入口,再重新生成并核对运行配置;保留备份,避免更新时丢失规则。