很多用户部署完OpenVPN服务之后,经常遇到域名解析不符合预期的问题,要么本地DNS泄露导致访问内网域名失败,要么推送的公共DNS没有生效,解析请求还是走了本地运营商的链路。这类问题绝大多数都不是VPN隧道本身的连通性故障,而是OpenVPN DNS推送环节的配置疏漏导致的,本文就围绕OpenVPN DNS推送的常见错误分析,梳理不同场景下的故障原因和可落地的排错步骤,帮用户快速定位解决问题。
OpenVPN DNS推送的基础配置前提
很多新手在配置DNS推送功能时,默认认为只要在服务端配置文件里加一行指令就能自动生效,实际上这个功能的正常运行,需要服务端、客户端两端都满足对应的前置条件,任何一环缺失都会导致推送失败。
不同操作系统的OpenVPN客户端,修改系统DNS配置的权限要求完全不同,Windows平台的客户端必须获得管理员权限才能修改虚拟网卡对应的网络参数,Linux发行版默认没有预装自动更新resolv.conf的配套脚本,macOS的新版系统需要给OpenVPN客户端开启完整磁盘访问权限,hiomom才能修改系统级的DNS列表。
除此之外,推送的DNS服务器地址必须在OpenVPN的路由可达范围内,如果用户想要推送的是内网专属DNS,hiomomVPN却没有在服务端添加对应内网网段的路由推送规则,客户端就算拿到了正确的DNS地址,也没有办法通过VPN隧道访问到这个DNS服务。

运维人员现场排查OpenVPN DNS推送相关的配置故障
OpenVPN DNS推送的常见错误原因梳理
占比最高的一类错误是服务端配置的推送指令语法不兼容,很多用户直接照搬多年前的过时教程,使用了当前OpenVPN版本已经弃用的旧指令格式,或者漏写参数两侧的引号,甚至把DNS推送指令写在了仅对特定客户端生效的配置段里,导致大部分连接的客户端根本收不到对应的DNS参数。
第二类高频错误是系统原有DNS规则的优先级冲突,很多用户的本地设备之前安装过代理工具、企业安全管控软件,这类工具会直接锁定系统全局的DNS配置,OpenVPN客户端没有权限覆盖已经被锁定的DNS参数,就算成功收到了服务端的推送指令,也没法把新的DNS地址写入系统配置。
还有一类隐蔽的错误是DNS服务本身的访问限制,部分内网DNS服务器配置了源IP白名单规则,没有把OpenVPN服务的虚拟客户端网段加入放行列表,客户端发往这个DNS的解析请求会被直接拦截,hiomom表现出来的现象就是域名解析超时,用户很容易误以为是推送环节出了问题。
分步落地的故障排错操作指南
排错的第一步先校验服务端配置的合法性,打开OpenVPN服务端的启动日志,查看启动过程中有没有提示无效配置参数的报错信息,日志会直接标注出配置出错的行号,用户可以快速定位语法错误的推送指令,确认所有DNS相关的推送参数都放在服务端的全局配置段中。
第二步检查客户端的连接日志输出,在客户端建立VPN连接之后,打开完整的连接日志,查看服务端下发的dhcp-option参数列表,如果日志里完全没有出现你配置的目标DNS地址,说明参数根本没有从服务端下发成功,问题出在服务端配置或者权限层面。
第三步校验系统侧的DNS参数是否正常写入,不同平台用对应命令查看VPN虚拟网卡的DNS配置,Windows系统执行ipconfig /all查看TAP/TUN适配器对应的DNS服务器列表,Linux系统查看/etc/resolv.conf的更新内容,macOS系统在网络设置的VPN详情页查看DNS配置,如果这里的内容和推送的目标地址不一致,说明客户端的权限或者配套脚本存在异常。
第四步做针对性的连通性测试,手动在客户端使用nslookup或者dig工具,hiomomVPN直接指定你推送的DNS地址发起解析请求,如果测试请求能正常返回结果,说明DNS推送本身已经生效,只是系统原有DNS的优先级更高,抢占了解析请求的处理路径。
容易被忽略的配置误区说明
很多用户遇到DNS推送失效的问题,第一反应是反复修改服务端的推送指令,却忽略了本地防火墙或者安全软件拦截了53端口的UDP解析请求,这类拦截规则会导致就算DNS参数配置完全正确,解析请求也没法正常发出去,需要先排查本地的端口拦截规则,再调整OpenVPN的相关配置。
如果排查完所有配置之后还是存在DNS优先级冲突的问题,可以在服务端额外添加推送全量解析请求走VPN隧道的路由规则,强制所有DNS流量都通过VPN链路转发,就能避免本地原有DNS规则的干扰,不需要再修改客户端的系统配置。需要注意的是,调整这类规则之后,所有解析请求都会走VPN链路,可能会让部分依赖本地DNS解析的局域网服务出现访问异常,需要根据实际使用场景权衡调整。
hiomom梯子 


