先确认域名由谁解析,再配置国内域名的专用解析器与其他域名的加密解析器,最后用路由规则指定 DNS 请求的出口。本文适合已经能连接节点、准备修改核心配置的用户;示例是配置片段,不是可直接导入的完整节点文件。
一、先确认 DNS 请求有没有进入核心
先区分两件事:DNS 解析把域名转换成 IP 地址,路由分流决定连接走直连还是代理。只修改 dns 段,不会自动让所有应用的 DNS 请求进入 V2Ray;只添加代理规则,也不能保证应用先前拿到的地址正确。
上面描述的是应用把域名交给核心的典型路径。若应用已经在本地解析,并且只提交 IP 地址,核心看到的输入就不同。浏览器内置的安全 DNS、系统 DNS、客户端内置 DNS 可以同时存在,不能仅凭一个 DNS 输入框判断实际解析链路。
- 系统代理场景:通常只覆盖遵循代理设置的应用。HTTP 代理请求可以携带目标域名,但其他程序仍可能直接使用系统解析器。
- SOCKS 场景:应用需要把域名交给 SOCKS 代理。若应用先自行解析,再提交 IP,内置 DNS 的域名分流不一定参与。
- Android VPN 场景:v2rayNG 使用 Android VPN 接口接管流量,但 DNS 的具体处理仍受应用设置、分应用规则及浏览器行为影响。
- 自定义配置场景:内置 DNS 可供核心内部解析使用。要接收外部程序发来的 DNS 报文,还需要相应入站及 DNS 出站设计,不能只写
dns.servers。
二、读懂 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
}
]
}
}
这里的 skipFallback: true 是为了避免国内解析器参与未命中域名的普通回退查询,不是“国内查询失败后绝不回退”。当国内解析器没有给出符合 expectIPs 的结果时,在未禁用回退的条件下,仍可尝试其他适用服务器。不要把回退和强制隔离混为一谈。
- 先确认核心可读取
geosite.dat与geoip.dat,再启动配置。出现分类加载错误时,先修复数据文件路径或客户端资源,不要继续判断线路质量。 - 保留普通
https://DoH 写法,让查询可以按后文规则经过核心路由。某些核心提供的本地直连型写法会绕过这条路径,不能直接替换后仍假定出口不变。 - 远端解析器使用 IP 形式的 HTTPS 地址,可减少解析器自身域名的引导解析依赖;TLS 证书仍须正常验证,不要关闭验证来掩盖连接错误。
- 这是内置 DNS 的服务器选择配置,不是操作系统 DNS 设置。不要据此认定所有应用已经停止使用本地网络的解析器。
四、配合路由规则,确定 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 代理规则,国内解析请求也会被提前匹配,造成“配置了国内解析器却绕远路”的结果。
- 把 DNS 专用规则放在宽泛规则前。若原配置已有全端口直连、全局代理或按入站统一分流的规则,要核对谁先命中。
- 理解 IPIfNonMatch。当域名未命中适用规则时,核心可以调用内置 DNS 获得地址,再尝试 IP 规则。它不是要求每个域名都先解析。
- 保留原有默认出口设计。片段没有提供最后的全量兜底规则;未命中流量会受完整配置的默认出站影响,合并时必须检查出站顺序。
- 检查代理服务器的引导解析。若代理服务器地址本身是域名,不能让其唯一解析路径又依赖尚未建立的代理。可为该服务器域名单独安排可达的引导解析路径。
五、用日志与对照请求验证分流结果
先验证“由谁解析、走哪个出口”,再比较网页能否打开。单独运行 nslookup 通常是在测试系统指定的解析器,不能直接证明 V2Ray 内置 DNS 已按规则工作。DNS 泄漏检测页面展示的也往往是递归解析服务的出口,不是本机的代理出口。
- 临时提高日志级别。在现有
log对象中把loglevel改为debug,重启核心。结束后恢复warning,避免长期记录大量域名与连接细节。 - 重启测试链路。重启核心可清除本轮核心缓存干扰;关闭并重新打开测试应用,必要时清理应用自身 DNS 缓存。只刷新网页不一定触发新查询。
- 测试一个明确命中国内规则的域名。确认日志里有相应 DNS 查询,并检查到
223.5.5.5:53的请求是否走direct。已缓存或直接命中域名路由的请求不一定产生新的核心解析记录。 - 测试一个未列入国内组的域名。检查是否使用 DoH 解析器,以及它的连接是否走
proxy。不同核心日志文本不同,按服务器地址、目标域名与出站标签交叉判断。 - 分别测应用路径和本地解析路径。桌面端可以用下面两条命令对照,但先把端口改为客户端显示的真实 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 查询,却遗漏对应的连接路径。
最后保留一份能够启动、能够解析、能够连接的配置副本。每次只改一个变量,例如先换解析器,再改域名分组,最后调整回退与地址筛选。需要查阅更多字段时,可打开本站配置字段说明,对照实际核心版本逐项确认。