VPN 基础

OpenVPNDNS推送配置前提及必备前置条件详解

OpenVPNDNS推送配置前提及必备前置条件详解

很多运维人员和个人用户在配置OpenVPN的DNS推送规则时,经常遇到客户端连接VPN后本地DNS没有被替换、解析请求仍走原有本地运营商链路,甚至出现解析泄露的问题,大部分这类故障都不是推送指令本身写错,而是没有提前满足OpenVPN DNS推送:配置前提对应的各类前置要求,本文从实际故障排查场景出发,逐项梳理所有必须提前确认的校验项,帮你提前规避绝大多数推送失效问题。

服务端基础权限与版本适配检查

很多管理员上来就直接往server.conf配置文件里添加push "dhcp-option DNS x.x.x.x"的指令,完全没确认服务端本身的运行环境是否支持DNS推送的相关逻辑,这是最容易被忽略的前置环节。

首先要确认你使用的OpenVPN服务端版本,2.4之前的旧版本对多数Linux发行版默认启用的systemd-resolved服务适配存在原生缺陷,直接写入的推送指令不会生效,需要额外补全适配参数才能正常下发DNS配置。

还要确认OpenVPN服务端的运行身份,如果你用非root的普通用户身份启动后台服务,没有权限修改虚拟网卡的DHCP属性,所有和dhcp-option相关的推送指令都会被静默丢弃,不会在运行日志里抛出明显的报错,很多人排查数小时都找不到原因就是忽略了这一点。

虚拟网卡与路由层前置校验

OpenVPN的DNS推送本质是通过虚拟TUN/TAP网卡的DHCP协商字段把预设的DNS地址下发给客户端,所以首先要确认服务端已经正确开启了虚拟网卡的DHCP服务支持。

你可以在服务端配置文件里确认没有手动添加disable-dhcp的禁用参数,一旦开启这个参数,所有DHCP相关的推送内容包括DNS、自定义域名后缀都会全部失效,就算写再多推送指令也不会有任何效果。

还要检查服务端的路由转发规则,如果你之前配置了iptables或者firewalld的规则,把虚拟网卡发出的53端口DNS请求直接转发到公网没有做任何标记,就算客户端拿到了推送的DNS地址,也可能因为本地路由优先级的问题走原有DNS链路,看起来就像推送完全没有生效。

客户端侧的兼容前提确认

很多管理员只盯着服务端配置调整,完全忽略不同客户端系统本身的网络栈限制,这也是OpenVPN DNS推送失效的高发场景,属于OpenVPN DNS推送:配置前提里很重要的终端侧校验项。

Windows系统的OpenVPN客户端需要确认你使用的是官方完整版本,部分第三方精简修改版的客户端砍掉了修改系统DNS列表的权限模块,就算收到了服务端推送的DNS地址,也不会写入本地虚拟网卡的网络属性里。

类Unix系统比如Linux、macOS的客户端,要提前确认本地没有锁定/etc/resolv.conf文件的属性,很多用户为了防止本地DNS被随意修改,手动给resolv.conf加了不可修改属性,OpenVPN客户端没有权限修改这个文件,自然就不会应用推送的DNS配置。

推送规则的语法与上下文前提校验

就算前面所有运行环境都满足,如果你写的推送指令不符合OpenVPN的语法规范,也会出现推送失效的问题,这类问题往往藏在配置文件的细节里很难直接发现。

很多新手会把DNS推送的指令写在client-config-dir目录下的用户专属配置里,但是忘记在全局配置里开启client-specific的标志位,导致专属用户的自定义DNS推送规则完全不生效。

你还要注意推送指令的顺序,不要把dhcp-option DNS的相关指令放在自定义路由规则的后面,部分旧版本的OpenVPN会优先处理路由规则,后续的DHCP字段不会被同步推送到客户端,调整指令顺序之后就可以正常生效。

不少用户遇到DNS推送失效第一反应是添加大量强制DNS劫持的规则,实际上只要提前逐项确认所有前置条件,不需要额外的强制劫持规则就可以让客户端正常接收推送的DNS地址,避免不必要的解析异常。

手机连接编辑组
整理 Android 与 iOS 的连接权限、后台运行和网络切换注意事项。
查看更多文章
连接指南

找到适合当前设备的指南

遇到交换机端口更换后的VPN相关问题,可从“按现场网络管理要求确认端口配置”开始阅读。物理插入网线不等于获得相同网络权限,需要结合具体环境判断。