《Linux 實踐》一書

《Linux 實踐》一書 哈布羅居民大家好! 在書中,David Clinton 描述了 12 個現實項目,包括自動化備份和復原系統、設定 Dropbox 風格的個人檔案雲端以及建立您自己的 MediaWiki 伺服器。 您將透過有趣的案例研究探索虛擬化、災難復原、安全性、備份、DevOps 和系統故障排除。 每章最後都回顧了最佳實踐、新術語詞彙表和練習。

摘錄《10.1. 建立 OpenVPN 隧道”

我已經在本書中討論了很多關於加密的內容。 SSH 和SCP 可以保護透過遠端連線傳輸的資料(第3 章),檔案加密可以保護儲存在伺服器上的資料(第8 章),TLS/SSL 憑證可以保護網站和用戶端瀏覽器之間傳輸的數據(第9 章) 。 但有時您的資料需要在更廣泛的連線範圍內受到保護。 例如,也許您的一些團隊成員在路上工作,同時透過公共熱點連接到 Wi-Fi。 您絕對不應該假設所有此類接入點都是安全的,但您的員工確實需要一種連接到公司資源的方法,而這正是 VPN 可以提供幫助的地方。

正確設計的 VPN 隧道可在遠端用戶端和伺服器之間提供直接連接,並在資料通過不安全的網路傳輸時隱藏資料。 所以呢? 您已經見過許多可以透過加密來實現此目的的工具。 VPN 的真正價值在於,透過打開隧道,您可以連接遠端網絡,就像它們都是本地網路一樣。 從某種意義上說,您正在使用旁路。

使用這個擴展網絡,管理員可以在任何地方在他們的伺服器上執行工作。 但更重要的是,資源分佈在多個地點的公司可以讓所有需要它們的團體無論身在何處都可以看到並存取這些資源(圖 10.1)。

隧道本身並不能保證安全。 但其中一種加密標準可以包含在網路結構中,從而顯著提高安全性等級。 使用開源 OpenVPN 套件建立的隧道使用您已經閱讀過的相同 TLS/SSL 加密。 OpenVPN 並不是唯一可用的隧道選項,但它是最著名的選項之一。 它被認為比使用 IPsec 加密的替代第 2 層隧道協定稍快且更安全。

您是否希望團隊中的每個人在路上或在不同建築物中工作時都能安全地相互溝通? 為此,您需要建立一個 OpenVPN 伺服器以允許應用程式共用和存取伺服器的本機網路環境。 為此,您所需要做的就是運行兩個虛擬機器或兩個容器:一個充當伺服器/主機,另一個充當客戶端。 建立 VPN 不是一個簡單的過程,因此可能值得花幾分鐘來了解整體情況。

《Linux 實踐》一書

10.1.1. OpenVPN 伺服器配置

在開始之前,我會給你一些有用的建議。 如果您打算自己執行此操作(我強烈建議您這樣做),您可能會發現自己在桌面上打開多個終端窗口,每個窗口都連接到不同的電腦。 有時您可能會在視窗中輸入錯誤的命令。 為了避免這種情況,您可以使用 hostname 命令將命令列上顯示的電腦名稱變更為可以清楚告訴您所在位置的名稱。 執行此操作後,您將需要登出伺服器並重新登入以使新設定生效。 它看起來是這樣的:

《Linux 實踐》一書
透過遵循這種方法並為您使用的每台機器指定適當的名稱,您可以輕鬆追蹤您所在的位置。

使用主機名稱後,在執行後續命令時,您可能會遇到煩人的 Unable to Resolve Host OpenVPN-Server 訊息。 使用適當的新主機名稱更新 /etc/hosts 檔案應該可以解決該問題。

為 OpenVPN 準備伺服器

要在伺服器上安裝 OpenVPN,您需要兩個軟體套件:openvpn 和 easy-rsa(用於管理加密金鑰產生過程)。 如果需要,CentOS 使用者應該先安裝epel-release 儲存庫,就像您在第2 章中所做的那樣。為了能夠測試對伺服器應用程式的訪問,您還可以安裝Apache Web 伺服器(Ubuntu 上的apache2 和CentOS 上的httpd)。

當您設定伺服器時,我建議您啟動防火牆,阻止除 22 (SSH) 和 1194(OpenVPN 的預設連接埠)之外的所有連接埠。 這個例子說明了 ufw 如何在 Ubuntu 上運作,但我相信你還記得第 9 章中的 CentOS Firewalld 程式:

# ufw enable
# ufw allow 22
# ufw allow 1194

若要啟用伺服器上網路介面之間的內部路由,您需要取消註解 /etc/sysctl.conf 檔案中的一行 (net.ipv4.ip_forward = 1)。 這將允許遠端客戶端在連接後根據需要進行重定向。 要使新選項起作用,請運行 sysctl -p:

# nano /etc/sysctl.conf
# sysctl -p

您的伺服器環境現在已完全配置,但在準備好之前還需要做一件事:您需要完成以下步驟(我們將在接下來詳細介紹它們)。

  1. 使用 easy-rsa 套件提供的腳本在伺服器上建立一組公鑰基礎架構 (PKI) 加密金鑰。 本質上,OpenVPN 伺服器也充當其自己的憑證授權單位 (CA)。
  2. 為客戶端準備適當的密鑰
  3. 為伺服器配置server.conf文件
  4. 設定您的 OpenVPN 用戶端
  5. 檢查您的 VPN

產生加密金鑰

為了簡單起見,您可以在執行 OpenVPN 伺服器的同一台電腦上設定關鍵基礎架構。 但是,安全最佳實務通常建議使用單獨的 CA 伺服器進行生產部署。 OpenVPN 中使用的加密金鑰資源的產生和分發過程如圖 10.2 所示。 XNUMX.

《Linux 實踐》一書
當您安裝 OpenVPN 時,會自動建立 /etc/openvpn/ 目錄,但其中還沒有任何內容。 openvpn 和 easy-rsa 軟體包附帶範例範本文件,您可以將其用作配置的基礎。 要開始認證過程,請將 easy-rsa 範本目錄從 /usr/share/ 複製到 /etc/openvpn 並變更為 easy-rsa/ 目錄:

# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsa

easy-rsa 目錄現在將包含相當多的腳本。 表中10.1 列出了將用於建立金鑰的工具。

《Linux 實踐》一書

以上操作需要root權限,因此需要透過sudo su成為root。

您將使用的第一個檔案稱為 vars,包含 easy-rsa 在產生金鑰時使用的環境變數。 您需要編輯該檔案以使用您自己的值而不是已有的預設值。 這就是我的文件的樣子(清單 10.1)。

清單 10.1。 檔案 /etc/openvpn/easy-rsa/vars 的主要片段

export KEY_COUNTRY="CA"
export KEY_PROVINCE="ON"
export KEY_CITY="Toronto"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="[email protected]"
export KEY_OU="IT"

執行 vars 檔案會將其值傳遞到 shell 環境,它們將包含在新密鑰的內容中。 為什麼 sudo 指令本身不起作用? 因為在第一步中我們編輯了名為 vars 的腳本,然後套用它。 應用 and 意味著 vars 檔案將其值傳遞到 shell 環境,它們將包含在新鍵的內容中。

請務必使用新的 shell 重新執行該檔案以完成未完成的過程。 完成後,腳本將提示您執行另一個腳本 clean-all,以刪除 /etc/openvpn/easy-rsa/keys/ 目錄中的所有內容:

《Linux 實踐》一書
當然,下一步是執行 clean-all 腳本,然後執行 build-ca,它使用 pkitool 腳本建立根憑證。 系統會要求您確認 vars 提供的身份設定:

# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key

接下來是建立密鑰伺服器腳本。 由於它使用相同的 pkitool 腳本以及新的根證書,因此您將看到相同的問題來確認金鑰對的建立。 這些金鑰將根據您傳遞的參數進行命名,除非您在此電腦上執行多個 VPN,否則這些金鑰通常是伺服器,如範例所示:

# ./build-key-server server
[...]
Certificate is to be certified until Aug 15 23:52:34 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

OpenVPN 使用 Diffie-Hellman 演算法(使用 build-dh)產生的參數來協商新連線的身份驗證。 此處建立的檔案不需要保密,但必須使用目前活動的 RSA 金鑰的 build-dh 腳本產生。 如果您將來建立新的 RSA 金鑰,您還需要更新 Diffie-Hellman 檔案:

# ./build-dh

您的伺服器端金鑰現在將位於 /etc/openvpn/easy-rsa/keys/ 目錄中,但 OpenVPN 不知道這一點。 預設情況下,OpenVPN 將在 /etc/openvpn/ 中尋找金鑰,因此請複製它們:

# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn

準備客戶端加密金鑰

正如您已經看到的,TLS 加密使用一對匹配的金鑰:一個安裝在伺服器上,另一個安裝在遠端客戶端上。 這意味著您將需要客戶端密鑰。 我們的老朋友 pkittool 正是您所需要的。 在此範例中,當我們在 /etc/openvpn/easy-rsa/ 目錄中執行程式時,我們會向其傳遞一個客戶端參數以產生名為 client.crt 和 client.key 的檔案:

# ./pkitool client

這兩個客戶端檔案以及仍在keys/目錄中的原始ca.crt檔案現在應該安全地傳輸到您的客戶端。 由於他們的所有權和訪問權,這可能並不那麼容易。 最簡單的方法是手動將來源文件的內容(除了該內容之外什麼都沒有)複製到 PC 桌面上運行的終端中(選擇文本,右鍵單擊它並從選單中選擇“複製”)。 然後將其貼到與您在連接到客戶端的第二個終端機中建立的名稱相同的新檔案中。

但任何人都可以剪下和貼上。 相反,請像管理員一樣思考,因為您並不總是能夠訪問可以進行剪切/粘貼操作的 GUI。 將檔案複製到用戶的主目錄(以便遠端 scp 操作可以存取它們),然後使用 chown 將檔案的所有權從 root 更改為常規非 root 用戶,以便可以執行遠端 scp 操作。 確保所有檔案目前均已安裝且可存取。 稍後您將把它們移至客戶端:

# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/client.key
# chown ubuntu:ubuntu /home/ubuntu/client.crt
# chown ubuntu:ubuntu /home/ubuntu/ca.crt

準備好全套加密金鑰後,您需要告訴伺服器您要如何建立 VPN。 這是使用 server.conf 檔案完成的。

減少擊鍵次數

是不是打字太多了? 用括號擴展將有助於將這六個命令減少到兩個。 我相信您可以研究這兩個示例並了解發生了什麼。 更重要的是,您將能夠了解如何將這些原則應用於涉及數十甚至數百個元素的操作:

# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}

設定 server.conf 文件

您如何知道 server.conf 檔案應該是什麼樣子? 還記得您從 /usr/share/ 複製的 easy-rsa 目錄範本嗎? 安裝 OpenVPN 時,您會得到一個壓縮的設定模板文件,您可以將其複製到 /etc/openvpn/。 我將基於模板已存檔的事實向您介紹一個有用的工具:zcat。

您已經了解如何使用 cat 命令將檔案的文字內容列印到螢幕上,但是如果檔案是使用 gzip 壓縮的呢? 您始終可以解壓縮該文件,然後 cat 會很高興地輸出它,但這比必要的多了一兩個步驟。 相反,正如您可能已經猜到的那樣,您可以發出 zcat 命令,一步將解壓縮的文字載入到記憶體中。 在以下範例中,您不會將文字列印到螢幕,而是將其重定向到名為 server.conf 的新檔案:

# zcat 
  /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz 
  > /etc/openvpn/server.conf
$ cd /etc/openvpn

讓我們先把文件附帶的大量有用的文檔放在一邊,看看編輯完成後它會是什麼樣子。 請注意,分號 (;) 告訴 OpenVPN 不要讀取或執行下一行(清單 10.2)。

《Linux 實踐》一書
讓我們來看看其中一些設定。

  • 預設情況下,OpenVPN 在連接埠 1194 上運行。您可以變更此設置,例如,以進一步隱藏您的活動或避免與其他活動隧道發生衝突。 由於 1194 需要與客戶進行最少的協調,因此最好採用這種方式。
  • OpenVPN 使用傳輸控制協定 (TCP) 或使用者資料報協定 (UDP) 來傳輸資料。 TCP 可能會慢一些,但它更可靠,並且更容易被隧道兩端運行的應用程式理解。
  • 當您想要建立一個更簡單、更有效率的僅承載資料內容而不承載任何其他內容的 IP 隧道時,可以指定 dev tun。 另一方面,如果您需要連接多個網路介面(以及它們代表的網路),請建立乙太網路橋,則必須選擇 dev tap。 如果您不明白這一切意味著什麼,請使用 tun 參數。
  • 接下來的四行為 OpenVPN 提供了伺服器上三個身份驗證檔案的名稱以及您先前建立的 dh2048 選項檔案。
  • 伺服器行設定範圍和子網路遮罩,用於在登入時向客戶端指派 IP 位址。
  • 可選的推送參數「route 10.0.3.0 255.255.255.0」允許遠端客戶端存取伺服器後面的私有子網路。 要實現此功能,還需要在伺服器本身上設定網絡,以便私有子網了解 OpenVPN 子網 (10.8.0.0)。
  • port-share localhost 80 行可讓您將連接埠 1194 上的用戶端流量重新導向至偵聽連接埠 80 的本機 Web 伺服器。(如果您要使用 Web 伺服器來測試您的 VPN,這將很有用。)這只適用然後當選擇tcp協定時。
  • 必須透過刪除分號 (;) 來啟用使用者 nobody 和群組 nogroup 行。 強制遠端用戶端以 nobody 和 nogroup 身分執行可確保伺服器上的會話不受特權。
  • log 指定每次 OpenVPN 啟動時目前日誌條目將覆蓋舊條目,而 log-append 將新條目附加到現有日誌檔案。 openvpn.log 檔案本身寫入 /etc/openvpn/ 目錄。

此外,客戶端到客戶端的值也經常添加到設定檔中,以便多個客戶端除了 OpenVPN 伺服器之外還可以互相看到。 如果您對設定感到滿意,則可以啟動 OpenVPN 伺服器:

# systemctl start openvpn

由於 OpenVPN 和 systemd 之間關係的性質不斷變化,有時可能需要以下語法來啟動服務:systemctl start openvpn@server。

執行 ip addr 列出伺服器的網路介面現在應該輸出一個指向名為 tun0 的新介面的連結。 OpenVPN 將創建它來為傳入的用戶端提供服務:

$ ip addr
[...]
4: tun0: mtu 1500 qdisc [...]
      link/none
      inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
          valid_lft forever preferred_lft forever

在一切開始正常工作之前,您可能需要重新啟動伺服器。 下一站是客戶端計算機。

10.1.2. 設定 OpenVPN 用戶端

傳統上,隧道至少有兩個出口(否則我們將其稱為洞穴)。 伺服器上正確配置的 OpenVPN 會在一側引導流量進出隧道。 但您還需要一些在客戶端(即隧道的另一端)運行的軟體。

在本節中,我將重點放在手動設定某種類型的 Linux 電腦以充當 OpenVPN 用戶端。 但這並不是獲得這一機會的唯一方式。 OpenVPN 支援可在運行 Windows 或 macOS 的桌上型電腦和筆記型電腦以及 Android 和 iOS 智慧型手機和平板電腦上安裝和使用的用戶端應用程式。 有關詳細信息,請參閱 openvpn.net。

OpenVPN 軟體包需要像安裝在伺服器上一樣安裝在用戶端電腦上,但這裡不需要 easy-rsa,因為您使用的金鑰已經存在。 您需要將 client.conf 範本檔案複製到剛剛建立的 /etc/openvpn/ 目錄。 這次檔案將不會被壓縮,因此常規 cp 命令可以很好地完成這項工作:

# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf 
  /etc/openvpn/

client.conf 檔案中的大多數設定都是不言自明的:它們應該與伺服器上的值相符。 從下面的範例檔案中可以看到,唯一的參數是remote 192.168.1.23 1194,它告訴客戶端伺服器的IP位址。 再次確保這是您的伺服器位址。 您還應該強制客戶端電腦驗證伺服器憑證的真實性,以防止可能的中間人攻擊。 一種方法是新增remote-cert-tls server 行(清單10.3)。

《Linux 實踐》一書
現在您可以前往 /etc/openvpn/ 目錄並從伺服器中提取認證金鑰。 將範例中的伺服器 IP 位址或網域名稱替換為您的值:

《Linux 實踐》一書
在用戶端上執行 OpenVPN 之前,不會發生任何令人興奮的事情。 由於您需要傳遞幾個參數,因此您將從命令列執行此操作。 --tls-client 參數告訴 OpenVPN 您將充當客戶端並透過 TLS 加密進行連接,--config 指向您的設定檔:

# openvpn --tls-client --config /etc/openvpn/client.conf

仔細閱讀命令輸出以確保連接正確。 如果第一次出現問題,可能是由於伺服器和用戶端設定檔之間的設定不符或網路連線/防火牆問題。 以下是一些故障排除提示。

  • 仔細閱讀客戶端上 OpenVPN 操作的輸出。 它通常包含關於哪些事情不能做以及為什麼不能做的寶貴建議。
  • 檢查伺服器/etc/openvpn/目錄下的openvpn.log和openvpn-status.log檔案中的錯誤訊息。
  • 檢查伺服器和用戶端上的系統日誌中是否有與 OpenVPN 相關的定時訊息。 (journalctl -ce 將顯示最新條目。)
  • 確保伺服器和用戶端之間有活動的網路連線(更多內容請參閱第 14 章)。

關於作者

大衛·克林頓 - 系統管理員、教師和作家。 他管理、撰寫和創建了許多重要技術學科的教育材料,包括 Linux 系統、雲端運算(特別是 AWS)和 Docker 等容器技術。 他撰寫了《在一個月的午餐中學習 Amazon Web Services》一書(Manning,2017 年)。 他的許多視訊培訓課程都可以在 Pluralsight.com 上找到,他的其他書籍(關於 Linux 管理和伺服器虛擬化)的連結也可以在以下網址找到: bootstrap-it.com.

» 有關本書的更多詳細信息,請訪問 出版商的網站
» 目錄
» 摘抄

對於 Khabrozhiteley 使用優惠券可享 25% 折扣 - Linux
支付紙本書籍的費用後,將透過電子郵件發送電子書。

來源: www.habr.com

添加評論