如何在不重复身份的前提下恢复 VPN 服务器
恢复出来的 VPN 服务器带回的是文件,而不是当前访问权。在第二份副本响应握手之前,先核对吊销记录、对等端密钥和端点。
你恢复了备份,服务启动了,客户端第一次就连接成功。这个成功正是陷阱。恢复带回的是快照时刻服务器拥有的文件,而不是此后变化了的访问状态;如果旧端点仍然可达,如今就有两台机器同时响应同一个身份。解决办法不是更好的备份,而是在它响应哪怕一次握手之前,决定恢复出来的主机允许是什么。
备份带回的是文件,不是权限
快照保存了备份运行时的服务器配置、私钥、证书颁发机构、对等端列表和防火墙规则。它无法保存之后发生的变化:你吊销的设备、重新签发的密钥、卖掉笔记本电脑时删除的对等端、迁移过的子网。恢复把文件倒回那一刻。它不会倒回人们此后做出的决定。
损害正来自这个空档。备份两周后才吊销的被盗笔记本电脑,会出示一张仍能对恢复树中旧 CRL 验证通过的证书,服务器便接受了你已退役的设备。WireGuard 更直接:对等端只因为出现在列表里就被授权,因此快照之后删掉的对等端会重新存在。没有人重新批准过那条访问。是旧文件批准的。
服务器身份与客户端身份以不同方式失效
在 WireGuard 中,服务器身份是 wg0.conf 里的私钥,因此把该文件复制到第二台可达主机,就会造出两台身份相同、互不知晓的服务器。各自维护自己的对等端列表。在新主机上删掉对等端,旧主机仍会接受它;在一台上执行 wg show,你只看到一半真相。客户端也不会自行切换:一个配置文件只带一个 Endpoint,设备会继续与它被配置的地址通信,而那可能正是你想退役的主机。
OpenVPN 在同一层以服务器证书、其私钥和 tls-auth 或 tls-crypt 静态密钥重复。把三者都复制过去,客户端就无法区分实例;若两者都可达,重连可能落到任意一台,而每个日志文件只讲半个故事。证书颁发机构是更深一层的副本。恢复的 easy-rsa 树是第二个真值来源,能为你给它的任何名字签发有效证书。
客户端也会被重复,通常发生在迁移过程中。把配置文件复制到备用设备「只为测试」,就会产生一台密钥和通用名都相同的第二台设备。有 duplicate-cn 时两个会话可以同时在线,而 ccd 或 ifconfig-pool-persist 中的静态地址分配可能与原设备冲突。这是两台机器穿着同一个身份,服务器配置里没有任何东西能区分它们。
为旧端点选择三种状态之一
只有旧端点的命运定下来,恢复才算安全。退役:旧服务必须在新主机启动前停止接受 VPN 端口;若你够不到那台机器,就在网络边缘封掉该端口,只放行你的管理来源。修复同一台主机:复用身份可以,因为只有一台机器持有它,但之后要销毁旧密钥的磁盘副本或虚拟机快照,让它无法回来。构建可用对:两台主机需要不同的主机身份外加持有一个共享端点,例如浮动地址、负载均衡器或可移动的 DNS。复制私钥不是故障转移设计,那是两台服务器在争同一个名字。
动客户端之前,先确认你实际处在哪种状态。在 VPN 端口上应答的旧主机才是会接受被吊销设备的那一台,即使 DNS 已经搬走。检查监听和公钥:
ss -lunp | grep -E ':51820|:1194'
wg show wg0
wg pubkey < /etc/wireguard/server.key
先核对对等端、吊销和地址
列出恢复所声称的与你当前实际授权的差异。在 WireGuard 中,wg show wg0 给出每个对等端的密钥、端点、最近握手和传输计数,足以发现一台你已不再拥有的设备。用 wg set wg0 peer <key> remove 在线移除它,然后也要修改配置,否则对等端会在下次启动时回来。wg show wg0 allowed-ips 暴露第二个问题:同一地址上有两个对等端,或者一个你已经重新分配的地址。
在 OpenVPN 中,吊销列表是一个带日期的文件,恢复可能带回旧的那份。在客户端连接之前检查它:
openssl crl -in /etc/openvpn/crl.pem -noout -lastupdate -nextupdate
grep -E 'crl-verify|reneg-sec' /etc/openvpn/server.conf
如果最后更新早于吊销,服务器仍在尊重一张你已吊销的证书。OpenVPN 2.4 及以后会为每个新连接重新读取 CRL 文件,因此替换文件能阻止新会话,但已建立的隧道会持续到重新协商;reneg-sec 的默认值是 3600 秒,现在生效要靠调低它或重启服务。更早的构建可能不会那么可靠地读取该文件,所以在无法确认版本行为时重启。上文用到的对等端移除与 allowed-ips 语法见 wg(8) 手册。
同时清理已不存在设备的静态分配。在旧配置文件仍安装时,把退役设备的地址复用给新设备,恰好造出你想避免的那份重复。
用你已吊销的客户端验证
在隧道之外的网络按顺序执行检查。先让一台获授权设备连接,通过推送的解析器解析 DNS 并访问私有资源。然后被吊销的设备必须失败,用的是它现有配置而不是新配置。再从外部尝试旧端点:如果 VPN 端口仍能完成握手,旧主机就还活着,重复是真实的,不是理论上的。
重启恢复出来的主机并重复授权与吊销检查,因为这时配置文件才会压过你在运行时的改动。对比主机的公钥或证书指纹与退役机器用过的那个。两台在运行的机器指纹相同,说明恢复克隆了身份;只有一台指纹相同则正常。记录恢复的版本、密钥指纹以及被吊销的序列号或对等端密钥,然后在这轮核对之后做下一次备份,让它代表现在的服务。有效的测试不是客户端能连上。而是你移除的客户端被挡在外面,同时旧端点保持关闭。