很多运维人员初次配置OpenVPN路由推送时,经常遇到配置条目写了好几条,客户端连接后却完全看不到下发的路由,也没法访问指定的内网资源,这类问题绝大多数都不是配置语法错误,而是没有提前满足OpenVPN路由推送:配置前提就直接操作,最终导致后续排查耗费大量时间。本文就从实际部署场景出发,梳理所有必备前置条件和实操前的检查步骤,帮大家避开常见的隐性故障。
操作系统层面的内核转发开关校验
很多新手上来就直接修改server.conf添加push路由条目,完全忘了OpenVPN部署的服务器本身要开启IP转发功能,不然就算配置写得完全正确,服务器收到跨网段转发的数据包也会直接丢弃,根本没法完成路由跳转。
你可以在部署OpenVPN的Linux服务器上执行sysctl net.ipv4.ip_forward命令,返回值是1才代表转发功能正常开启,如果返回0的话,就算你在配置文件里加了再多路由推送规则,客户端也没法通过VPN服务器访问其他网段的资源,后续还要把转发参数写入sysctl配置文件,保证服务器重启后转发功能不会自动关闭。
防火墙规则的放行前置配置
这里的防火墙包含两层,一层是OpenVPN服务器自身的firewalld或者iptables规则,另一层是服务器所在内网的网关防火墙规则,很多人只配置了前者就忽略了后者,最终导致路由推送成功但数据包无法正常转发。

运维人员在配置OpenVPN路由推送前,提前校验服务器内核IP转发功能状态
首先要确认OpenVPN服务使用的监听端口,默认是1194,UDP或者TCP协议都要在本地防火墙放行,同时还要配置SNAT规则,让从VPN虚拟网段发往内网其他网段的数据包,源地址能被转换成OpenVPN服务器的内网物理网卡地址,不然内网设备收到数据包后,回程流量找不到回VPN虚拟网段的路径,直接就丢弃了。
如果你的OpenVPN服务器是部署在云服务商的VPC环境里,还要提前在云平台的安全组后台放通对应的VPN端口,同时配置VPC的路由表,快云APP把VPN虚拟网段的下一跳指向OpenVPN服务器的内网网卡IP,不然云平台的内网网关也会丢弃不属于现有网段的数据包,就算本地配置全对也没法正常通信。
虚拟网段与内网现有网段的无冲突校验
这是很多人最容易踩的隐性坑,梯子软件OpenVPN默认的虚拟网段是10.8.0.0/24,如果你的内网办公网刚好也用了10.8.0.0的网段,就算路由推送成功,客户端也会出现路由冲突,没法正常访问目标资源。
实操配置之前你要先梳理清楚OpenVPN服务器所在内网的所有网段,包括办公有线网段、WiFi无线网段、服务器管理网段、存储专用网段,所有这些网段都不能和你在server.conf里定义的VPN虚拟网段重叠,同时你要推送的目标内网网段,也不能和客户端本地的现有网段有重叠,不然客户端系统的路由表会出现优先级冲突,优先走本地原有路由而不是VPN下发的路由。
推送规则的语法预校验与权限确认
很多人写push路由条目的时候语法写错,比如把route的网段和子网掩码顺序写反,或者漏了指定下一跳,OpenVPN服务重启的时候不会直接报错,但路由就是推不到客户端,排查起来非常耗费时间。
你可以在正式重启OpenVPN服务之前,先执行openvpn --config server.conf --test命令,系统会自动校验配置文件的语法合法性,有语法错误会直接在终端输出对应的行号,不用等到服务启动失败才回头逐行排查配置。
还要确认OpenVPN服务的运行身份,如果你用非root身份启动OpenVPN服务,是没有权限往客户端推送路由规则的,必须用管理员或者root身份启动服务,才能正常调用系统的路由下发接口,完成路由推送动作。
全部前置检查做完之后,你可以先连接一台测试客户端,登录之后执行route print(Windows系统)或者ip route show(Linux/macOS系统)命令,查看路由表有没有出现你推送的目标内网网段条目,如果条目存在就代表所有前置条件全部满足,可以开始后续的精细化路由推送配置,遇到推送失败的情况也可以从上面几个维度逐一排查故障点。
