V2Ray DNS 分流配置详解:境内外域名分开解析与防 DNS 污染实践

逐段拆解 dns 配置块:按域名分流到不同上游、DoH 与本地解析搭配、与路由规则联动的顺序,以及排查解析被污染的方法。

本文速览

适合已经能用 v2rayN 连接节点、但遇到域名解析异常或分流结果不稳定的读者。先分清谁在解析域名,再用境内 DNS、境外 DoH 和路由规则各司其职;最后按请求路径检查缓存、日志与实际出口。

先确认 DNS 请求由谁发出

DNS 分流不是把两个服务器地址填进列表就结束了。浏览器可能自行解析域名,操作系统也可能先得到 IP;只有域名进入 V2Ray 或 Xray 内核的解析流程时,配置中的 dns 规则才有机会参与。v2rayN 开启「系统代理」主要影响遵循系统代理的应用,不等于接管整台设备的全部 DNS 请求。

先用一个正常可用的节点建立连接,再记录同一网站在浏览器和其他应用中的表现。如果只有某个浏览器异常,优先检查它自己的安全 DNS 设置;如果只有直连应用异常,先确认该应用的流量是否经过客户端。不要一开始就同时改系统 DNS、TUN 和路由规则,否则很难判断哪一步起效。

应用请求域名代理接收请求匹配解析规则查询指定上游路由选择出口

按域名选择境内 DNS 与境外 DoH

下面是供理解结构的 dns 片段,不是可直接导入 v2rayN 的完整配置。示例用 geosite:cn 匹配常见境内域名,交给普通 DNS;用 geosite:geolocation-!cn 匹配相应域名,交给 DoH。未被前两组命中的域名交给最后的兜底上游。实际生效还取决于所用内核、规则数据和配置生成方式。

{
  "dns": {
    "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"]
      },
      "localhost"
    ]
  }
}

address 指定上游;普通 DNS 示例使用 53 端口,DoH 地址使用 HTTPS,通常通过 443 端口建立连接。domains 决定域名优先匹配哪一项,不是访问控制名单。expectIPs 是返回地址的筛选条件:示例要求境内上游的结果落在 geoip:cn 范围内;它不能证明一个域名必然应该解析到境内 IP,跨区域部署的网站尤其可能出现不符合预期的结果。

53
示例普通 DNS 端口
443
HTTPS 查询常用端口
2 组
按域名指定的上游

localhost 是未命中前述域名规则时的兜底解析方式,会使用本机解析环境;如果正在排查本机 DNS 污染,不要把兜底结果误认为已经经过 DoH。DoH 地址本身也必须能够连通。遇到超时,应分别确认当前网络能否访问该上游,以及内核发出的 DNS 连接实际从哪个出口离开;仅修改 servers 列表无法保证查询一定经过代理。

在 v2rayN 中保存设置并核对路由

v2rayN 的界面会随版本调整,先在「设置」中找到「DNS 设置」,查看当前使用的配置模式和可编辑项。若界面提供自定义 DNS 配置,先备份原内容,再按其要求填写;不要把上面的片段贴进只接受服务器地址的输入框。保存后重新启动内核,并查看客户端日志是否出现 JSON 解析错误或 DNS 上游连接失败。

解析侧:先确定查询对象

入口
「设置」→「DNS 设置」
境内匹配
geosite:cn
境外匹配
geosite:geolocation-!cn
兜底
检查 localhost 的实际结果

编辑前留存原配置;确认所用模式允许修改内核 DNS 规则。

路由侧:再确定连接出口

入口
「设置」→「路由设置」
境内规则
按域名匹配直连
境外规则
按域名匹配代理
默认出口
核对未命中规则的去向

同时检查规则优先级与当前启用的路由方案,不只看规则是否存在。

路由规则和 DNS 规则要表达一致的意图。例如,境内域名由境内上游解析,却被一条更靠前的宽泛代理规则抢先匹配,就可能出现“解析正常但出口不对”。在「设置」→「路由设置」里确认当前启用的规则集,再查看具体规则的先后顺序。订阅更新通常负责服务器列表,不应假定更新订阅会同步修好本机 DNS 与路由配置。

如果连接进入内核时仍保留域名,路由可以先按域名规则匹配;domainStrategy 会影响何时为路由判断解析 IP。AsIs 不为路由主动解析域名,IPIfNonMatch 在域名规则未命中时尝试解析,IPOnDemand 遇到需要 IP 判断的规则时可触发解析。这些选项解决的是路由判断时机,不会让未进入内核的系统 DNS 请求自动改走指定上游。

区分 DNS 污染、缓存和分流失配

排查时固定一个域名、一个应用和一个节点,每次只改一项。先看域名能否打开,再看内核日志是否记录 DNS 查询、查询失败或路由命中。若只有个别域名失败,优先比较不同上游返回的地址;若所有域名都失败,先检查节点连接、DoH 可达性和配置语法,别直接断定是 DNS 污染。

  1. 确认入口。在浏览器中测试,再用另一款遵循系统代理的应用对照。只有直连应用失败时,检查系统代理或 TUN 状态,而不是先增加 DNS 规则。
  2. 确认查询。在 v2rayN 日志中查找目标域名及 DNS 错误。日志完全看不到对应请求时,检查应用自身的安全 DNS、系统缓存,以及流量是否进入内核。
  3. 确认出口。对照「路由设置」里启用的规则与日志中的出站结果。返回 IP 正常但连接失败时,再检查路由、节点与目标服务,而不是反复替换上游。
  4. 清除旧结果后复测。Windows 可在命令提示符运行 ipconfig /flushdns 清理系统 DNS 缓存;随后重启测试应用,避免把旧解析结果当作新配置的效果。

若域名已在应用侧解析成 IP 才交给代理,内核可能只能按 IP 规则判断。流量嗅探在适用的 HTTP 或 TLS 连接中可能帮助恢复域名信息,但不能覆盖所有协议,也不能替代正确的 DNS 入口。先弄清请求路径,再决定是否调整嗅探和 IP 路由规则。

常见问题:改了 DNS 仍然不生效?

填了 DoH 地址,网页反而一直等待?

先检查 https://1.1.1.1/dns-query 所需的 HTTPS 连接是否可达,再看内核日志有无超时。DoH 查询的连接出口需要单独核对,不能仅凭目标网站走代理来推断。

境内网站被判成境外怎么办?

先检查 geosite 规则数据与启用的路由方案,再查看该域名是否命中指定的 domains 项。跨区域服务不一定符合按 IP 所在地划分的预期,可针对该域名建立更明确的规则。

只有一个浏览器显示解析错误?

检查该浏览器自己的安全 DNS 设置,关闭后重新测试,并重启浏览器清掉旧连接。若其他应用一直正常,先不要改动全局 DNS 配置。

保存配置后所有网站都打不开?

先恢复备份,在日志里找配置解析报错。确认输入位置接受完整的 dns 对象,而不是只接受上游地址;每次只加入一条规则,保存并重启内核测试。

改完路由,DNS 返回值怎么还是旧的?

路由规则不会主动刷新已经缓存的解析结果。先清理系统缓存、重启测试应用,再确认内核是否发出了新查询;不要把连接出口变化当作 DNS 返回值变化。

配置完成后的验收标准很简单:选一个境内域名、一个境外域名,分别确认它们的解析上游、路由命中结果与实际可访问性。三项都对上,再扩大到日常使用的应用。若问题只出现在 v2rayNG 或 v2flyNG,也应分别核对安卓端所用内核和客户端配置;桌面端 v2rayN 的设置不会自动复制到其他设备。

查看客户端下载