我们刚刚创建了一个包含 12 个节点的集群,并希望使用 OpenVPN 来满足每台计算机之间的许多通信需要 100% 安全的要求(我们无法访问 100% 安全/私密的环境,因此我们必须在计算机之间进行加密。 )
所以我们有一个如下所示的设置:
+------------------+
| |
| OpenVPN Server |
| |
+------------------+
^
|
+-----+------+----------------+----------+
| | . |
| | . |
v v . v
+------------------+ +------------------+ ..... +------------------+
| | | | . . | |
| OpenVPN Client | | OpenVPN Client | . . | OpenVPN Client |
| A | | B | . . | n |
+------------------+ +------------------+ ..... +------------------+
OpenVPN 服务器是 12 台计算机之一,我们注意到每当任何客户端与另一个客户端通信时它就会陷入疯狂状态。查看防火墙信息,我们可以清楚地看到客户端之间不进行通信。相反,所有数据都会发送到服务器,然后转发到另一个客户端(即从客户端 A 到客户端 B,我们看到传输从 A 到服务器,然后从服务器到 B。)
我想知道的是:
每当 A 想要向 B 发送数据时,是否都会获得 B 的公钥?我想这不是因为 OpenVPN 客户端代码需要知道数据正在发送到 B。所以如果我理解正确的话,发生的事情是:
- 客户端 A 使用服务器公钥加密其数据。
- 客户端 A 将该加密的 blob 发送到服务器。
- 服务器使用其私钥来解密 blob。
- 服务器确定将 blob 转发到何处。
- 服务器使用客户端 B 公钥重新加密数据。
- 服务器将新加密的 blob 发送到客户端。
- 客户端 B 使用其私钥来解密 blob。
换句话说,它实际上看起来像这样:
+------------------+
| |
| OpenVPN Server |<-----------------------+
| | |
+------------------+ |
^ ^ ^ |
| | . |
| | . |
| | .................. |
| | . |
v v v v
+------------------+ +------------------+ ..... +------------------+
| | | | . . | |
| OpenVPN Client | | OpenVPN Client | . . | OpenVPN Client |
| A | | B | . . | n |
+------------------+ +------------------+ ..... +------------------+
那是对的吗?我试图在文档中找到类似的内容,但只能找到有关如何安装 OpenVPN 的内容(我们做到了并且它有效,但看起来相当慢!比我预期的慢得多。)
答案1
你是对的。在您的设置中,您的客户端和服务器之间有一组“点对点”VPN。客户端之间的通信必须在服务器上进行。
事实上,默认情况下,客户端无法看到彼此,除非服务器允许。从联机帮助页:
--client-to-client
Because the OpenVPN server mode handles multiple clients through
a single tun or tap interface, it is effectively a router. The
--client-to-client flag tells OpenVPN to internally route
client-to-client traffic rather than pushing all client-origi-
nating traffic to the TUN/TAP interface.
When this option is used, each client will "see" the other
clients which are currently connected. Otherwise, each client
will only see the server. Don't use this option if you want to
firewall tunnel traffic using custom, per-client rules.
答案2
是的,OpenVPN 客户端-服务器配置类似于您的第二张图。隧道位于 OpenVPN 服务器和 OpenVPN 客户端之间。 OpenVPN 服务器解密来自一个隧道的数据并将其加密到另一隧道中。
您可以使用点对点架构(而不是客户端-服务器架构)使用 OpenVPN 来实现您的第一个图表。您需要为网络中的每对机器设置一条 VPN 隧道:每个节点有 n 个 VPN 隧道,总共 n² 条隧道(这不太方便)。
除了一部分之外,您对正在发生的事情的分析大部分是正确的。公钥/私钥不(直接)用于加密/解密传入/传出隧道的数据包。相反,它们用于验证隧道并协商用于实际加密/解密(和 MAC)的对称会话密钥。