很多自行部署OpenVPN的用户都会遇到这类问题:明明在服务端配置了推送指定DNS的规则,客户端连接后却依然使用本地网络的DNS服务器,不仅可能出现内网域名无法解析的问题,还可能导致访问记录通过本地DNS泄露,本文围绕OpenVPN DNS推送的常见错误分析,从实际部署的全链路拆解故障点和可落地的排查方案,覆盖服务端配置、系统适配、特殊场景等多个维度。
服务端配置层的典型推送错误
新手部署OpenVPN时最常犯的错误,是把DNS推送指令放到了错误的配置段里,很多人直接照搬网上零散的示例代码,把push "dhcp-option DNS 目标地址"这类配置行写到了client专属配置段或者路由配置段中,而OpenVPN服务端只会读取全局server段下的推送指令,放在其他段的配置根本不会下发到客户端。
另一类高频配置遗漏是没有显式声明允许客户端接收DHCP选项,部分老旧版本的OpenVPN服务端默认限制客户端接收非核心连接参数,没有添加allow-pull参数的前提下,就算写了完整的DNS推送规则,客户端也会直接忽略相关的下发指令,不会把推送的DNS地址加入本地解析列表。
这个环节的验证方式非常简单,不需要重启服务测试,直接在服务端控制台执行OpenVPN配置预校验命令,查看加载的配置段里有没有对应的dhcp-option DNS条目,如果检索不到相关内容,就说明配置行放错了位置,调整后再启动服务可以避免反复试错。
客户端系统层面的DNS优先级冲突
Windows场景下很多用户安装了第三方安全软件,或者开启了自带的Hyper-V虚拟交换机功能,系统会默认给物理网卡分配更高的DNS优先级,就算OpenVPN成功推送了DNS地址,系统发起解析请求的时候还是会优先走本地网卡绑定的DNS服务器,从表象看和OpenVPN DNS推送失败完全一致。
Linux场景下的systemd-resolved服务默认会给所有网卡的DNS标记优先级,不少主流发行版默认物理网卡的DNS优先级高于VPN虚拟网卡,导致推送的DNS规则没有实际生效,很多用户第一时间去修改服务端配置,反而浪费了大量排查时间。
这类故障的验证方式非常直观,连接VPN之后执行nslookup命令测试指定域名,查看返回结果对应的解析服务器地址,如果返回的不是你配置推送的DNS地址,就说明是系统层面的DNS优先级覆盖了推送规则,这时候可以手动调整OpenVPN虚拟网卡的路由度量值,把优先级调到比物理网卡更高即可。
特殊网络场景下的推送规则适配错误
很多在内网部署OpenVPN服务的用户,需要推送内网专属DNS服务器来解析业务系统域名,但是配置的时候只写了单条DNS推送规则,没有追加推送内网域名后缀的指令,导致客户端就算拿到了正确的DNS地址,解析不带后缀的内网主机名的时候会自动补全本地的域名后缀,最终出现解析失败的问题。
还有部分运营商的网络会劫持53端口的DNS请求,就算OpenVPN客户端正确拿到了推送的DNS地址,系统发出的DNS请求在路由到VPN隧道之前就被运营商劫持到了本地的DNS服务器,看起来就像推送规则完全没有生效,这类场景不属于OpenVPN本身的配置故障,需要额外调整流量转发规则。
这类场景的排查可以先在客户端手动把物理网卡的DNS改成公共DNS,再连接VPN测试解析,如果这时候能正常拿到推送DNS的返回结果,就说明是运营商的DNS劫持导致的表象推送失败,需要额外配置VPN端的全局DNS重定向规则,把所有53端口的请求都强制走VPN隧道转发。
常见排查误区说明
很多用户遇到DNS推送不生效的第一反应是重装OpenVPN客户端,实际上大部分情况都不是客户端本身的故障,优先查看客户端连接日志里的PUSH_REPLY字段,里面会列出服务端实际下发的所有规则,如果日志里根本没有DNS相关的dhcp-option条目,问题基本出在服务端配置,不需要在客户端侧反复调试。
还要注意部分开源的OpenVPN二次分发版本会默认禁用部分DHCP推送选项,遇到规则不生效的时候可以先切换回官方稳定版客户端再做验证,避免第三方修改带来的未知适配问题,整个排查流程不需要借助额外的第三方工具,靠OpenVPN自带的日志和系统自带的解析测试命令就能覆盖绝大多数故障场景。
云帆加速器 