不少自行部署OpenVPN的用户都遇到过这类问题:连接VPN后既打不开内网的私有业务域名,又发现公网访问的DNS请求没有走加密隧道,出现DNS泄露的情况,这些问题大部分都可以通过正确配置OpenVPN DNS推送功能解决。本文围绕OpenVPN DNS推送:作用说明展开,从原理、前置检查、实操配置到故障排查给出完整的落地指南,帮用户避开常见的配置坑。
OpenVPN DNS推送的核心作用说明
OpenVPN DNS推送是服务端主动向已接入的客户端下发预设DNS服务器地址的原生机制,不需要用户手动修改本地系统的DNS设置,只要成功连接VPN就能自动加载对应的DNS规则,整个过程对终端用户几乎无感知。
它的第一个核心作用是适配内网私有域名的解析需求,最典型的场景就是企业远程办公部署的OpenVPN服务,内部的OA系统、文件服务器、代码仓库等业务都使用不对外公开的私有域名,这类域名只有部署在内网的专属DNS服务器才能解析,如果没有配置DNS推送,远程用户使用本地运营商的公共DNS完全无法定位到对应内网服务。
它的第二个核心作用是规避不必要的DNS泄露风险,很多用户连接VPN之后,系统默认还是调用连接VPN之前配置的本地DNS地址,公网域名的解析请求会直接走本地运营商的网络链路,这部分请求的域名访问记录会被本地网络侧捕获,相当于部分流量脱离了VPN加密隧道的保护,而DNS推送机制可以让所有解析请求默认走VPN隧道内的指定DNS地址。
配置前的必要前提检查
首先要确认你使用的OpenVPN服务端版本支持相关配置项,目前主流的2.4及以上稳定版本都原生集成了DNS推送的相关指令,不需要额外安装第三方插件就能直接使用。
其次要提前验证待推送的DNS地址本身的连通性,如果要推送内网专属DNS,需要先确认OpenVPN服务端的内网网卡和目标DNS服务器路由互通,客户端接入VPN之后,虚拟网卡分配的地址段也拥有访问该DNS的权限,不然就算配置了推送规则,客户端也无法正常和DNS服务器通信。
最后要提前了解不同操作系统客户端的适配差异,Windows平台的官方OpenVPN客户端自带了系统DNS注册的配套服务,默认就支持自动修改系统DNS,而Linux和macOS平台的客户端需要额外开启小部分权限规则,才能让推送的DNS配置正常生效,不要默认认为服务端配置完成后所有终端都能直接适配。
服务端与客户端的实用配置步骤
服务端侧的配置逻辑非常简单,只需要打开OpenVPN服务端的主配置文件server.conf,加入对应的push指令即可,比如要推送两个内网DNS地址,就分别写入两行push "dhcp-option DNS 你要指定的DNS地址",两个地址分别对应主备DNS,避免单个DNS故障导致解析失效。
如果需要进一步优化内网使用体验,还可以额外推送内网域名搜索域,在配置文件里加入push "dhcp-option DOMAIN 内网根域名",之后远程用户不需要输入完整的私有域名,只需要输入内网主机的前缀名,系统就会自动补全后缀完成解析,大幅降低远程访问内网业务的操作成本。
客户端侧不需要手动填写任何自定义DNS地址,只需要保证客户端的ovpn配置文件里没有强制覆盖DNS的自定义规则,每次启动客户端的时候使用管理员或者系统最高权限运行,不然系统会拒绝低权限程序修改本机网络配置,推送的DNS规则就无法正常写入系统网络栈。
效果验证与常见误区排查
连接VPN之后的验证流程非常简单,Windows用户可以打开命令行工具输入ipconfig /all,找到对应OpenVPN生成的虚拟网卡条目,查看其DNS服务器列表是否和服务端推送的预设地址一致,Linux用户可以直接查看/etc/resolv.conf文件内的nameserver条目确认配置是否生效。
很多用户遇到的第一个常见误区是,以为配置了DNS推送之后所有的域名解析请求都会走VPN隧道,实际上目前大部分主流浏览器都默认开启了内置的DNS over HTTPS加密功能,这类机制会直接绕过系统本地的DNS设置,就算OpenVPN成功推送了指定DNS,浏览器还是会调用自身配置的公共加密DNS,遇到这类情况只需要手动关闭浏览器的安全DNS功能,就能让推送的规则正常生效。
第二个常见误区是认为只配置DNS推送就能完全规避所有DNS泄露的可能,实际上如果OpenVPN服务端没有配置全流量隧道转发的规则,部分走本地网关的流量对应的解析请求还是可能调用原有本地DNS,需要结合redirect-gateway相关的推送配置,让所有客户端流量都走VPN加密隧道,才能最大化发挥DNS推送的设计作用。

