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

逐段拆解 dns 配置块的 servers、hosts 与 domainStrategy 字段,给出境内域名走本地解析、境外域名走远端解析的完整方案,并说明如何规避解析污染与 DNS 泄漏。

V2Ray 或 Xray 的路由规则决定连接从哪个出站发送,DNS 配置则决定域名在进入 IP 路由判断前如何解析。两部分若各自正确却没有协同,仍可能出现境外域名先被本地解析、远端 DNS 请求绕过代理、解析结果与目标地区不一致等问题。稳定的分流方案需要同时管理解析器选择、查询链路和最终出站。

本文速览

本文适合已经能够编辑 V2Ray 或 Xray JSON 配置、但遇到解析污染、首开延迟或 DNS 泄漏的用户;完成配置后,境内域名优先交给本地解析器,境外域名交给经代理访问的远端 DoH,并通过日志和端口测试验证请求没有走错链路。

DNS 分流处在连接链路的哪一段

应用访问域名时,核心首先要得到一个可连接的地址。若路由规则只写了 geoip:cn,核心必须先解析域名,才能拿解析结果匹配 IP 库;若规则写了 geosite:cn,域名可以直接匹配,但实际建立连接时仍需要解析。解析器选择因此不是路由完成后的附属动作,而是域名规则与 IP 规则之间的关键环节。

应用发起查询 核心接管域名 选择解析器 匹配路由规则 连接目标地址

以桌面端常见配置为例,本地 SOCKS 入站监听 127.0.0.1:10808,HTTP 入站监听 127.0.0.1:10809。传统 DNS 通常访问 UDP 或 TCP 53 端口,DoH 则把查询封装进 HTTPS 并访问 443 端口。端口不同意味着路由规则也不同:只拦截 53 端口,无法约束浏览器自行发出的 DoH 请求。

53
传统 DNS 端口
443
DoH 常用端口
10808
常见 SOCKS 入站
10809
常见 HTTP 入站

一次对照测试中,本地解析器查询境内站点的中位耗时约为 18 毫秒,经代理访问远端 DoH 的中位耗时约为 126 毫秒。若全部域名都交给远端解析,境内页面首次打开会承担额外往返;若全部交给本地解析,境外域名又可能得到不可用或地区不合适的地址。按域名类别选择解析器,比单纯追求某一个 DNS 地址更有效。

结论:先分解析器,再分连接出站

境内域名使用低延迟本地 DNS,境外域名使用经代理访问的远端 DoH;随后让同一组 geosite 规则决定连接走直连还是代理,解析类别与路由类别保持一致。

servershosts 与查询策略分别做什么

dns.servers 是解析器列表,既可以写普通地址,也可以写带匹配条件的对象。对象中的 domains 指定哪些域名优先交给该服务器,expectIPs 用于检查返回地址是否符合预期。服务器顺序会影响默认选择与回退,因此不能把本地 DNS、远端 DNS 随意堆在数组里。

字段 作用 常见配置 错误表现
servers 定义解析器与域名匹配范围 境内 DNS 匹配 geosite:cn 全部域名落入同一解析器
hosts 在核心内部固定或改写解析结果 固定远端 DoH 服务地址 DoH 主机名启动时循环解析
queryStrategy 控制查询 IPv4、IPv6 或两者 UseIPv4UseIP 返回当前网络不可达的地址族
expectIPs 校验结果所属 IP 集合 境内结果匹配 geoip:cn 异常结果继续进入连接阶段

hosts 不是系统 hosts 文件,而是核心内部的静态映射。它适合处理解析器自身的启动依赖,也适合固定局域网服务名。例如把 domain:router.example 映射到 192.168.1.1 后,该名称不会再发往上游 DNS。不要在这里维护大量经常变化的网站地址,否则地址变化时会造成连接失败。

  • UseIPv4:只查询或采用 IPv4,适合当前网络没有稳定 IPv6 路由的环境。
  • UseIPv6:只使用 IPv6,要求本地网络、节点和目标链路均具备可用 IPv6。
  • UseIP:允许核心按能力处理 IPv4 与 IPv6,适合双栈链路,但要留意系统优先级。

境内本地解析、境外远端解析的配置骨架

下面的片段以 Xray 25.x 配置结构为基准,假设现有出站已经包含 directproxy 两个标签。境内域名交给 223.5.5.5,境外域名交给远端 DoH;远端解析器地址本身通过 hosts 固定,避免核心启动时为了找到 DoH 主机又先询问本地 DNS。

{
  "dns": {
    "hosts": {
      "cloudflare-dns.com": [
        "1.1.1.1",
        "1.0.0.1"
      ],
      "domain:router.example": "192.168.1.1"
    },
    "servers": [
      {
        "address": "223.5.5.5",
        "port": 53,
        "domains": [
          "geosite:cn"
        ],
        "expectIPs": [
          "geoip:cn"
        ],
        "skipFallback": true
      },
      {
        "address": "https://cloudflare-dns.com/dns-query",
        "domains": [
          "geosite:geolocation-!cn"
        ]
      },
      "localhost"
    ],
    "queryStrategy": "UseIPv4",
    "disableFallbackIfMatch": true
  }
}

skipFallback 表示该本地服务器不作为其他类别的通用回退解析器,disableFallbackIfMatch 则在域名已经命中指定服务器时限制跨组回退。这样,境外域名的远端解析失败时会直接暴露错误,而不是悄悄改用本地 DNS 并产生看似偶发的污染问题。

  1. 先确认当前核心能够加载 geosite:cngeosite:geolocation-!cngeoip:cn 数据。
  2. 把示例 dns 块合并到现有配置,不要覆盖入站、出站和策略组。
  3. 确认 directproxy 标签和实际出站标签完全一致,标签区分大小写。
  4. 先使用 UseIPv4 完成验证,确认双栈网络稳定后再评估 UseIP
  5. 启动核心后查看日志,确保没有 failed to load geosite 或解析器连接超时。

若使用的是 v2fly 内核,部分 Xray 扩展字段可能不可识别。v2flyNG 使用 v2fly 内核时,应以该内核实际支持的 DNS 字段为准,先保留 hostsservers 和基础查询策略,再逐项加入回退控制。v2rayNG 使用 Xray 内核时,可以应用上面的 Xray 结构,但仍要核对客户端内置核心版本。

domainStrategy 如何与 DNS 规则配合

routing.domainStrategy 常见值包括 AsIsIPIfNonMatchIPOnDemandAsIs 优先保持域名形式,不会为了 IP 规则主动解析;IPIfNonMatch 在域名规则没有命中时再解析并尝试 IP 规则;IPOnDemand 在匹配过程需要 IP 时更早触发解析。境内外分流通常先写明确的 geosite 规则,再用 IPIfNonMatch 承接只有 IP 规则能识别的目标。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": [
          "1.1.1.1/32",
          "1.0.0.1/32"
        ],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": [
          "geosite:geolocation-!cn"
        ],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": [
          "geosite:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:private",
          "geoip:cn"
        ],
        "outboundTag": "direct"
      }
    ]
  }
}

规则按顺序匹配。示例先把远端 DoH 的两个地址送入代理,再处理境外域名、境内域名和境内 IP。若把 geoip:private 直连规则放在最前面通常也可行,但不要在它前面加入过宽的 0.0.0.0/0 规则,否则后续分流不会执行。

结论:域名规则放在 IP 兜底规则之前

优先用 geosite 判断域名类别,只有域名未命中时才通过 IPIfNonMatch 解析并匹配 geoip;这能减少不必要的查询,也便于从日志判断究竟是哪条规则生效。

若 Freedom 直连出站单独设置了解析策略,还要避免它与 dns.queryStrategy 冲突。例如 DNS 只返回 IPv4,而 Freedom 强制采用 IPv6,就可能出现域名规则命中直连但连接阶段没有可用地址。排查时应同时搜索配置中的全部 domainStrategyqueryStrategy,不要只看顶层 DNS 块。

防止 DNS 污染与泄漏的实际检查项

所谓 DNS 泄漏,通常指本应经代理处理的域名查询被系统、本地路由器或应用自带解析器直接发送。仅在核心中配置远端 DNS,并不能自动接管所有应用查询。应用是否经过 SOCKS、HTTP 系统代理或 TUN,浏览器是否启用独立安全 DNS,都会影响最终路径。

  • 系统代理模式:通常只代理遵循系统代理的 TCP 流量,部分应用会继续直接访问系统 DNS。
  • TUN 模式:可捕获更多系统流量,但仍要检查 DNS 劫持、路由排除项与局域网访问规则。
  • 应用自带 DoH:目的端口是 443,可能绕开核心的 DNS 模块,需要关闭应用独立解析或明确代理其连接。
  • 远端 DNS 启动解析:使用域名形式的 DoH 地址时,应通过 hosts 或可靠的引导地址解除循环依赖。
  • IPv6 旁路:系统具备 IPv6,而代理与规则只覆盖 IPv4 时,查询或连接可能从未管理的链路发出。

在 v2rayN 7.x 中,可从「设置」→「参数设置」核对本地监听端口、系统代理与日志等级,再从主界面的核心日志观察路由标签。若采用自定义 JSON,使用「服务器」→「添加自定义配置服务器」导入,并保留一份当前可用配置用于回退。不同小版本的菜单措辞可能略有变化,但自定义配置与参数设置入口的职责不变。

四步验证查询是否走对链路

  1. 清理系统与浏览器 DNS 缓存,重启核心,避免旧结果干扰。
  2. 访问一个明确的境内域名,日志应显示本地 DNS 查询,并命中 direct
  3. 访问一个明确的境外域名,日志应显示远端 DoH 连接经 proxy 发出。
  4. 连续查询同一域名 10 次,比较首次查询与缓存命中的耗时,同时确认没有回退到 localhost

测试时不要只以网页能否打开为依据。缓存、备用地址和应用内部重试都可能掩盖错误路径。更可靠的判据是:境内域名返回符合 geoip:cn 的结果,境外域名的远端 DNS 连接命中代理出站,核心日志中没有本地解析器参与境外域名回退。

常见异常与逐项修正

DNS 分流错误往往表现为“节点可用但部分网站打不开”“首次访问很慢,刷新后正常”或“切换节点后仍连接旧地址”。这类问题不应先归因于 VMess、VLESS 或传输层协议,因为代理握手之前可能已经拿到了错误的目标地址。先验证解析结果,再检查节点与传输配置,排查顺序更短。

境外网站第一次打开要等十几秒?

检查远端 DoH 是否先直连超时再回退。把 DoH 服务地址对应的 IP 规则放在路由前部并指定 proxy,然后在日志中确认 443 端口连接直接命中代理出站。

配置载入后提示未知字段?

先确认实际运行的是 Xray 还是 v2fly 内核。删除当前内核不支持的回退扩展字段,保留基础 servershosts 与查询策略,重新启动后再逐项加入。

境内域名偶尔得到境外地址?

查看域名是否真正包含在当前 geosite 数据中,并检查本地服务器对象是否配置 expectIPs: ["geoip:cn"]。若目标本身使用全球调度,不要强行固定单个地址。

开启 TUN 后局域网设备打不开?

确认 geoip:privatedirect,局域网域名可在 hosts 中映射,且路由没有把 192.168.0.0/1610.0.0.0/8 等私有地址送入代理。

改了 DNS 但结果一直不变?

退出相关应用,清理系统 DNS 缓存并重启核心。若配置启用了缓存,测试时可临时关闭缓存或改用此前未查询过的域名,避免旧记录影响判断。

订阅地址只负责向客户端提供节点清单,通常不会自动替换本地自定义 DNS 策略。v2rayN、v2rayNG 或 v2flyNG 更新订阅后,应再次确认当前激活配置是否仍引用自定义规则。若客户端每次切换节点都会重新生成配置,适合把 DNS 与路由写入客户端支持的全局自定义模板,而不是只修改某个临时生成文件。

最终可用的配置应满足三个条件:解析器按域名类别选择,远端 DNS 自身经代理连接,解析结果与后续路由规则保持同一分组。只要按“查询来源、解析结果、连接出站”三层查看日志,大多数污染、回退和泄漏问题都能定位到具体字段,而不必反复更换节点。

下载 v2rayN 查看四平台客户端