如何安全地回滚 VPN 服务器配置
回滚恢复的是一份已知良好的网络策略,而不是你所能找到的最旧文件。让吊销列表保持最新,并把管理通路留在隧道之外。
把服务器回滚,是判断哪一层出了问题,而不是做一次文件复制练习。配置、凭据和软件包版本各自按不同的节奏演进,只恢复其中一项而让其余保持最新,得到的会是一台看起来健康、行为却不一致的主机。下面的顺序假定改动已经出了问题,并要求你恢复到最小的自洽状态。请按顺序执行,并把带外访问检查当作任何人都不应跳过的一步。
建立一个你真的能恢复的检查点
记录服务启动时读取的配置,以及最后一次解析它的版本。在旧版本下能干净加载的文件,升级之后可能被拒绝或被静默忽略,所以版本必须写进同一条记录。把配置指向的材料也一并收集:私钥、证书路径、监听定义,以及让服务可达的 DNS 和防火墙条目。如果一次恢复需要你并未保存的文件,这个检查点就是不完整的。
在系统仍然健康时,为每一项设置标明归属。由服务商面板安装的路由、由主机防火墙添加的路由,以及下发到客户端的路由,是三个不同的对象;恢复错了对象,另外两个仍会留在原处。一张写着设置、归属和文件路径的短表就够了。
让吊销记录与配置分开
旧配置可能悄悄重新连回你刻意移除的设备,从而把一次恢复变成安全上的倒退。在恢复网络策略的同时,保留当前的吊销名单和已停用的账户,然后在服务接受客户端之前重新应用它们。
把身份状态当作一次独立的回滚,它有自己的证据。证书吊销文件、账户停用和 MFA 注册很少与守护进程的配置放在同一处,恢复配置不会触及它们。先检查当前状态,才知道哪些必须保留下来。恢复之后,确认被移除的身份仍然无法连接。
当隧道失效时仍能到达主机
打开一条不依赖被改动组件的通路。虚拟机管理控制台、独立网段上的管理地址或串口控制台都算数;经由隧道承载的 SSH 会话不算。如果唯一的入口正是你即将重启的 VPN,那么一条错误的路由或防火墙规则就会剥夺你纠正它的能力。要在改动之前测试备用通路,而不是之后。先通过它登录一次,确认 sudo 可用,并记下你使用的确切地址。
测试很简单:在通过备用通路连接的情况下把隧道断开,看会话是否存活。如果断了,你就在被困住之前先发现了故障。
只应用一次修订,并弄清它何时生效
查阅服务的 reload 或 restart 文档,弄清楚哪些指令在哪个时刻被读取。有些取值在重新加载时生效,另一些只有在新会话或新进程启动时才生效,因此编辑文件并不能证明运行状态。要恢复单一修订,而不是把新文件与旧的运行状态混在一起。拿不准时,重启整个服务比部分重新加载更容易推演。
选择之前先查看单元定义:systemctl show -p ExecReload openvpn@server 会告诉你是否存在 reload 钩子。然后应用这次修订,并在改动任何其他东西之前先读日志里的第一批新错误。
验证、记录,并在事后追查
接入一个已授权的客户端,把服务该做的事情跑一遍:域名解析、一次重连,以及之前失败的那个应用。确认被吊销的身份仍然被拒绝。记录你恢复的修订、时间和原因,因为下一位运维人员三样都需要。没有任何记录的这次回滚,会在服务下次出问题时变成一桩悬案。
systemctl status openvpn@server --no-pager
journalctl -u openvpn@server -n 50 --no-pager
服务稳定之后,在一台可以丢弃的主机或快照上复现那次失败的改动。这样就能把糟糕的配置,与有问题的软件包或过期的证书区分开来。把恢复后的配置纳入版本管理,好让下一个检查点从已知的提交出发。这项练习的意义是一个有据可查的终点,而不是长期降级。