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 请求。
一次对照测试中,本地解析器查询境内站点的中位耗时约为 18 毫秒,经代理访问远端 DoH 的中位耗时约为 126 毫秒。若全部域名都交给远端解析,境内页面首次打开会承担额外往返;若全部交给本地解析,境外域名又可能得到不可用或地区不合适的地址。按域名类别选择解析器,比单纯追求某一个 DNS 地址更有效。
结论:先分解析器,再分连接出站
境内域名使用低延迟本地 DNS,境外域名使用经代理访问的远端 DoH;随后让同一组 geosite 规则决定连接走直连还是代理,解析类别与路由类别保持一致。
servers、hosts 与查询策略分别做什么
dns.servers 是解析器列表,既可以写普通地址,也可以写带匹配条件的对象。对象中的 domains 指定哪些域名优先交给该服务器,expectIPs 用于检查返回地址是否符合预期。服务器顺序会影响默认选择与回退,因此不能把本地 DNS、远端 DNS 随意堆在数组里。
| 字段 | 作用 | 常见配置 | 错误表现 |
|---|---|---|---|
servers |
定义解析器与域名匹配范围 | 境内 DNS 匹配 geosite:cn |
全部域名落入同一解析器 |
hosts |
在核心内部固定或改写解析结果 | 固定远端 DoH 服务地址 | DoH 主机名启动时循环解析 |
queryStrategy |
控制查询 IPv4、IPv6 或两者 | UseIPv4 或 UseIP |
返回当前网络不可达的地址族 |
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 配置结构为基准,假设现有出站已经包含 direct 与 proxy 两个标签。境内域名交给 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 并产生看似偶发的污染问题。
- 先确认当前核心能够加载
geosite:cn、geosite:geolocation-!cn与geoip:cn数据。 - 把示例
dns块合并到现有配置,不要覆盖入站、出站和策略组。 - 确认
direct与proxy标签和实际出站标签完全一致,标签区分大小写。 - 先使用
UseIPv4完成验证,确认双栈网络稳定后再评估UseIP。 - 启动核心后查看日志,确保没有
failed to load geosite或解析器连接超时。
若使用的是 v2fly 内核,部分 Xray 扩展字段可能不可识别。v2flyNG 使用 v2fly 内核时,应以该内核实际支持的 DNS 字段为准,先保留 hosts、servers 和基础查询策略,再逐项加入回退控制。v2rayNG 使用 Xray 内核时,可以应用上面的 Xray 结构,但仍要核对客户端内置核心版本。
domainStrategy 如何与 DNS 规则配合
routing.domainStrategy 常见值包括 AsIs、IPIfNonMatch 与 IPOnDemand。AsIs 优先保持域名形式,不会为了 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,就可能出现域名规则命中直连但连接阶段没有可用地址。排查时应同时搜索配置中的全部 domainStrategy 与 queryStrategy,不要只看顶层 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,使用「服务器」→「添加自定义配置服务器」导入,并保留一份当前可用配置用于回退。不同小版本的菜单措辞可能略有变化,但自定义配置与参数设置入口的职责不变。
四步验证查询是否走对链路
- 清理系统与浏览器 DNS 缓存,重启核心,避免旧结果干扰。
- 访问一个明确的境内域名,日志应显示本地 DNS 查询,并命中
direct。 - 访问一个明确的境外域名,日志应显示远端 DoH 连接经
proxy发出。 - 连续查询同一域名 10 次,比较首次查询与缓存命中的耗时,同时确认没有回退到
localhost。
测试时不要只以网页能否打开为依据。缓存、备用地址和应用内部重试都可能掩盖错误路径。更可靠的判据是:境内域名返回符合 geoip:cn 的结果,境外域名的远端 DNS 连接命中代理出站,核心日志中没有本地解析器参与境外域名回退。
常见异常与逐项修正
DNS 分流错误往往表现为“节点可用但部分网站打不开”“首次访问很慢,刷新后正常”或“切换节点后仍连接旧地址”。这类问题不应先归因于 VMess、VLESS 或传输层协议,因为代理握手之前可能已经拿到了错误的目标地址。先验证解析结果,再检查节点与传输配置,排查顺序更短。
境外网站第一次打开要等十几秒?
检查远端 DoH 是否先直连超时再回退。把 DoH 服务地址对应的 IP 规则放在路由前部并指定 proxy,然后在日志中确认 443 端口连接直接命中代理出站。
配置载入后提示未知字段?
先确认实际运行的是 Xray 还是 v2fly 内核。删除当前内核不支持的回退扩展字段,保留基础 servers、hosts 与查询策略,重新启动后再逐项加入。
境内域名偶尔得到境外地址?
查看域名是否真正包含在当前 geosite 数据中,并检查本地服务器对象是否配置 expectIPs: ["geoip:cn"]。若目标本身使用全球调度,不要强行固定单个地址。
开启 TUN 后局域网设备打不开?
确认 geoip:private 走 direct,局域网域名可在 hosts 中映射,且路由没有把 192.168.0.0/16、10.0.0.0/8 等私有地址送入代理。
改了 DNS 但结果一直不变?
退出相关应用,清理系统 DNS 缓存并重启核心。若配置启用了缓存,测试时可临时关闭缓存或改用此前未查询过的域名,避免旧记录影响判断。
订阅地址只负责向客户端提供节点清单,通常不会自动替换本地自定义 DNS 策略。v2rayN、v2rayNG 或 v2flyNG 更新订阅后,应再次确认当前激活配置是否仍引用自定义规则。若客户端每次切换节点都会重新生成配置,适合把 DNS 与路由写入客户端支持的全局自定义模板,而不是只修改某个临时生成文件。
最终可用的配置应满足三个条件:解析器按域名类别选择,远端 DNS 自身经代理连接,解析结果与后续路由规则保持同一分组。只要按“查询来源、解析结果、连接出站”三层查看日志,大多数污染、回退和泄漏问题都能定位到具体字段,而不必反复更换节点。