本文速览

适合已能通过 v2rayN 连接节点、准备检查 DNS 分流的用户。下文以 V2Ray 内核 JSON 为例,区分应用解析、内置 DNS 与代理出站,给出大陆域名优先本地解析、其余域名使用 DoH 的配置片段,并说明如何检查回退、路由与解析结果。代码不是完整客户端配置,也不能直接套进其他内核的 DNS 编辑器。

一、先确认 DNS 请求由谁处理

DNS 设置没有生效,常见原因不是服务器地址错误,而是查询根本没有进入预期的解析器。Windows 系统解析器、浏览器的安全 DNS、V2Ray 内置 DNS,以及代理服务器所在机器的解析器,是不同环节。修改其中一处,不代表其他环节会跟随改变。

应用提交域名 入站接收 路由判断 按需解析 出站连接

上面的链路表示一种常见情况,不表示每个连接都会调用内置 DNS。例如,浏览器通过 HTTP 代理提交域名,代理出站可能把域名交给远端处理;如果应用先在本机解析,再把 IP 交给代理,内核收到的就可能只有 IP。仅启用“系统代理 → 自动配置系统代理”,并不会接管 Windows 的全部 DNS 请求。

二、servers、domains、expectIPs 分别控制什么

servers 定义可用的上游解析器;服务器对象中的 domains 为指定域名建立优先查询关系;expectIPs 对该服务器返回的地址设置预期范围。三者分别对应“问谁”“哪些域名优先问”“什么结果可以接受”,不要把它们都理解成流量路由规则。

字段示例实际作用与边界
servers223.5.5.5、DoH URL配置解析上游,不决定网页连接一定走哪个出口。
domainsgeosite:cn匹配后优先使用该服务器;需要相应的域名规则数据。
expectIPsgeoip:cn检查返回地址是否符合预期;不是可信度证明,也不等于拦截所有污染。
skipFallbacktrue该服务器不参与未命中域名规则时的通用回退,仍可用于自己匹配到的域名。
queryStrategyUseIPv4约束内置 DNS 的地址族策略,不会关闭操作系统的 IPv6。

domains 不是排他的访问控制。匹配服务器查询失败,或者结果不满足 expectIPs,后续仍可能进入回退流程。若希望大陆解析器只负责指定域名,就为它设置 skipFallback: true,再保留一个未限制域名的远程解析器作为默认候选。

结论:先限定本地解析器的适用域名

把大陆解析器放进带 domains 和 skipFallback 的服务器对象,比单纯把它排在列表第一位更明确;否则它可能在回退过程中收到原本打算交给远程解析器的查询。

三、分流 DNS 示例:大陆优先本地,其余走 DoH

下面采用 223.5.5.5 作为大陆域名的优先解析器,采用 https://1.1.1.1/dns-query 作为默认 DoH 上游。这里“本地解析”指从本机直连指定解析服务,不等于使用路由器或运营商自动下发的 DNS。地址只是配置示例,能否访问、返回结果是否合适,需要在自己的网络中验证。

{
  "dns": {
    "queryStrategy": "UseIPv4",
    "servers": [
      {
        "address": "223.5.5.5",
        "port": 53,
        "domains": [
          "geosite:cn"
        ],
        "expectIPs": [
          "geoip:cn"
        ],
        "skipFallback": true
      },
      {
        "address": "https://1.1.1.1/dns-query"
      }
    ]
  }
}

大陆域名优先解析

上游地址
223.5.5.5
传输端口
UDP 53
域名范围
geosite:cn
结果预期
geoip:cn

skipFallback 设为 true,避免成为其他域名的通用回退服务器。

默认 DoH 解析

上游地址
https://1.1.1.1/dns-query
传输端口
HTTPS 443
域名范围
未限定,作为默认候选
出站要求
在路由中明确指定代理出口

配置 DoH URL 后,还要检查连接该地址的请求实际走哪条出站。

命中 geosite:cn 时,优先查询大陆解析器;未命中时,使用没有域名限制的 DoH 候选。大陆解析结果未满足地址预期时,也可能转向后续候选。不要再随手添加一个无域名限制的 localhost,否则系统解析器会重新进入回退路径,破坏原本希望建立的边界。

expectIPs: ["geoip:cn"] 是偏严格的策略。某些大陆站点使用境外 CDN,合法结果也可能被拒绝,从而增加查询时间。遇到这类站点,应先核对具体域名与返回 IP,再调整域名分组或该服务器的预期范围,而不是直接判定“境外 IP 就是污染”。

四、DoH 走代理:还要补上路由规则

DoH 加密的是到解析服务器的传输,不保证请求自动经过代理。V2Ray 中,普通 https:// DoH 请求可以进入路由调度;带 https+local:// 的本地模式则不按同样方式交给路由处理。希望远程 DoH 使用节点出口时,不应把这两个写法混用。

以下仍是需要合并到现有配置的片段。前提是 outbounds 中已经存在标签为 direct 的直连出站,以及标签为 proxy 的可用代理出站。若实际标签不同,必须改成真实标签。将这两条上游地址规则放在可能抢先命中的宽泛规则之前。

{
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "ip": [
          "223.5.5.5/32"
        ],
        "port": "53",
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "1.1.1.1/32"
        ],
        "port": "443",
        "outboundTag": "proxy"
      }
    ]
  }
}

默认情况下,没有规则命中的连接会走默认出站,通常与出站排列有关。不要省略 DoH 的出站检查,再把“能返回结果”当作“已经通过代理解析”。同时,节点服务器若使用域名,也要有独立可用的引导解析路径,避免出现必须先连节点才能解析节点地址的循环依赖。

五、在 v2rayN 应用配置前,保留可回退的基线

v2rayN 是配置管理客户端,不是 DNS 协议本身。客户端界面保存的选项最终会转换成内核运行配置。直接修改临时生成文件,可能在切换节点或重启内核后被覆盖;把 V2Ray JSON 填进不对应的内核配置区,也可能导致启动失败。

  1. 记录当前状态。保存现有 DNS 内容、当前节点与路由模式。先确认原配置可以打开常用网页,再修改解析策略。
  2. 确认配置入口。在“设置 → DNS 设置”选择当前内核对应的配置区域。若该版本提供完整 DNS JSON 编辑区,只填写它要求的 DNS 对象层级,不把整个示例文件塞进去。
  3. 完整配置单独管理。需要自行维护路由和出站时,可使用“服务器 → 添加自定义配置服务器”导入完整内核配置。本文两个片段缺少入站、代理出站等内容,不能作为完整配置直接运行。
  4. 重新启动内核并读日志。先检查 JSON 语法、规则资源与出站标签错误,再做网络测试。保存成功不等于运行成功。
  5. 逐项增加功能。先验证默认 DoH,再加入大陆域名优先解析,最后检查 TUN 或浏览器自己的解析设置。一次只改一个层面,便于定位回归。
53
示例大陆上游的 UDP 端口
443
示例 DoH 的 HTTPS 端口
10808
常见本地混合监听端口,以界面实际值为准

本地混合监听端口不是 DNS 端口。应用把 HTTP 或 SOCKS 代理指向该端口,与把 DNS 服务器填写为该端口,是两种完全不同的操作。应在“设置 → 参数设置”核对“本地混合监听端口”,不要把示例中的 53、443 和 10808 互相替换。

六、验证分流与防污染:分别检查查询、出站和结果

验证目标不是寻找一个“永远正确”的解析 IP,而是确认请求交给了预期上游,连接经过了预期出口,返回地址与网站实际部署相符。CDN 会根据解析器位置、节点出口与时间返回不同地址,两个解析器结果不同本身不能证明发生污染。

检查层面具体动作不能据此推断什么
系统解析基线运行 nslookup www.baidu.com 223.5.5.5,记录应答与错误。不能证明 V2Ray 内置 DNS 已调用该上游。
代理可用性用显式代理请求一个 HTTPS 网站,确认节点可连接。网页能打开不代表所有应用的 DNS 都已被接管。
上游出站观察内核调试日志及路由记录,核对到 1.1.1.1:443 的连接出口。仅看到加密连接不能直接读取或证明具体查询内容。
域名分流分别测试命中大陆规则与未命中规则的域名,记录所选上游。单个域名成功不能证明整份域名规则都已加载正确。
nslookup www.baidu.com 223.5.5.5
ipconfig /flushdns
curl.exe --proxy http://127.0.0.1:10808 --head https://www.microsoft.com/

上述命令是三个独立检查:第一条测试指定解析器;第二条清理 Windows DNS 缓存;第三条测试本地 HTTP 代理链路。运行第三条前,把端口改成界面实际值。它们不是内置 DNS 的自动验收脚本;尤其不能把 nslookup 的结果直接写成“DoH 分流已生效”。

清理系统缓存不会同时清理浏览器和内核的所有缓存。重测时,可重新启动内核并重启测试应用;如果临时提高日志级别,结束后恢复日常级别。调试日志可能包含访问域名,不应整份公开上传。

结论:DoH 解决传输暴露,不包办全部解析风险

只有同时确认上游可达、TLS 验证正常、出站符合预期,以及应用查询进入受控路径,才能评价这套配置是否达到目标;单看检测页显示的解析器名称不够。

七、DNS 分流常见问题

填了 DoH 地址,为什么还是超时?

先检查节点本身能否访问 HTTPS,再核对到 DoH 地址的路由。示例应将 1.1.1.1:443 交给有效的代理出站;同时检查系统时间和 TLS 错误。若改用域名形式的 DoH,还要排查上游域名的引导解析。

加上 expectIPs 后,大陆网站反而变慢了?

检查该域名的真实返回 IP 是否位于境外 CDN。结果不满足 geoip:cn 会触发拒绝或后续回退。先针对该域名调整分组或预期范围,不要反复增加解析器数量来掩盖错误分类。

设了 UseIPv4,为什么系统还能查到 IPv6?

UseIPv4 约束的是当前内置 DNS,不是 Windows 全局设置。检查测试是否来自浏览器独立 DoH、系统解析器或另一应用;若要统一解析,先把应用纳入同一条受控链路,再判断地址族策略。

开启 TUN 后,还需要检查 DNS 设置吗?

需要。TUN 解决流量入口覆盖范围,不自动保证上游选择和出站路径正确。先看实际运行内核,再核对 DNS 接管、局域网解析和远程上游路由;内核改变后,应重新按对应配置格式验证。

把所有域名都交给远程 DoH,会不会更简单?

配置更少,但大陆站点的 CDN 调度可能不适合本地直连,局域网域名也可能无法解析。先保留必要的本地域名策略,再决定是否把普通公网域名统一交给远程上游,不要把内部域名发送给不相关的公共解析服务。