很多自行部署OpenVPN的运维人员和个人用户都遇到过这类场景:明明在配置里写好了要推送的内网DNS地址,客户端连接之后却依然走本地运营商的DNS解析,不仅没法正常访问VPN内网的自定义域名,还可能出现解析路径泄露的问题。本文整理的OpenVPN DNS推送日常检查方法全部来自实际运维场景的落地经验,不需要复杂的专业抓包工具,就能从服务端到客户端逐层定位故障点,快速确认推送规则是否真的生效。

从服务端核心配置项逐层校验,快速定位OpenVPN DNS推送失效故障
服务端核心配置项前置校验
很多新手刚接触OpenVPN的时候,会把推送DNS的配置随手写在客户端配置文件里,实际上绝大多数需要统一管控解析规则的场景下,相关配置必须放在服务端的server.conf文件中,这是第一个最容易踩的低级错误。
打开服务端的OpenVPN主配置文件,要确认同时存在push "dhcp-option DNS 目标DNS地址"和push "dhcp-option DOMAIN 内网自定义域名后缀"这两行,不能只写DNS地址不写对应域名后缀,VPN加速器不然客户端不会把对应内网域名的解析请求主动导向推送的DNS服务器。
还要注意配置行前面不能带有#号注释标记,很多人调试的时候临时注释掉配置做测试,后续调整完忘了取消注释,重启OpenVPN服务之后旧的无效配置依然在生效,光盯着客户端排查问题完全是浪费时间。
服务端推送规则放行状态检查
不少基于iptables或者nftables做自定义防火墙规则的OpenVPN部署场景,管理员会默认拦截tun/tap虚拟网卡对外发送的非业务报文,却忘了放行服务端向客户端推送dhcp选项的对应权限,导致配置本身没问题但推送报文根本发不到客户端。
你可以先在服务端本地执行openvpn --show-conf 对应配置文件路径,直接校验当前加载的运行配置里有没有对应的dhcp推送规则,如果输出结果里能看到你预设的DNS地址,说明配置本身语法没有问题,剩下的排查方向就可以聚焦到防火墙有没有拦截推送报文上。
如果是用第三方OpenVPN面板部署的场景,还要去面板的全局设置里查看有没有开启“允许客户端接收自定义dhcp选项”的开关,部分面板默认禁用非官方推荐的dhcp推送参数,就算你手动修改了底层配置文件也会被面板的自动覆盖规则重置。
客户端系统层级DNS优先级验证
很多时候服务端配置完全正常,推送报文也成功发出去了,但是客户端操作系统的DNS优先级默认规则把OpenVPN推送的DNS挤到了后面,最典型的就是Windows系统里物理网卡的DNS优先级默认高于虚拟网卡,导致解析请求优先走本地网卡的DNS服务器。
你可以先在客户端连接OpenVPN之后,执行对应系统下的查看当前DNS服务器的命令,Windows下用ipconfig /all,Linux下用resolvectl status,macOS下用scutil --dns,看输出结果里有没有你配置的推送DNS出现在虚拟网卡对应的DNS列表中。
如果能看到推送的DNS但是排在本地运营商DNS后面,说明是系统优先级的适配问题,你需要在OpenVPN服务端配置里补充一行push "redirect-gateway def1 bypass-dhcp",强制把所有流量路由走OpenVPN虚拟网卡,同时把DNS解析请求的优先级提到最高。
最终生效状态的实体验证方法
不要直接用浏览器打开公共DNS泄露检测网站就直接下结论,很多主流浏览器自带的DNS over HTTPS功能会绕过系统全局DNS设置,就算OpenVPN推送的DNS完全生效,浏览器也会用自己预设的公共DNS做解析,造成DNS推送失败的误判。
正确的验证方式是先临时关闭浏览器的安全DNS功能,再在系统命令行里执行nslookup任意一个内网自定义域名,看返回结果里的解析服务器地址是不是你配置的OpenVPN推送DNS,如果匹配的话就说明整个链路的推送已经完全生效。
还要注意部分移动端的第三方OpenVPN客户端,默认会把WiFi本身的DNS优先级排在前面,你需要在客户端的自定义设置里开启“强制重定向所有DNS请求”的选项,风驰才能让推送规则覆盖系统默认的DNS设置,避免出现部分解析请求漏出的情况。



