很多运维人员在调整OpenVPN服务端的DNS推送规则后,经常会遇到配置已经保存重启但客户端实际仍走旧DNS解析、甚至出现DNS泄露的问题,OpenVPN DNS推送配置变更验证是保障VPN接入用户解析路径符合预期、避免内网域名访问失败的核心操作,本文结合通用的OpenVPN服务端和全平台客户端场景,给出可直接落地的实操验证方法和故障排查思路,不需要依赖第三方付费检测工具就能完成全链路校验。

运维人员在多客户端环境下开展OpenVPN DNS推送配置变更前的基准状态校验工作
配置变更前的前置校验准备
在动手修改OpenVPN服务端的推送DNS配置之前,首先要先记录当前生效的DNS状态基准,避免后续变更后没有对比参考。你可以先在未连接VPN的状态下,分别在Windows、macOS、Linux三类常用客户端上,执行查看本地当前DNS服务器地址的命令,把结果截图或者文本记录下来,同时访问几个常用的公网域名和后续要用到的VPN内网专属域名,记录下解析返回的IP结果。
接下来要确认服务端的原有配置没有语法错误,很多人修改完配置之后直接重启OpenVPN服务,但如果配置里的push指令格式写错,服务端启动后会自动沿用之前加载的旧配置缓存,小鸟VPN导致变更完全没有下发。你可以先打开OpenVPN的server.conf配置文件,找到和DNS推送相关的行,确认push "dhcp-option DNS x.x.x.x"这类指令没有拼写错误,也没有被注释符#屏蔽。
本地客户端侧的逐层验证步骤
完成配置重启服务端之后,先把客户端的原有VPN连接完全断开,不要直接热重连,部分旧版本的OpenVPN客户端会缓存上一次连接拿到的DNS配置,热重连不会主动刷新参数。断开之后等待几秒再重新发起连接,连接成功后先不要急着用第三方网站检测,先从系统本地的网络配置层面看DNS列表。
Windows系统下可以直接在CMD里执行ipconfig /all,找到对应OpenVPN生成的虚拟网卡条目,查看DNS服务器列表里的地址,是不是你刚刚在服务端新推送的DNS地址。macOS用户可以在网络设置里找到OpenVPN的虚拟接口,查看DNS标签页的服务器列表,Linux用户执行resolvectl status查看tun类虚拟接口对应的DNS配置,这一步的核心是确认系统层面已经收到了VPN推送的DNS参数,没有被本地的其他网络管理工具比如systemd-resolved或者第三方DNS工具强制覆盖。
确认系统层面的DNS列表正确之后,接下来要做解析路径的实际验证,你可以用nslookup或者dig工具,指定查询一个公网普通域名,小鸟同时指定走OpenVPN虚拟网卡的DNS服务,看返回的解析结果是不是新推送DNS服务器给出的应答。这里要注意不要直接用浏览器打开网站测试,浏览器自带的DNS预读取和内置DNS缓存会干扰结果,很容易出现误判。
服务端侧的配置回滚校验逻辑
如果客户端侧看不到新的DNS推送地址,首先要回到OpenVPN服务端查看运行日志,确认你修改的配置文件确实被当前运行的OpenVPN进程加载了。部分部署在容器里的OpenVPN服务,配置文件的挂载路径和实际生效路径不一致,你修改的是宿主机上的配置文件,但容器内部加载的还是旧版本的配置,这种情况直接重启容器才能让新配置生效,单纯重启服务进程没用。
你还可以在服务端上直接查看当前OpenVPN进程的运行参数,确认启动时指定的配置文件路径和你修改的文件路径完全一致,同时检查配置文件里有没有重复的push DNS指令,如果先后推送了多个不同的DNS地址,客户端会按照顺序依次排列,部分客户端会优先使用第一个推送的DNS,如果你之前的旧DNS指令没有注释掉,新的DNS会排在后面,不会成为默认解析服务器。
常见效果异常的排查路径
很多用户验证的时候会发现本地DNS列表里已经有了新推送的DNS地址,但实际访问公网域名的时候还是走了本地运营商的DNS,这种情况大概率是客户端的路由配置没有同步推送DNS重定向规则。你需要检查服务端配置里有没有加上push "redirect-gateway def1"这类指令,如果没有强制把所有流量都走VPN隧道,系统会按照路由优先级选择本地网卡的DNS来解析公网域名,只有内网专属域名才会走VPN推送的DNS。
还有一类常见误区是混淆了全局DNS和分流DNS的配置效果,如果你只在OpenVPN里配置了推送内网DNS,没有配置强制重定向所有DNS请求,部分客户端的系统策略会优先使用本地物理网卡的DNS,这种场景下你不能用普通的DNS泄露检测网站来判定配置失效,只要内网专属域名能正常解析到对应内网IP,就说明推送的DNS配置已经正常生效。如果排查完所有配置都没有问题但解析结果还是不符合预期,可以临时清空客户端的本地DNS缓存之后重新测试,排除系统旧缓存的干扰。
小鸟VPN 


