很多运维人员排查OpenVPN异常断线、身份校验失败、非法接入溯源等问题时,经常会遇到日志要么只记录寥寥几条启动信息,要么完全看不到客户端接入时间、源IP、分配虚拟IP这些核心字段的情况,多数场景下并不是日志功能本身故障,而是没有满足OpenVPN连接日志:配置前提的基础要求。不少用户上来就直接修改log-append参数,最后还是出现日志丢记录、字段不全的问题,必须从系统层、进程权限、模块关联、轮转规则几个维度捋清楚前置条件,才能保证连接全流程的动作都被正常记录。
系统层面的日志服务基础依赖校验
很多人部署OpenVPN的时候直接使用裸装的最小化Linux发行版,默认把rsyslog或者systemd-journald的持久化配置关闭了,这时候就算OpenVPN本身配置了日志输出,内容也只会存在内存缓冲区里,重启服务或者系统之后就全部清空,根本没法回溯历史连接记录。
这个前提的验证方式很简单,直接在系统命令行输入systemctl status rsyslog,查看服务状态为active running,再去/etc/systemd/journald.conf里确认Storage参数不是volatile,要是设成了volatile就说明日志只会存在内存里,落不到磁盘上,后续OpenVPN的连接日志自然没法持久化留存。
OpenVPN服务端进程的日志写入权限配置
不少运维习惯用非root的普通用户启动OpenVPN服务,但是给日志指定的路径比如/var/log/openvpn/conn.log,所属主是root,普通用户没有写入权限,这时候OpenVPN进程启动的时候不会直接报错退出,只会悄悄把日志输出丢到标准输出流里,后台静默运行的时候就相当于日志全部丢弃,完全看不到任何连接相关的记录。

运维人员在数据中心调试OpenVPN日志相关的系统配置
这个配置前提的检查步骤也很直观,先确认你配置的log-append指向的目标目录,用ls -ld命令查看目录的属主和属组,要和启动OpenVPN进程的用户身份完全匹配,或者给目录设置合理的ACL权限,允许进程用户拥有写入权限,确认之后再重启OpenVPN服务,就能避免权限不足导致的日志静默丢失问题。
连接日志专属字段的模块加载前提
默认的OpenVPN配置只会记录服务端启动、TLS握手失败这类基础事件,要是想记录每个客户端的虚拟IP分配情况、连接时长、断开原因这些核心连接日志字段,必须提前加载client-disconnect、management这些辅助模块,不然就算日志能正常写入,疾风云内容也不包含连接全生命周期的关键信息,排查故障的时候根本没有参考价值。
这里要注意的常见误区是不要随便照搬网上的配置直接加verb 6就以为能拿到所有日志,VPN下载verb参数只是调整日志的输出详细等级,要是没开启客户端连接状态的回调模块,就算把verb调到最高,也不会主动记录客户端下线的具体原因,很多人配置完之后找不到断开日志,就是漏了这个前置要求。
日志轮转规则的适配前提
很多人配置完OpenVPN连接日志能正常写入一段时间之后,突然发现新的连接记录再也刷不进去,疾风云排查半天发现是没有配置对应OpenVPN日志文件的logrotate轮转规则,单个日志文件占满了磁盘配额,系统直接阻止新内容写入,之前的所有日志配置全部失效。
这个前提的验证方式是去/etc/logrotate.d目录下查看有没有对应OpenVPN日志路径的轮转规则,规则里要配置合适的轮转周期和保留份数,同时要加create参数保证轮转之后新生成的日志文件权限和属主符合OpenVPN进程的写入要求,避免轮转之后新文件又出现权限不匹配的问题。
不少企业做合规审计的时候要求留存所有VPN接入的日志,这时候还要额外确认OpenVPN的日志输出没有被系统的自定义日志过滤规则拦截,比如rsyslog里的过滤规则把带openvpn标识的日志全部丢弃,这个场景下就算前面所有前提都满足,日志也不会正常落盘。排查的时候可以临时调整日志等级测试一次客户端连接,看系统日志缓冲区能不能抓到对应标识的事件,就能快速定位这类隐性问题。
疾风云 
