本文面向已经能连接节点、需要调整 DNS 分流的用户。先确认域名由应用、系统还是内核解析,再用国内域名优选规则与远端 DoH 配置分配查询,最后通过日志验证解析路径。示例是配置片段,需要合并到现有配置;它不会自动接管系统 DNS,也不能代替可用的代理出站。
一、DNS 分流与连接分流的区别
DNS 分流决定“向哪个解析器查询域名”,连接分流决定“网站连接走哪个出站”。两者相关,但不是同一条规则。把国内网站设为直连,不代表该网站一定使用国内 DNS;把某个 DNS 地址设为代理,也不代表网站连接自动经过代理。
这条链描述需要内核解析时的典型过程,不代表每个请求都经过全部环节。浏览器若先通过自己的安全 DNS 得到 IP,再把 IP 交给代理,内核可能根本收不到原始 DNS 查询。反过来,应用把域名交给 SOCKS 代理后,域名也可能继续传给代理服务端,由服务端完成解析。
- 系统解析:应用调用操作系统解析接口,结果通常受网卡 DNS、系统缓存和本地网络影响。
- 内核解析:路由判断或出站连接需要 IP 时,V2Ray、Xray 的内置 DNS 才可能参与。
- 应用自带解析:浏览器自带 DoH 可以绕开系统 DNS,需要单独检查。
- 服务端解析:域名经 VMess、VLESS 等代理出站传到远端后,可能由远端处理,不受本机
dns.servers直接控制。
二、servers、domains 与 expectIPs 的作用
dns.servers 是解析服务器列表。列表项既可以是简单地址,也可以是带域名匹配条件的对象。对象中的 domains 用于优选匹配服务器;expectIPs 用于检查返回地址是否符合预期。后者不是连接路由规则,也不是对解析结果真实性的证明。
| 字段 | 本文取值 | 实际含义 |
|---|---|---|
servers | 国内 UDP DNS 与远端 DoH | 定义内核可使用的解析器。 |
address | 223.5.5.5 | 普通 IP 地址在此示例中用于 UDP DNS 查询。 |
domains | geosite:cn | 命中域名集合时优先选择该服务器,需有对应域名数据文件。 |
expectIPs | geoip:cn | 按地址集合筛选结果;不匹配可能导致本次结果被拒绝并触发后续尝试。 |
skipFallback | true | 该服务器不参与普通回退查询,仍可被自身域名规则选中。 |
queryStrategy | UseIPv4 | 本文只请求 IPv4 地址,便于先排除 IPv6 路径变量。 |
geosite:cn 是数据集中的域名分类,不等同于所有以 .cn 结尾的域名;geoip:cn 也依赖所用地址库。跨地区 CDN、企业专线与地址库更新都可能影响判断。因此,不能把“国内域名返回境外 IP”直接判为污染。
结论:先验证分类,再收紧地址筛选
如果某个国内网站加上 expectIPs 后开始解析失败,先临时移除该限制并比较返回地址。确认是正常 CDN 调度后,再为该域名单独设置解析器,不要反复更换节点掩盖分类问题。
三、国内优选与远端 DoH 配置片段
下面采用“国内分类优选国内 DNS,其余查询使用远端 DoH”的基础结构。第一项使用公共国内解析器,不是家庭路由器地址;如果需要运营商内网域名,应另行指定实际的内网 DNS。第二项使用 IP 形式的 DoH 地址,避免为 DoH 服务器名称额外进行引导解析。
{
"dns": {
"queryStrategy": "UseIPv4",
"servers": [
{
"address": "223.5.5.5",
"port": 53,
"domains": [
"geosite:cn"
],
"expectIPs": [
"geoip:cn"
],
"skipFallback": true
},
"https://1.1.1.1/dns-query"
]
}
}
这不是完整的 config.json。应把 dns 对象合并到原有顶层,不能在一个 JSON 对象内重复添加同名键。已有 DNS 设置时,应修改现有段落,而不是把两个片段前后粘贴。JSON 中也不能直接加入解释性注释。
- 确认运行的是支持这些字段的 V2Fly 或 Xray 内核,并查看当前内核启动日志。客户端名称和内核版本不是同一个概念。
- 确认内核能读取包含
cn分类的域名库与地址库;缺失数据时,先处理加载错误。 - 保留现有
inbounds、outbounds,再合并 DNS 设置,重新加载配置并检查错误日志。 - 先用少量已知域名验证,再逐步扩大匹配范围。若网络确实需要 IPv6,应在验证双栈连通性后调整查询策略。
四、让 DNS 查询本身走正确出站
写入 DoH 地址只说明查询协议,不说明网络出口。普通 https:// 形式的内置 DoH 查询会受内核路由影响;若默认出站是直连,远端 DoH 仍可能直接连接。不要把它与绕过常规路由的本地解析形式混用,也不要认为“加密”就等于“已经经过代理”。
以下路由片段假定已有名为 direct 与 proxy 的出站标签。必须将标签替换成现有配置中实际的 tag,或先配置对应出站。示例用精确 IP 和端口约束 DNS 连接,避免把这些地址的所有流量都纳入同一规则。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": ["223.5.5.5"],
"port": "53",
"network": "udp",
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["1.1.1.1"],
"port": "443",
"network": "tcp",
"outboundTag": "proxy"
}
]
}
}
把这两条规则合并到原有 routing.rules 中,并放在可能提前命中的宽泛规则之前。路由按顺序匹配,前面的规则已经命中时,后面的 DNS 专项规则不会再生效。该片段只安排解析器连接,不负责完整的网站分流。
IPIfNonMatch表示域名规则未命中时,可能先解析再尝试 IP 规则。若域名已匹配某条代理规则,就不一定触发本机内置 DNS。- 代理节点若使用域名,也有引导解析需求。不要让“连接 DoH 需要代理、建立代理又必须依赖同一 DoH”形成循环。
- 本文采用数字 IP 的 DoH 地址,但仍需正常进行 TLS 证书验证;不要通过关闭证书验证解决连接失败。
- 如果当前网络无法建立远端 DoH 连接,先验证代理出口,再调整 DNS;仅更换
domains无法修复出口故障。
五、在 v2rayN 与安卓客户端中验证
v2rayN 的常规节点配置往往由客户端生成。直接修改运行目录中的临时配置,可能在切换节点或重启后被覆盖。应使用当前版本提供的 DNS 设置或自定义配置入口,保存后检查实际生成的配置。v2rayNG 使用 Xray 内核,v2flyNG 使用 V2Fly 内核;客户端自己的远程 DNS、VPN 与路由选项,不能一概等同于原生 JSON 字段。
- 记录基线:保存原配置,记录当前节点、本机监听端口、系统 DNS 与浏览器安全 DNS 状态。一次只改变一个解析设置。
- 确认入口:以下命令假定本机存在
127.0.0.1:10808SOCKS 入站。若客户端显示其他端口,先更改命令;不要把测试端口当成所有版本的默认值。 - 比较路径:分别测试应用本地解析与把域名交给代理的请求。两者结果不同,说明需要继续检查解析发生位置。
- 检查日志:临时将
log.loglevel调为info,结合请求时间核对 DNS 与出站记录。不同内核输出细节不同,必要时短暂使用debug,完成后恢复原级别。
curl --socks5 127.0.0.1:10808 -I https://www.qq.com
curl --socks5-hostname 127.0.0.1:10808 -I https://www.qq.com
nslookup www.qq.com 223.5.5.5
第一条命令通常由 curl 在本地解析网站域名;第二条把域名交给 SOCKS 代理,后续解析位置由内核路由和出站决定。因此,第二条成功并不能单独证明使用了本机内置 DNS。第三条直接查询指定公共 DNS,只能作为解析器连通性对照,不能证明 dns.servers 已生效。在 Windows PowerShell 中,如遇到命令别名差异,可使用 curl.exe。
结论:用查询路径证明配置,而不是只看网页能否打开
修改后重启相关应用并等待或清理对应缓存,再重复测试。若日志没有预期的解析记录,先确认请求是否进入内核;不要仅凭打开网页或一次延迟变化,宣布 DNS 分流已经完成。
六、DNS 防污染与常见故障
防污染的重点是查询传输、解析器可信度、结果使用位置与回退策略。DoH 可以保护客户端到 DoH 解析器之间的传输,但不会自动修复错误分类、代理出口不可达或应用自带解析。expectIPs 只是地址范围约束,不能替代加密传输,也不能识别所有错误答案。
加了 expectIPs,国内网站反而打不开怎么办?
先临时移除该服务器的 expectIPs,重新加载后查询同一域名。若返回的是正常境外 CDN 地址,应调整该域名的解析策略或核对地址库,而不是强制把所有结果都限定为国内地址。
配置了远端 DoH,为什么仍看到本地 DNS 请求?
先核对请求属于哪个进程。浏览器、系统服务和不使用代理的应用仍可能独立解析;代理节点域名也可能需要引导解析。检查系统 DNS、浏览器安全 DNS和客户端 DNS 接管设置,不能只修改 dns 段。
打开网页很慢,是不是 DNS 服务器不够多?
先区分解析等待、TCP 建连和 TLS 握手耗时。保留一个国内优选解析器与一个可达的远端 DoH 作为基线,检查超时及回退记录。堆叠多个失联解析器可能增加等待,也可能把查询扩散给更多服务器。
改完 JSON,切换节点后为什么又恢复了?
通常是客户端重新生成了运行配置。回到客户端支持的 DNS 设置或自定义配置入口保存,并在切换节点后核对生成结果。订阅负责更新节点资料,不等于自动保存手工修改的临时配置。
只保留 IPv4 能长期使用吗?
UseIPv4 适合先排除双栈干扰,但会放弃 IPv6 地址查询。若所在网络和代理出口都具备稳定 IPv6 连通性,可以测试 UseIP,再分别检查 IPv4、IPv6 路由及应用行为。
最终应保留三项可核对的结果:域名在哪一层解析、DNS 连接从哪个出站发出、解析失败时回退到哪里。需要对照顶层配置关系时,可查看配置字段;对代理、内核与路由概念仍有疑问时,可先阅读名词解释。