很多使用OpenVPN接入企业内网或者专属网络的运维人员经常遇到明明服务端配置了DNS推送规则,客户端接入后域名解析还是走本地运营商DNS的问题,不仅容易泄露内网访问痕迹,部分内部业务域名也无法正常解析,本文梳理的OpenVPN DNS推送日常检查方法,全部基于通用OpenVPN开源版本的原生逻辑,不需要额外加装第三方工具,普通运维人员也能快速落地校验排查。
配置前提预校验:先排除服务端基础配置疏漏
很多时候DNS推送不生效的根源,其实是OpenVPN服务端的配置项写错,还没到客户端校验的步骤。首先登录OpenVPN服务端的配置目录,打开server.conf主配置文件,先确认有没有写push "dhcp-option DNS 你要推送的DNS地址"这行指令,注意引号和空格的格式不能出错,部分旧版本OpenVPN不支持在推送DNS的行末尾加多余的注释符号,否则整行指令会被跳过。
接下来要确认服务端有没有开启允许客户端接收推送选项的权限,部分运维为了限制客户端自定义配置,会把客户端的pull参数误删,或者在服务端配置里加了push-reset指令清空所有默认推送规则,这类隐性配置很容易被忽略,直接导致DNS推送规则根本不会下发到客户端。
客户端接入后的第一层直观校验
完成服务端预校验之后,先正常启动OpenVPN客户端完成拨号连接,不要立刻用ping命令测试域名,先查看客户端生成的运行日志。不管是Windows、macOS还是Linux平台的原生OpenVPN客户端,连接成功后的日志里都会输出服务端下发的所有推送选项,直接搜索日志里的dhcp-option关键词,就能看到有没有出现你配置的目标DNS地址,如果日志里根本没有这行内容,说明推送规则压根没从服务端发出来,ikuu问题还是出在服务端配置环节。

运维人员正在OpenVPN服务端检查DNS推送相关配置项
如果日志里已经显示收到了推送的DNS地址,接下来去查看系统对应的虚拟网卡配置,Windows平台可以打开网络适配器列表,找到名字带TAP或者TUN的OpenVPN虚拟网卡,右键查看属性里的IPv4协议设置,确认DNS服务器地址已经被自动填充为你推送的目标地址。macOS平台可以在网络设置里找到对应的OpenVPN接口,查看DNS标签页下的列表,Linux平台直接运行ip addr命令查看tun接口的绑定DNS参数,这一步的预期结果是虚拟网卡的DNS列表首位就是你推送的地址,部分旧客户端会把本地DNS放在前面,这时候推送规则的优先级就出问题了。
真实解析链路的生效性校验
确认虚拟网卡配置的DNS地址正确之后,不能直接判定推送已经生效,因为部分系统的全局DNS缓存或者第三方代理工具会绕过虚拟网卡的DNS设置,ikuu这时候需要做定向的解析请求测试。Windows平台可以打开命令提示符运行nslookup指令,后面跟上你要测试的内网业务域名,不加指定DNS参数的情况下,看返回结果里的服务器字段是不是你推送的目标DNS地址。
如果要更精准的确认链路,可以在Linux或者macOS平台运行dig指令,查询域名的时候同时开启详细输出,看响应报文的源IP是不是你配置的推送DNS地址,要是返回的源IP是本地运营商的公共DNS地址,ikuu就说明DNS推送没有真正接管解析请求。这里要注意,部分浏览器自带的DNS预解析功能会绕过系统DNS设置,测试的时候不要直接用浏览器访问域名来判断,必须用系统原生的命令行解析工具测试,避免得到错误的校验结果。
常见误区的排查修正
很多运维人员校验的时候会犯一个典型错误,就是只测试公网域名的解析结果,以此判断DNS推送是否生效,实际上如果你的OpenVPN服务端没有配置推送重定向所有网关的规则,部分客户端的公网域名解析还是会走本地链路,只有指定的内网域名才会走推送的DNS解析,这时候用公网域名测试得到的结果本身就不具备参考性。正确的做法是优先测试只有推送DNS才能解析的内网专属域名,这类域名在公网DNS库中没有收录,解析结果完全不会受本地环境干扰。
还有一类常见的误区是忽略了客户端系统的DNS安全防护规则,比如Windows平台的智能DNS服务、macOS的加密DNS默认配置,都会优先使用系统预设的加密DNS服务器,覆盖OpenVPN推送的明文DNS设置,ikuuu遇到这类情况需要先临时关闭系统自带的加密DNS功能,再重新校验推送规则的生效状态。
所有校验步骤完成之后,还可以断开OpenVPN连接重新拨号,重复执行之前的校验流程,确认DNS推送规则不会随机失效,避免出现部分连接成功的场景下DNS规则漏下发的问题,整套日常检查方法跑通之后,后续运维过程中遇到同类问题就可以快速定位故障环节,不需要逐行翻找全网的配置参数。




