OpenVPNDNS推送功能作用说明与实用配置指南
远程办公

OpenVPNDNS推送功能作用说明与实用配置指南

不少运维人员在部署远程办公场景的OpenVPN接入服务时,经常会遇到客户端连上VPN之后,内部业务域名无法解析、部分解析请求绕过VPN链路泄露到公网的问题,OpenVPN DNS推送功能就是专门适配这类需求的核心原生配置项。本文基于实际企业远程接入的落地场景,完整拆解该功能的作用逻辑、配置前置要求、分步操作方法、效果验证思路和常见故障排查方向,所有操作都可以在标准OpenVPN开源版本环境下复现。

运维调试网络OpenVPNDNS推送

运维人员调试OpenVPN服务配置,保障远程办公用户内网域名正常解析

OpenVPN DNS推送功能的核心作用

绝大多数企业内部的OA系统、共享文件服务器、私有代码仓库都使用自定义的内部域名,这类域名没有在公网DNS服务商做任何解析记录,如果远程用户连接OpenVPN之后,系统依然默认使用本地运营商或者之前手动设置的公共DNS发起解析请求,访问这些内部域名时就会直接弹出无法找到服务器的报错。

这个功能的底层逻辑是OpenVPN服务端在和客户端完成TLS身份校验、隧道建立成功之后,主动把预设的DNS服务器地址,通过虚拟网卡的DHCP选项下发到客户端的系统网络配置中,让客户端所有匹配VPN路由规则的域名解析请求,优先走推送过来的指定DNS节点处理,而不是沿用本地原有DNS配置。

合理配置该功能,还能避免部分场景下的DNS泄露问题,也就是用户明明已经接入VPN访问内部资源,对应的解析请求却跑到公网DNS服务器留下非必要访问记录的情况,适配企业内部的网络访问合规要求。

配置DNS推送的前置环境要求

在修改配置之前,首先要确认OpenVPN服务端的操作系统类型,不同系统的DNS服务管理机制存在差异,比如使用systemd-resolved服务的Linux发行版,和传统直接读取/etc/resolv.conf的Linux系统,适配推送参数的细节要求并不相同。

其次要提前验证待推送的DNS服务器本身的连通性和可用性,如果计划推送企业内部域控的DNS地址,需要先在OpenVPN服务端本地测试,确认该DNS可以正常解析所有需要用到的内部自定义域名,避免服务端本身就无法连通目标DNS,推送之后客户端也无法正常使用。

还要提前确认接入客户端的系统适配情况,Windows、macOS、主流Linux发行版、移动端的安卓和iOS系统,对OpenVPN服务端下发DNS参数的默认处理逻辑存在差异,部分用户自行编译的精简版OpenVPN客户端,可能默认屏蔽了服务端修改本地DNS的权限。

服务端与客户端的实用配置步骤

标准开源版本的OpenVPN不需要安装任何第三方插件,直接编辑服务端的server.conf主配置文件,追加对应的推送参数即可,首先写入两条基础配置,分别指定主备推送DNS的地址,格式为push "dhcp-option DNS 主DNS地址"和push "dhcp-option DNS 备用DNS地址",如果需要自动补全内部域名后缀,还可以额外追加push "dhcp-option DOMAIN 企业内部根域名后缀"。

如果你的OpenVPN部署模式是全流量隧道模式,所有用户流量都需要走VPN链路传输,还可以额外追加push "redirect-gateway def1 bypass-dhcp"参数,确保系统路由优先级把所有流量导向虚拟网卡,这时候推送的DNS配置会被系统识别为最高优先级,不容易被本地原有DNS规则覆盖。

客户端侧不需要提前修改任何本地DNS设置,只需要确认自己导入的ovpn配置文件里,没有添加pull-filter ignore "dhcp-option DNS"这类主动屏蔽服务端推送DNS参数的规则,保存所有修改之后重启OpenVPN服务端进程,新连接的客户端就可以收到对应的DNS配置。

配置完成后的效果验证方法

客户端成功连接OpenVPN隧道之后,先不要直接尝试访问内部业务系统,先打开系统的网络设置面板,找到OpenVPN生成的虚拟网卡设备,查看该网卡的IPv4属性列表里的DNS服务器地址,确认已经显示为你在服务端预设推送的目标地址。

不同系统可以用命令行工具做更精准的校验,Windows系统用户打开命令提示符输入nslookup命令,查看返回结果里的默认服务器字段,确认显示的是推送的DNS地址;macOS用户可以在终端执行scutil --dns命令,找到对应utun虚拟接口下的DNS配置列表核对。

最后做业务场景验证,先尝试访问之前无法解析的内部自定义域名,确认可以返回对应的内网业务IP地址,科学上网再尝试访问常用的公网域名,确认公网网页、应用访问不会出现解析失败的异常情况。

常见配置误区排查

不少用户配置完之后发现DNS配置没有生效,大概率是Linux客户端默认启用的systemd-resolved本地缓存服务,把所有DNS请求先转发到本地回环地址的缓存节点,没有走OpenVPN推送过来的DNS地址,这种场景下可以在服务端追加兼容参数,或者临时关闭客户端的本地DNS缓存服务做测试。

不要误以为开启DNS推送功能就可以完全避免所有DNS泄露场景,如果客户端本地安装了第三方DNS优化工具、其他代理类软件,这类应用可能会绕过系统默认的DNS配置,直接接管所有域名解析请求,这种情况下服务端推送的DNS规则不会生效。

也不要在分流模式的OpenVPN部署场景下,直接把公网公共DNS作为唯一推送的DNS地址,这类场景下只有内部网段的路由走VPN隧道,公网流量直接走本地链路,很容易出现内部域名解析请求被公网DNS拒绝,极速导致访问内部资源失败的问题。

网络加速编辑组
从延迟、抖动和丢包入手,分析不同网络环境下的连接体验。
查看更多文章
配置入门

找到适合当前设备的指南

遇到路由器VPN启动依赖相关问题,可从“核对启动日志并使用支持的重试机制”开始阅读。反复立即重启可能让依赖更难稳定,需要结合具体环境判断。