Ubuntu

在客戶端之間發送數據時,OpenVPN 伺服器是否對數據進行了解密和重新加密?

  • September 18, 2016

我們剛剛創建了一個由 12 個節點組成的集群,並且希望 OpenVPN 用於每台電腦之間的許多通信需要 100% 安全(我們無法訪問 100% 安全/私有環境,因此我們必須在電腦之間進行加密。 )

所以我們有一個看起來像這樣的設置:

            +------------------+
            |                  |
            |  OpenVPN Server  |
            |                  |
            +------------------+
                     ^
                     |
               +-----+------+----------------+----------+
               |            |                .          |
               |            |                .          |
               v            v                .          v
+------------------+  +------------------+  .....  +------------------+
|                  |  |                  |  .   .  |                  |
|  OpenVPN Client  |  |  OpenVPN Client  |  .   .  |  OpenVPN Client  |
|               A  |  |               B  |  .   .  |               n  |
+------------------+  +------------------+  .....  +------------------+

OpenVPN 伺服器是 12 台電腦之一,我們注意到每當任何客戶端與另一個客戶端通信時它都會發瘋。查看防火牆資訊,我們可以清楚地看到客戶端之間沒有通信。相反,所有數據都發送到伺服器,然後轉發到另一個客戶端(即從客戶端 A 到客戶端 B,我們看到從 A 到伺服器的傳輸,然後從伺服器到 B。)

我想知道的是:

每當它想向 B 發送數據時,A 是否給定了 B 的公鑰?我想這不是因為 OpenVPN 客戶端程式碼需要知道數據正在發送到 B。所以如果我理解正確,正在發生的事情是:

  1. 客戶端 A 使用伺服器公鑰加密其數據。
  2. 客戶端 A 將該加密的 blob 發送到伺服器。
  3. 伺服器使用其私鑰解密 blob。
  4. 伺服器確定將 blob 轉發到何處。
  5. 伺服器使用客戶端 B 的公鑰重新加密數據。
  6. 伺服器將新加密的 blob 發送到客戶端。
  7. 客戶端 B 使用其私鑰解密 blob。

換句話說,它真的看起來像這樣:

            +------------------+
            |                  |
            |  OpenVPN Server  |<-----------------------+
            |                  |                        |
            +------------------+                        |
               ^       ^    ^                           |
               |       |    .                           |
               |       |    .                           |
               |       |    ..................          |
               |       |                     .          |
               v       v                     v          v
+------------------+  +------------------+  .....  +------------------+
|                  |  |                  |  .   .  |                  |
|  OpenVPN Client  |  |  OpenVPN Client  |  .   .  |  OpenVPN Client  |
|               A  |  |               B  |  .   .  |               n  |
+------------------+  +------------------+  .....  +------------------+

那是對的嗎?我試圖在文件中找到類似的內容,但只能找到有關如何安裝 OpenVPN 的內容(我們已經安裝並且它可以工作,但它似乎相當慢!比我預期的要慢得多。)

是的,OpenVPN 客戶端-伺服器配置看起來像您的第二張圖。隧道位於 OpenVPN 伺服器和 OpenVPN 客戶端之間。OpenVPN 伺服器解密來自一個隧道的數據並將其加密到另一個隧道中。

您可以使用對等架構而不是客戶端-伺服器架構使用 OpenVPN 實現您的第一個圖表。您需要為網路中的每對機器設置一個 VPN 隧道:每個節點都有 n 個 VPN 隧道,總共有 n² 個隧道(這不太方便)。

您對正在發生的事情的分析大多是正確的,除了一部分。公鑰/私鑰不(直接)用於加密/解密進出隧道的數據包。相反,它們用於驗證隧道並協商用於實際加密/解密(和 MAC)的對稱會話密鑰。

你是對的。在您的設置中,您的客戶端和伺服器之間有一組“點對點”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.

引用自:https://unix.stackexchange.com/questions/309925