適用於: .NET Core 2.1、.NET Core 3.1、.NET 5
本文介紹如何設定本機防火牆來保護Linux虛擬機(VM)。
必要條件
完成本教學課程的這個部分沒有任何必要條件。
此部分的目標
您將瞭解如何設定防火牆來保護Linux VM。
雖然此元件沒有必要條件,但理想的設定會遵循先前各部分的指引。 您應該具有下列專案:
- Nginx 自動執行,並接聽埠 80 上傳送的要求
- Nginx 設定為反向 Proxy,並將連入要求路由傳送至在埠 5000 上接聽的 ASP.NET Core 應用程式。
- ASP.NET Core 應用程式,設定為在伺服器重新啟動或進程停止或當機時自動啟動
設定本機防火牆以允許從遠端計算機存取
幾乎所有的Linux散發套件都包含名為 iptables的本機防火牆。 此 初學者指南 已足夠快速啟動。 Iptables 是輕量型但功能強大的防火牆,使用原則鏈結來允許或封鎖流量。
根據 Ubuntu社群說明頁面,根據預設,iptable 會安裝在所有官方Ubuntu發行版上,並設定為允許所有流量。
雖然iptables是輕量型防火牆,但管理持續性規則並不容易。 幸運的是,有數個防火牆設定工具可讓您更輕鬆地在Linux中設定防火牆規則。 根據 官方 Ubuntu 防火牆檔,Ubuntu 的預設防火牆組態工具為 ufw
。 此工具提供比iptable提供的更方便使用的方法,以建立IPv4或IPv6主機型防火牆。
注意
ufw
一開始會停用預設。 因此,您必須啟用它才能使用它。
本教學課程中已使用的Linux VM不受任何防火牆規則的保護。 這是因為雖然已安裝並執行iptable,但沒有已定義的規則。
這裡的目標是只允許 HTTP 和 SSH(安全殼層)流量從外部連線到 VM。 若要達成此目的,請遵循下列步驟:
- 啟用
ufw
之前,請確定默認原則規則設定為 允許。 否則,您會執行與 VM 的 SSH 連線遺失的風險。 默認規則是未比對其他規則時所處理的規則。 啟用預設的「允許」規則可確保不會封鎖傳入的 SSH 流量。 此時,完全沒有「拒絕」規則。 因此,允許所有連入流量。 -
重要
明確新增 SSH 和 HTTP「允許」規則。 另請注意,如果您將 SSH 埠設定為不同於預設值 22 的值,您應該允許該埠。 例如,如果您將 SSH 埠變更為 2222,您應該執行下列命令:
sudo ufw allow 2222
。 - 將預設規則設定為「拒絕」規則。 這可確保如果通訊協定與 SSH 或 HTTP 不同,預設的「拒絕」規則將會拒絕流量。 例如,傳入的 HTTP 流量將會遭到拒絕。
ufw
開啟 。
這些步驟的命令會列在下列螢幕快照中。
這是每個步驟中發生的情況。
執行
sudo ufw status verbose
命令來檢查 ufw 的狀態。 根據預設,ufw 未啟用且為非使用中。執行
sudo ufw default allow
命令。 因為沒有預設「允許」規則以外的其他規則,因此 VM 上的每個埠都會被視為開啟。-
重要
執行
sudo ufw allow ssh
命令,將 SSH 通訊協定新增至允許的清單。 Protocol.ssh 是已知的通訊協定,且定義於 /etc/services 檔案中。 因此,可以使用 「ssh」 而不是 「22」。 請記住,如果您將 SSH 服務設定為接聽預設埠 22 以外的埠,您應該明確新增其他埠。 例如,如果您將 SSH 設定為接聽埠 2222,請執行下列命令:sudo ufw allow 2222
。 執行 來允許 HTTP 通訊協定
sudo ufw allow http
。 HTTP 是 /etc/services 檔案中定義的已知通訊協定。 因此,可以使用通訊協定名稱,而且sudo ufw allow http
可以執行 命令。 執行sudo ufw allow 80
也完全有效。注意
在允許 SSH 和 HTTP 通訊協定之後,您會想要將所有其他通訊協定新增至 「拒絕」清單。
您可以藉由執行
sudo ufw default deny
命令,將預設規則變更為拒絕來執行此動作。 只允許 SSH 和 HTTP 通訊協定。 其他通訊協定將會遭到拒絕。啟用
ufw
。
以下是完成此程序之後的 sudo ufw status verbose
輸出。
設定防火牆之後,請測試它是否正常運作。
測試本機防火牆
測試防火牆很簡單:建立 HTTP 通訊協定的「拒絕」規則,然後嘗試從另一部計算機存取網站。 要求應遭到封鎖。
在您建立此「拒絕」規則之前,請確定應用程式可在瀏覽器目前的設定中存取。 若要這樣做,請新增 buggyamb 主機名並使用 Linux VM 的公用 IP 位址,在用戶端電腦上編輯 C:\Windows\System32\drivers\etc\hosts 檔案。 buggyamb 主機名會解析 Linux VM IP 位址。 您可以將任何主機名新增至主機檔案,或者您可以嘗試直接連線到 Linux VM 的公用 IP 位址。
確認 HTTP 要求可以連線到 VM 之後,請嘗試啟用封鎖 HTTP 流量的規則。 這可確保防火牆可正常運作。 若要這樣做,請執行 sudo ufw deny http
來新增 HTTP 的「拒絕」規則。 這會為 HTTP 通訊協定新增兩個「拒絕」規則(在埠 80 上)。 其中一個適用於 IPv4,另一個適用於 IPv6。
再次開啟瀏覽器,然後嘗試存取在 Linux 中執行的 ASP.NET Core 應用程式。
此螢幕快照顯示預期的結果。
您可以使用 命令,直接在 Linux VM wget
內執行類似的測試。 下列螢幕快照顯示相同測試的必要步驟,方法是執行 wget
。
這是每個步驟中發生的情況。
已新增 HTTP 通訊協定的「拒絕」規則。
命令
wget buggyamb-external
已執行。 如您所猜測,“buggyamb-external” 主機名會解析 Linux VM 的公用 IP 位址。 若要這樣做,請使用vi編輯/etc/hosts
檔案。 如圖所示,wget
嘗試連線到它,但從未成功。 若要中斷作業,您必須按 CTRL+C。已新增 HTTP 通訊協定的「允許」規則。
再次執行
wget buggyamb-external
命令會產生不同的結果。 這次wget
能夠連線,因為允許 HTTP 通訊協定。 如下所示,wget
將Index.html檔案下載至目前的目錄。
您現在離完成偵錯 ASP.NET Core 應用程式所需的設定更近一步。 在您移至下一個部分之前,請再次確認本機防火牆中允許 SSH 和 HTTP。