很多自行部署OpenVPN的用户都会遇到路由推送不生效的问题,要么是指定的内网网段流量完全走不到VPN隧道,要么是推送之后所有本地流量都被强制导入隧道,影响日常网页访问体验,本文围绕OpenVPN路由推送常见错误分析的核心场景,从现象定位、逐项排查到验证步骤给出可落地的操作指南,覆盖绝大多数个人和中小团队的自建VPN使用场景。

对照OpenVPN服务端启动日志逐项核对路由配置参数,排查语法类显性错误
路由配置语法层面的显性错误排查
很多新手最容易踩的坑是push指令的格式写错,OpenVPN的路由推送不是随便填网段就能生效,默认标准格式为push "route 目标网段 子网掩码 下一跳",不少用户误把CIDR前缀长度当成子网掩码填写,比如把255.255.255.0直接写为24,直接导致服务端启动就抛出配置错误。
检查的时候优先调取OpenVPN服务端的启动日志,要是出现“invalid route netmask”这类提示,首先核对配置里所有push route的参数,确认子网掩码是点分十进制格式,如果确实需要用前缀长度简化配置,要确认客户端版本支持扩展参数,调整完成后重启服务端,预期结果是服务端启动日志没有任何路由相关的告警输出。
还有个高频误区是推送的路由网段和OpenVPN自身的虚拟网段出现重叠,比如服务端配置的server指令分配的虚拟网段是10.8.0.0/24,推送的路由刚好覆盖了这个地址段,会直接导致虚拟网卡的回包被路由到错误的物理接口,客户端连接成功后几秒就会意外断连,排查时要把服务端配置里的虚拟网段和所有待推送的路由网段做逐一比对,排除地址段重叠问题。
服务端转发权限未开启的隐性故障
很多用户确认服务端配置语法完全正确,客户端也成功收到了路由条目,但是访问对应内网网段依然完全不通,这时候首先要排查OpenVPN部署的服务器本身有没有开启IP转发权限,Linux发行版默认是关闭跨网卡IP转发的,就算路由配置全部正确,服务器也不会转发从虚拟网卡到物理内网网卡的数据包。
检查步骤是在服务端终端执行sysctl net.ipv4.ip_forward命令,预期返回值为1,如果返回0的话需要修改sysctl配置文件把对应参数调整为1,执行重载命令让配置生效,不少用户修改完配置后忘记执行重载操作,等于调整完全没有生效。
除此之外还要核对服务端的防火墙规则,不管是用iptables还是firewalld管理防火墙,默认都会拒绝从tun0虚拟网卡进来、转发到物理内网网卡的陌生数据包,需要添加对应的forward链放行规则,不要上来就配置全量地址伪装规则,蜜蜂先放通对应推送网段的转发权限,避免不必要的非目标流量泄露。
客户端侧路由接收与生效异常排查
部分桌面端或者移动端的第三方OpenVPN客户端,蜜蜂加速器电脑版使用教程默认会开启路由推送校验机制,就算服务端配置完全合规,客户端也会主动拦截未知来源配置里的路由推送指令,不会把对应路由条目写入系统路由表。
排查的时候调取客户端的实时连接日志,搜索和push route相关的输出条目,如果出现“route pushed but ignored”的提示,就要检查客户端加载的ovpn配置文件里有没有设置route-nopull这类强制拒绝所有推送路由的参数,删掉这类参数之后重新发起连接,再去操作系统的路由表界面查看有没有新增对应的路由条目。
还有一类很难定位的隐性冲突是客户端本地的内网网段和推送的路由网段完全一致,比如用户家庭路由器的内网段刚好是192.168.1.0/24,而需要推送的公司内网段也是相同的地址段,系统路由会优先选择优先级更高的本地物理网卡路由,导致用户访问的实际是家里的本地设备,根本没有进入VPN隧道,这类场景无法通过调整OpenVPN配置修复,只能修改两端其中一端的内网网段地址避免冲突。
策略路由分流场景的推送误区
不少用户想要实现分流访问效果,也就是只有指定的公司内网流量走VPN隧道,普通公网访问走本地原有网络,就会错误地推送全量默认路由之后再添加排除规则,这种配置很容易出现路由优先级错乱,反而导致分流逻辑完全失效。
这类场景下的正确配置逻辑是只把需要走VPN隧道的目标内网网段逐条push给客户端,不要随意修改系统全局的默认路由优先级,排查的时候可以在客户端访问目标内网IP的同时执行tracert路由跟踪命令,查看第一跳地址是不是OpenVPN分配给客户端的虚拟网关地址,如果第一跳指向本地的家用路由器网关,就说明路由推送没有真正生效,数据包根本没有进入VPN隧道。
蜜蜂加速器 
