![OpenVPN 连接每 2 分钟重置一次](https://linux22.com/image/770126/OpenVPN%20%E8%BF%9E%E6%8E%A5%E6%AF%8F%202%20%E5%88%86%E9%92%9F%E9%87%8D%E7%BD%AE%E4%B8%80%E6%AC%A1.png)
我在 AWS 的 Ubuntu 上有一个 OpenVPN 服务器,并使用 macOS 上的 Tunnelblick 连接到它。我连接到其他 VPN 服务器没有问题,但这个服务器似乎每 2 分钟就会超时/重置一次。
我的 OVPN 个人资料:
client
dev tun
proto udp
remote ............... 1194
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3
cipher AES-128-CBC
auth SHA256
key-direction 1
<ca>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</ca>
<cert>
Certificate:
Data:
Version: 3 (0x2)
...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
</key>
<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
...
-----END OpenVPN Static key V1-----
</tls-auth>
连接后,服务器将推送以下设置:
PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1 bypass-dhcp,dhcp-option DNS 8.8.8.8,route 172.16.0.0 255.255.240.0,route 172.16.16.0 255.255.240.0,route 172.16.128.0 255.255.240.0,route 172.16.144.0 255.255.240.0,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 1,cipher AES-256-GCM'
(特别注意ping 10,ping-restart 120
)
提高客户端的日志级别,看起来连接正在发送数据包:
2021-09-03 11:31:21.848620 UDP WRITE [62] to [AF_INET]...:1194: P_ACK_V1 kid=0 pid=[ #13 ] [ 6 ]
2021-09-03 11:31:21.848768 UDP WRITE [130] to [AF_INET]...:1194: P_DATA_V2 kid=0 DATA len=129
2021-09-03 11:31:21.848856 UDP WRITE [226] to [AF_INET]...:1194: P_DATA_V2 kid=0 DATA len=225
然而,连接总是在大约 2 分钟后断开。客户端日志显示:
2021-09-03 11:40:26.121900 [cc-vpn] Inactivity timeout (--ping-restart), restarting
2021-09-03 11:40:26.122379 SIGUSR1[soft,ping-restart] received, process restarting
2021-09-03 11:40:26.122504 MANAGEMENT: >STATE:1630683626,RECONNECTING,ping-restart,,,,,
2021-09-03 11:40:26.448969 MANAGEMENT: CMD 'hold release'
除了连接重新启动之外,服务器日志中实际上没有任何内容。
考虑到推送到客户端的设置,2 分钟超时是有道理的ping-restart 120
,但我不清楚为什么它认为它处于非活动状态。我错过了什么?客户端上是否有一个设置可以阻止 ping 正确发送到服务器?
具体来说,将 ping/ping-restart 添加到客户端配置似乎没有帮助(我认为它会被服务器 PUSH 覆盖)。
我该如何调试这个问题并找出为什么连接无法保持活动?
答案1
这通常表明有多个客户端正在使用此密钥/证书对:
- (1)认证
- (2)进行身份验证;服务器看到相同的证书,因此它认为只是替换了连接,并且(1)将不再接收保持活动 ping
- (1)错过一些 ping,判断连接已断开并重新连接,现在(2)不会收到 ping
- (2)错过一些 ping,判断连接已断开并重新连接,现在(1)不会收到 ping
您可以看到正在发生的事情,同时也可以清楚地看到ping-restart
这里是如何设置不活动超时的。
为了避免这种情况发生,您必须小心管理您的 VPN CA。特别是:
- 跟踪密钥的安装位置以及每个密钥安装设备的负责人。有办法联系任何拥有有效 VPN 密钥的人(例如,记录他们的电话号码、电子邮件等,您可以设置 OpenSSL,以便它在颁发证书时要求提供这些数据,并将这些数据直接记录到证书和 CA 索引中)。
- 切勿多次使用相同的密钥/证书;切勿将密钥/证书放入模板; 如果您克隆某个系统,请清除那里的密钥。每次系统更新时,必须始终生成密钥并重新颁发证书已部署。
- 如果某个用户在拥有有效密钥/证书的情况下要求(另一个)密钥/证书,他们必须解释原因。他们可能因为重新安装了操作系统而丢失了旧数据,并且忘记保存 VPN 配置;或者他们可能只是需要在另一台计算机上使用 VPN。或者其他什么。评估他们的解释,你要么首先撤销旧密钥之后再颁发另一个密钥,或者使用另一个 CN 颁发密钥以避免冲突。
- 教育您的用户始终通知您他们的密钥/证书不再使用(丢失或颁发原因丢失),以便您可以撤销它。然后您必须撤销它。
- 非常重要,教育用户紧急地如果他们怀疑密钥/证书被盗,请通知您,在这种情况下您必须立即撤销它。
这些都是“网络安全”过程的一部分。如果没有一定的纪律,VPN 就不可能安全,无论其软件和加密技术多么完善。
如果有人想知道为什么 OpenVPN 没有检测到这种情况并且没有将其报告到日志文件中,如下所述:它太不可靠且具有误导性。日志应该只包含原始事实,唯一确定的事实是同一个 CN 从不同位置重复连接;它不应该包含任何关于为什么会发生这种情况的假设。
当您遵循上述安全程序时,问题根本不会发生。如果发生,那只能意味着程序被违反。在这种情况下,为了保证 VPN 的安全,最安全的做法是假设密钥已被泄露并立即撤销证书。VPN 可能会对某些人(密钥的所有者)造成破坏,但这将是他们的无法遵循既定程序:他们没有通知您他们没有在某台计算机上使用 VPN,而是将其复制到另一台计算机上,或者证书被盗,等等。在重新教育他们后,您可以为他们颁发新证书。