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

DNS 分流的重点不是简单替换解析服务器,而是让不同类别的域名进入对应解析链路,并对返回地址进行校验。配置正确后,境内域名可保持本地解析效率,境外域名则能避开不合适的解析路径。

本文速览

本文适合已经能够编辑 V2Ray 或 Xray JSON 配置、并希望处理域名解析异常的用户。内容从内置 DNS 的生效边界讲起,解释 servers、domains、expectIPs 与路由策略的关系,给出可检查、可回退的境内外分开解析方案。

先分清 DNS 查询经过哪条链路

应用访问域名时,最先发生的通常不是代理连接,而是把域名转换成 IP 地址。若应用直接调用系统 DNS,查询可能在进入 V2Ray 前已经完成;此时只修改配置文件里的 dns 段,不一定会改变应用拿到的结果。只有查询由内置 DNS、DNS 入站、透明代理捕获链路或客户端提供的相应功能接管时,内置规则才会参与处理。

另一个容易混淆的点是“DNS 服务器的选择”和“业务流量的分流”属于两个步骤。dns.servers 决定某个域名交给哪台解析服务器,routing.rules 决定解析请求及后续连接走哪个出站。即使域名被分给境外 DoH,若该 DoH 请求仍从不合适的直连路径发出,也可能出现超时或连接被重置。

应用请求域名DNS 接管域名规则匹配指定服务器解析地址校验业务路由

完整链路应当按顺序检查:应用是否把查询交给客户端、域名是否命中预期服务器、解析服务器的请求走哪条出站、返回地址是否通过校验、最终业务连接又命中了哪条路由。只观察网页能否打开,无法区分问题发生在哪一层。

servers、domains 与 expectIPs 各自负责什么

servers

定义解析服务器列表。对象条目可附加匹配条件、端口和回退控制;无条件条目通常作为默认或回退解析。

domains

决定查询优先交给哪台服务器。domain: 覆盖域名及其子域名,full: 只匹配完整主机名;地理分类依赖当前数据文件。

expectIPs

检查返回 IP 是否符合预期,不负责选择解析服务器,也不能替代域名分类。范围不符时核心可尝试后续解析路径。

境内域名解析

服务器
223.5.5.5
端口
53
匹配
geosite:cn
预期地址
geoip:cn

适合优先获取距离较近的境内服务地址。

境外域名解析

服务器
1.1.1.1 DoH
传输
HTTPS
匹配
geolocation-!cn
预期地址
geoip:!cn

建议让 DoH 请求经过可稳定访问该服务的出站。

queryStrategy 控制查询地址族。UseIPv4 只请求 IPv4,适合本地 IPv6 不完整或代理节点没有 IPv6 出站能力的环境;UseIPv6 只请求 IPv6;UseIP 允许同时使用两类结果。地址族选择必须与节点、系统网络和路由规则一致,否则可能表现为 DNS 有结果但连接持续超时。

一份可调整的境内外分开解析配置

下面示例展示的是核心结构,不包含节点凭据和完整出站。境内分类交给 UDP 53 解析服务器,境外分类交给基于 HTTPS 的解析服务器,并以本机解析作为最后回退。示例采用 IP 形式的 DoH 地址,目的是减少解析 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",
        "domains": [
          "geosite:geolocation-!cn"
        ],
        "expectIPs": [
          "geoip:!cn"
        ],
        "skipFallback": true
      },
      "localhost"
    ]
  },
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": [
          "223.5.5.5"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "1.1.1.1"
        ],
        "outboundTag": "proxy"
      }
    ]
  }
}

示例假设现有配置中已经存在名为 directproxy 的出站标签。若实际标签是 freedommain 或其他名称,必须按现有配置修改,不能直接照抄。路由规则还要放在合适顺序:更具体的 DNS 服务器地址规则应位于宽泛的境内 IP 直连规则之前,否则会被前面的规则提前命中。

skipFallback 表示当前服务器不参与普通回退流程,但不同核心版本对 DNS 回退细节和扩展字段的支持可能不同。使用 V2Ray 5.x、Xray 25.x 或由客户端附带的其他核心时,应以实际核心启动日志为准。若日志提示未知字段,应先移除该字段完成基础验证,再依据当前核心文档补充回退控制。

配置项 示例值 主要作用 常见错误
domains geosite:cn 选择解析服务器 误当成业务路由规则
expectIPs geoip:cn 校验返回地址范围 范围过严导致频繁回退
queryStrategy UseIPv4 控制查询地址族 与实际网络能力不一致
domainStrategy IPIfNonMatch 控制路由阶段的域名解析 与 DNS 服务器选择混为一谈

结论:先把解析请求的出站固定下来

境内外服务器写对但结果仍不稳定时,优先检查 223.5.5.5 是否命中 direct、1.1.1.1 是否命中 proxy;解析服务器自身走错出站,比域名分类遗漏更容易造成整批请求失败。

从日志验证分流是否真正生效

  1. 先备份并单独替换 DNS

    不要一次改动 DNS、路由、节点和系统代理。先备份可用配置,只替换 DNS 段并重启核心,把“无法启动”和“解析不符”分开处理。

  2. 确认语法后增加出站规则

    核心正常启动后,再添加解析服务器的出站规则,避免多个变量同时变化。

  3. 按客户端重载配置

    v2rayN 可在主界面打开日志窗口;Android 上的 v2rayNG 或 v2flyNG 应先断开,保存配置后重新连接,避免旧核心继续使用缓存。

53
传统 DNS 常用端口
443
DoH 常用端口
3 次
每类域名建议测试次数
30 秒
重启后首轮观察窗口
  1. 准备一个明确属于境内分类的域名、一个境外分类域名,以及一个自定义完整域名规则,避免只用单一网站判断。
  2. 清理系统和浏览器可控范围内的 DNS 缓存,然后重启当前客户端核心,记录测试开始时间。
  3. 每类域名连续访问三次,在日志中确认查询目标、命中的服务器和最终出站标签。
  4. 分别测试代理开启与关闭状态,确认失败是否只发生在 DoH 请求需要经过代理的场景。
  5. expectIPs 暂时移除再测试一次;若问题消失,说明返回地址与预期集合冲突,应调整分类而不是盲目更换节点。

延迟也应分层记录。一次完整访问包含 DNS 时间、TCP 或 UDP 建连时间、TLS 握手和服务器响应时间。若日志显示 DNS 在 40 毫秒内完成,而页面等待超过 3 秒,问题更可能位于业务连接或路由,而不是解析。反过来,如果 DNS 请求连续在 5 秒附近超时,才应重点检查服务器可达性和出站选择。

结论:用两组域名和一条自定义规则交叉验证

只测试热门网站容易受到缓存和多区域调度影响;加入 full: 精确规则后,可以直接确认 domains 匹配是否工作,再判断 geosite 数据是否需要更新。

高频故障与对应处理方法

DNS 分流最常见的问题不是 JSON 格式,而是规则彼此覆盖。服务器对象中的 domains 负责解析选择,路由中的 domainip 负责连接分流;两处都可能引用 geosite 或 geoip,但执行阶段不同。排查时应明确当前看到的是 DNS 查询日志还是业务连接日志。

配置保存后核心直接启动失败?

先查看日志中的字段名和行号,确认逗号、括号与数组格式。若提示未知字段,删除 skipFallback 等扩展项,以最小的 servers 配置启动,再按当前核心支持范围逐项加回。

境外域名还是交给了本地服务器?

检查默认服务器是否排在前面并提前参与查询,再确认 geosite:geolocation-!cn 数据可用。可临时加入 full:目标域名 精确规则,观察是否转到指定 DoH。

解析得到地址,但网页仍然打不开?

查看后续连接命中的 outboundTag。DNS 成功只说明获得了地址,不代表业务流量已走 proxy;同时检查系统代理、本地监听端口 10808 与路由规则顺序。

开启 expectIPs 后部分网站变慢?

内容分发网络可能返回跨区域地址,严格的 geoip:cngeoip:!cn 会触发额外尝试。为该域名增加更准确的 domain: 规则,或只对稳定分类使用地址校验。

电脑正常,Android 客户端结果不同?

确认两端使用的核心类型、geosite 数据和查询策略一致。v2rayNG 通常使用 Xray 内核,v2flyNG 使用 v2fly 内核;相同 JSON 在扩展字段和回退细节上可能存在差别。

修改后为何看起来没有生效?

操作系统、浏览器、客户端核心和上游解析服务器都可能缓存记录。优先测试未访问过的子域名,或等待记录有效期结束;重启客户端不能强制所有上游立即返回新结果。

为何同一域名会出现两组结果?

浏览器安全 DNS 与客户端接管可能形成两条查询链。诊断阶段应暂时统一入口,让查询明确经过当前核心,验证完成后再决定是否保留应用自己的解析功能。

把配置落到 v2rayN、v2rayNG 与 v2flyNG

v2rayN 桌面端适合进行完整配置检查,因为日志窗口和自定义配置编辑更便于对照。编辑前先导出现有配置,在「设置」→「参数设置」确认核心类型,再把 DNS 对象合并到顶层 JSON。不要在同一个文件中保留两个同名 dns 对象,后出现的内容可能覆盖前面的设置。

Android 客户端更适合在桌面端完成验证后同步思路,而不是直接复制全部配置。v2rayNG 使用 Xray 内核,v2flyNG 使用 v2fly 内核,两者对字段支持、默认查询策略和客户端生成配置的方式可能不同。若客户端通过订阅自动生成运行配置,手工修改的临时内容还可能在订阅更新后被重建。

客户端 建议检查项 适合的操作方式
v2rayN 核心类型、日志、路由标签、10808 本地端口 先用自定义配置完成分步验证
v2rayNG Xray 字段兼容、VPN 模式、分应用代理范围 重新连接后读取实际运行日志
v2flyNG v2fly 字段支持、geosite 数据、查询策略 按 v2fly 内核支持范围精简配置

稳定方案应保留一个明确的回退路径,但回退不能掩盖主要服务器长期失效。建议先让境内 UDP 53 与境外 DoH 各自准确命中,再增加本机解析作为最后兜底。若默认服务器承担了大多数查询,说明 domains 分类或数据文件仍有问题,不能把“最终能打开”当成分流已经正确。