V2Ray DNS 分流解析设置:国内外域名分别解析与防污染配置

拆解 dns 段的 servers、domains 与 expectIPs 写法,讲清国内外域名分别走哪路解析,以及如何配合路由规则减少 DNS 污染。

本文速览

先确认域名由谁解析,再配置国内域名的专用解析器与其他域名的加密解析器,最后用路由规则指定 DNS 请求的出口。本文适合已经能连接节点、准备修改核心配置的用户;示例是配置片段,不是可直接导入的完整节点文件。

一、先确认 DNS 请求有没有进入核心

先区分两件事:DNS 解析把域名转换成 IP 地址,路由分流决定连接走直连还是代理。只修改 dns 段,不会自动让所有应用的 DNS 请求进入 V2Ray;只添加代理规则,也不能保证应用先前拿到的地址正确。

应用提交域名 核心匹配规则 按需解析地址 选择连接出口

上面描述的是应用把域名交给核心的典型路径。若应用已经在本地解析,并且只提交 IP 地址,核心看到的输入就不同。浏览器内置的安全 DNS、系统 DNS、客户端内置 DNS 可以同时存在,不能仅凭一个 DNS 输入框判断实际解析链路。

二、读懂 servers、domains 与 expectIPs

先给域名分组,再给分组指定解析器。servers 是解析服务器列表;列表项可以是简单地址,也可以是带匹配条件的对象。需要国内外域名分别解析时,使用对象形式更容易核对行为。

字段用途操作要点
servers列出可用解析器不要把列表理解成永远只问第一项;匹配条件和回退设置都会影响选择。
domains指定优先交给此解析器的域名geosite:cn 依赖核心能读取相应域名数据文件。
expectIPs检查返回地址是否属于预期范围geoip:cn 是地址归属筛选,不是内容安全或域名真实性证明。
skipFallback控制该服务器是否参与未命中域名的回退查询设为 true 后,匹配其 domains 的查询仍可使用它。
queryStrategy选择查询的地址类型UseIPv4 用于只查询 IPv4;不是关闭整个系统的 IPv6。
tag为内置 DNS 查询标记来源可用路由的 inboundTag 匹配,前提是查询经过核心路由。

geosite 是域名分类数据,geoip 是 IP 地址分类数据,两者不能互换。domains 也支持 domain:example.com 这样的域名及子域匹配写法。排查单个站点时,先添加一条明确的域名规则,比同时更换整套分类数据更容易定位。

判断:把 expectIPs 当筛选条件,不当防污染开关

只有明确希望该域名返回中国大陆地址时,才保留 geoip:cn 限制。若站点使用海外 CDN,先检查被拒绝的地址和实际归属,再缩小规则范围,不要把所有非国内地址一概判为污染。

三、配置国内优先与其他域名的加密解析

下面给出一个便于核对的基础片段:国内分类域名优先查询 223.5.5.5,其他域名使用 https://1.1.1.1/dns-query。后者是 DoH,即通过 HTTPS 传输 DNS 查询。示例使用 IPv4,目的是先减少双栈排错变量,并不表示 IPv6 本身有问题。

{
  "dns": {
    "tag": "dns-query",
    "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",
        "skipFallback": false
      }
    ]
  }
}
53
示例国内 UDP DNS 端口
443
HTTPS 默认连接端口
2 组
示例解析服务器配置

这里的 skipFallback: true 是为了避免国内解析器参与未命中域名的普通回退查询,不是“国内查询失败后绝不回退”。当国内解析器没有给出符合 expectIPs 的结果时,在未禁用回退的条件下,仍可尝试其他适用服务器。不要把回退和强制隔离混为一谈。

四、配合路由规则,确定 DNS 从哪里发出去

先检查现有出站标签。以下片段假定已有标签为 direct 的直连出站,以及标签为 proxy 的可用代理出站。它们是示例约定,不会由 DNS 配置自动创建。若现有标签不同,应逐项改成实际名称;VMess 或 VLESS 的节点参数保持原配置。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "inboundTag": ["dns-query"],
        "ip": ["223.5.5.5"],
        "port": "53",
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "inboundTag": ["dns-query"],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:private", "geoip:cn"],
        "outboundTag": "direct"
      }
    ]
  }
}

规则按顺序匹配。第一条只让标记为 dns-query、目标为 223.5.5.5:53 的请求直连;第二条把其他同标签查询交给代理。若先写宽泛的 DNS 代理规则,国内解析请求也会被提前匹配,造成“配置了国内解析器却绕远路”的结果。

  1. 把 DNS 专用规则放在宽泛规则前。若原配置已有全端口直连、全局代理或按入站统一分流的规则,要核对谁先命中。
  2. 理解 IPIfNonMatch。当域名未命中适用规则时,核心可以调用内置 DNS 获得地址,再尝试 IP 规则。它不是要求每个域名都先解析。
  3. 保留原有默认出口设计。片段没有提供最后的全量兜底规则;未命中流量会受完整配置的默认出站影响,合并时必须检查出站顺序。
  4. 检查代理服务器的引导解析。若代理服务器地址本身是域名,不能让其唯一解析路径又依赖尚未建立的代理。可为该服务器域名单独安排可达的引导解析路径。

五、用日志与对照请求验证分流结果

先验证“由谁解析、走哪个出口”,再比较网页能否打开。单独运行 nslookup 通常是在测试系统指定的解析器,不能直接证明 V2Ray 内置 DNS 已按规则工作。DNS 泄漏检测页面展示的也往往是递归解析服务的出口,不是本机的代理出口。

  1. 临时提高日志级别。在现有 log 对象中把 loglevel 改为 debug,重启核心。结束后恢复 warning,避免长期记录大量域名与连接细节。
  2. 重启测试链路。重启核心可清除本轮核心缓存干扰;关闭并重新打开测试应用,必要时清理应用自身 DNS 缓存。只刷新网页不一定触发新查询。
  3. 测试一个明确命中国内规则的域名。确认日志里有相应 DNS 查询,并检查到 223.5.5.5:53 的请求是否走 direct。已缓存或直接命中域名路由的请求不一定产生新的核心解析记录。
  4. 测试一个未列入国内组的域名。检查是否使用 DoH 解析器,以及它的连接是否走 proxy。不同核心日志文本不同,按服务器地址、目标域名与出站标签交叉判断。
  5. 分别测应用路径和本地解析路径。桌面端可以用下面两条命令对照,但先把端口改为客户端显示的真实 SOCKS 监听端口。
curl --socks5-hostname 127.0.0.1:10808 -I https://example.com
curl --socks5 127.0.0.1:10808 -I https://example.com

第一条让 SOCKS 代理处理目标域名,第二条由 curl 在本地解析后提交地址。10808 仅是命令示例,不保证与你的监听端口一致。两条都成功,也不代表核心一定做了解析:代理出站可能把域名继续交给远端服务器处理,最终仍要结合日志确认。

操作判断:先找出请求在哪一步停住

日志没有查询记录,先检查缓存和应用是否提交域名;已有查询但超时,检查解析器出口;已经返回地址却连接失败,再查路由、节点及目标服务。按这三个阶段排查,比反复更换 DNS 地址更有效。

六、DNS 分流常见问题与恢复办法

改完 DNS 后所有网站都打不开,先改哪里?

先恢复备份确认节点仍可用,再检查核心启动日志。优先处理 JSON 语法错误、分类数据加载失败和不存在的出站标签。核心能启动后,检查 DoH 是否依赖同一个尚未完成引导解析的代理服务器域名。

国内网站偶尔失败,是 expectIPs 写错了吗?

先看返回地址是否被 geoip:cn 排除。对单个域名临时移除这项限制或建立更窄的专用规则,重启后复测。若站点确实使用境外 CDN,应调整该站的解析策略,而不是直接判定解析器被污染。

用了 DoH,为什么检测页面还出现本地运营商?

检查浏览器「设置」中的安全 DNS、系统 DNS,以及应用是否绕过代理。再核对核心日志是否真的收到该域名。DoH 只加密走向指定解析器的那条查询链路,不会替所有应用统一接管 DNS。

订阅更新后 DNS 设置怎么又变了?

先区分订阅节点数据与客户端生成的核心配置。不要修改每次启动都会重建的临时 JSON;在客户端持久化 DNS 设置或自定义配置入口保存。更新后重新查看实际生效配置,核对 dns 和规则顺序。

只查 IPv4 会不会导致部分应用异常?

可能影响依赖 IPv6 的目标。先用 UseIPv4 完成基础验证,再在支持双栈的环境改为 UseIP,同时检查 IPv6 路由和出口。不要只恢复 AAAA 查询,却遗漏对应的连接路径。

最后保留一份能够启动、能够解析、能够连接的配置副本。每次只改一个变量,例如先换解析器,再改域名分组,最后调整回退与地址筛选。需要查阅更多字段时,可打开本站配置字段说明,对照实际核心版本逐项确认。

客户端下载