如何在 Ubuntu 上使用 UFW 設置防火牆

介紹

UFW(或稱Uncomplicated Firewall)是一個針對簡化防火牆配置過程而設計的 iptables 接口。雖然 iptables 是一個堅固且靈活的工具,但對於初學者來說,學習如何正確配置防火牆可能會很困難。如果你想開始保護你的網絡,但又不確定應該使用哪個工具,UFW 可能是你的正確選擇。

本教程將向你展示如何在 Ubuntu v18.04 及以上版本上使用 UFW 設置防火牆。

先決條件

如果你使用的是 Ubuntu 16.04 或更低版本,我們建議你升級到更新的版本,因為 Ubuntu 不再支持這些版本。這個 指南集合 將幫助你升級 Ubuntu 版本。

要遵循本教程,你需要:

  • 一台運行 Ubuntu 的伺服器,以及一個具有 sudo 權限的非 root 用戶。如需指導,請從 此列表中選擇你的發行版並遵循我們的初始伺服器設置指南。

  • 在Ubuntu上,UFW默認安裝。如果由於某些原因已經被卸載,您可以使用sudo apt install ufw重新安裝它。

設置Ubuntu防火牆使用UFW

  1. 啟用IPv6
  2. 設置默認策略
  3. 允許SSH連接
  4. 啟用UFW
  5. 允許任何其他所需連接
  6. 拒絕連接
  7. 刪除防火牆規則
  8. 檢查 UFW 狀態和規則
  9. 如何在 Ubuntu 上停用或重置防火牆

步驟 1 — 確保啟用 IPv6

在最近的 Ubuntu 版本中,IPv6 默認是啟用的。實際上,這意味著添加到伺服器的大多數防火牆規則將包括 IPv4 和 IPv6 版本,後者在 UFW 狀態命令的輸出中由 v6 標識。要確保啟用了 IPv6,您可以檢查位於 /etc/default/ufw 的 UFW 配置文件。使用 nano 或您喜歡的命令行編輯器打開此文件:

  1. sudo nano /etc/default/ufw

然後,確保 IPV6 的值設置為 yes。它應該看起來像這樣:

/etc/default/ufw excerpt
  1. IPV6=yes

保存並關閉文件。如果您使用 nano,可以通過輸入 CTRL+X,然後 YENTER 來執行。

當在本指南的後續步驟中啟用 UFW 時,將配置為編寫 IPv4 和 IPv6 防火牆規則。

步驟2 — 設置默認策略

如果您剛開始使用 UFW,一個很好的第一步是檢查您的默認防火牆策略。這些規則控制如何處理未明確匹配任何其他規則的流量。

預設情況下,UFW 設置為拒絕所有傳入連接並允許所有傳出連接。這意味著任何試圖連接到您的服務器的人都無法連接,而服務器內的任何應用程序都可以連接到外部世界。允許特定服務和端口的其他規則作為此一般策略的例外。

為了確保您能夠跟隨本教程的其餘部分,現在您將設置 UFW 的傳入和傳出流量的默認策略。

要將 UFW 的默認傳入策略設置為 deny,執行:

  1. sudo ufw default deny incoming
Output
Default incoming policy changed to 'deny' (be sure to update your rules accordingly)

要將 UFW 的默認傳出策略設置為 allow,執行:

  1. sudo ufw default allow outgoing
Output
Default outgoing policy changed to 'allow' (be sure to update your rules accordingly)

這些命令將默認設置為拒絕傳入和允許傳出連接。這些防火牆默認策略可能足夠用於個人計算機,但是服務器通常需要對來自外部用戶的傳入請求做出響應。接下來我們會討論這個問題。

步驟 3 — 允許 SSH 連線

如果現在啟用您的 UFW 防火牆,它將拒絕所有傳入連線。這意味著您需要創建規則,明確允許合法的傳入連線 — 例如 SSH 或 HTTP 連線 — 如果您希望您的伺服器對這些類型的請求做出回應。如果您使用的是雲伺服器,您可能希望允許傳入的 SSH 連線,以便您可以連接並管理您的伺服器。

允許 OpenSSH UFW 應用程式配置檔

在安裝時,大多依賴網絡連接的應用程式將在 UFW 內註冊一個應用程式配置檔,這使用戶可以快速允許或拒絕對服務的外部訪問。您可以使用以下命令檢查目前在 UFW 中註冊的配置檔:

  1. sudo ufw app list
Output
Available applications: OpenSSH

要啟用 OpenSSH 應用程式配置檔,請運行:

  1. sudo ufw allow OpenSSH
Output
Rule added Rule added (v6)

這將創建防火牆規則,允許默認情況下 SSH 守護程序監聽的端口 22 上的所有連線。

通過服務名稱允許 SSH

另一種配置 UFW 允許傳入的 SSH 連接的方法是通過參考其服務名稱:ssh

  1. sudo ufw allow ssh
Output
Rule added Rule added (v6)

UFW 根據 /etc/services 文件知道服務使用的端口和協議。

通過端口號碼允許 SSH

或者,您可以通過指定端口而不是應用程序配置文件或服務名稱來撰寫等效的規則。例如,這個命令與前面的示例相同:

  1. sudo ufw allow 22
Output
Rule added Rule added (v6)

如果您配置了 SSH 守護程序使用不同的端口,您將需要指定適當的端口。例如,如果您的 SSH 服務器正在監聽端口 2222,您可以使用此命令允許在該端口上的連接:

  1. sudo ufw allow 2222
Output
Rule added Rule added (v6)

現在您的防火牆已經配置為允許傳入的 SSH 連接,您可以啟用它。

第 4 步 — 啟用 UFW

您的防火牆現在應該已配置為允許SSH連接。要驗證目前已添加了哪些規則,即使防火牆仍處於停用狀態,您可以使用:

  1. sudo ufw show added
Output
Added user rules (see 'ufw status' for running firewall): ufw allow OpenSSH

在確認您已設置一個允許入站SSH連接的規則後,您可以啟用防火牆,方法是:

  1. sudo ufw enable
Output
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup

您將收到一個警告,指出該命令可能會干擾現有的SSH連接。您已經設置了一個允許SSH連接的防火牆規則,所以應該可以繼續。請使用y回應提示,然後按ENTER鍵。

防火牆現在已啟動。運行sudo ufw status verbose命令以查看設置的規則。本教程的其餘部分涵蓋了如何更詳細地使用UFW,例如允許或拒絕不同類型的連接。

步驟5 — 允許其他連接

此時,您應該允許服務器需要響應的所有其他連接。您應允許的連接取決於您的具體需求。您已經知道如何編寫基於應用程序配置文件、服務名稱或端口的允許連接的規則;您已經為端口22上的SSH執行了此操作。您也可以為以下服務執行此操作:

  • 使用sudo ufw allow httpsudo ufw allow 80允許端口80上的HTTP,這是非加密Web服務器使用的端口。
  • HTTPS 使用 443 端口,這是加密網絡服務器所用的端口,使用 sudo ufw allow httpssudo ufw allow 443
  • Apache 同時支持 HTTP 和 HTTPS,使用 sudo ufw allow ‘Apache Full’
  • Nginx 同時支持 HTTP 和 HTTPS,使用 sudo ufw allow ‘Nginx Full’

別忘了使用 sudo ufw app list 檢查伺服器上有哪些應用程式配置文件。

除了指定端口或已知服務名稱外,還有其他幾種允許連接的方式。接下來我們將看到其中一些。

指定端口範圍

您可以使用 UFW 指定端口範圍。有些應用程式使用多個端口,而不是單個端口。

例如,要允許使用端口 60006007 的 X11 連接,請使用以下命令:

  1. sudo ufw allow 6000:6007/tcp
  2. sudo ufw allow 6000:6007/udp

在使用 UFW 指定端口範圍時,必須指定規則應適用的協議(tcpudp)。我們之前沒有提到這一點,因為不指定協議會自動允許兩種協議,這在大多數情況下都沒問題。

指定 IP 地址

在使用 UFW 時,您也可以在規則中指定 IP 地址。例如,如果您想要允許來自特定 IP 地址的連接,比如工作或家庭 IP 地址203.0.113.4,您需要使用 from 參數,然後提供您想要允許的 IP 地址:

  1. sudo ufw allow from 203.0.113.4
Output
Rule added

您還可以通過添加to any port,後跟端口號,指定該 IP 地址允許連接的端口。例如,如果您想要允許203.0.113.4連接到端口22(SSH),請使用此命令:

  1. sudo ufw allow from 203.0.113.4 to any port 22
Output
Rule added

子網

如果您想要允許一個 IP 地址子網,您可以使用 CIDR 表示法來指定子網遮罩。例如,如果您想要允許從203.0.113.1203.0.113.254範圍內的所有 IP 地址,您可以使用此命令:

  1. sudo ufw allow from 203.0.113.0/24
Output
Rule added

同樣地,您也可以指定子網203.0.113.0/24被允許連接的目標端口。再次以端口22(SSH)作為示例:

  1. sudo ufw allow from 203.0.113.0/24 to any port 22
Output
Rule added

到特定網絡接口的連接

如果您想要創建一個僅適用於特定網絡接口的防火牆規則,可以通過指定「允許在」後跟網絡接口的名稱來完成。

在繼續之前,您可能需要查找您的網絡接口。要這樣做,請使用以下命令:

  1. ip addr
Output Excerpt
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state . . . 3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default . . .

突出顯示的輸出顯示了網絡接口的名稱。它們通常被命名為像 eth0enp3s2 這樣的名稱。

因此,如果您的服務器有一個名為 eth0 的公共網絡接口,您可以使用以下命令允許對其進行 HTTP 通信(端口 80):

  1. sudo ufw allow in on eth0 to any port 80
Output
Rule added Rule added (v6)

這樣做可以使您的服務器從公共互聯網接收 HTTP 請求。

或者,如果您希望您的 MySQL 數據庫服務器(端口 3306)在私有網絡接口 eth1 上聽取連接,您可以使用以下命令:

  1. sudo ufw allow in on eth1 to any port 3306
Output
Rule added Rule added (v6)

這將允許私有網絡上的其他服務器連接到您的 MySQL 數據庫。

步驟 6 — 拒絕連接

如果您尚未更改傳入連接的默認策略,UFW 配置為拒絕所有傳入連接。通常,這簡化了通過要求您明確允許特定端口和 IP 地址的規則來創建安全防火牆策略的過程。

然而,有時您可能希望根據來源 IP 地址或子網拒絕特定的連接,可能是因為您知道您的伺服器正在受到攻擊。此外,如果您想將您的默認入站策略更改為允許(不建議),您需要為您不希望允許連接的任何服務或 IP 地址創建拒絕規則。

為了撰寫拒絕規則,您可以使用先前描述的命令,將 允許 替換為 拒絕

例如,要拒絕 HTTP 連接,您可以使用此命令:

  1. sudo ufw deny http
Output
Rule added Rule added (v6)

或者如果您想要拒絕來自 203.0.113.4 的所有連接,您可以使用此命令:

  1. sudo ufw deny from 203.0.113.4
Output
Rule added

在某些情況下,您可能還希望阻止伺服器的出站連接。要拒絕所有用戶使用伺服器上的端口,例如 SMTP 流量的端口 25,您可以使用 deny out 後跟端口號:

  1. sudo ufw deny out 25
Output
Rule added Rule added (v6)

這將阻止伺服器上的所有出站 SMTP 流量。

第 7 步 — 刪除規則

知道如何刪除防火牆規則與知道如何創建它們一樣重要。有兩種不同的方法可以指定要刪除的規則:按規則編號或按其人類可讀的名稱(類似於創建規則時指定的方式)。

按編號刪除 UFW 規則

要按編號刪除 UFW 規則,首先您需要獲取所有防火牆規則的編號列表。UFW 狀態命令具有一個選項,可以在每個規則旁邊顯示編號,如下所示:

  1. sudo ufw status numbered
Numbered Output:
Status: active To Action From -- ------ ---- [ 1] 22 ALLOW IN 15.15.15.0/24 [ 2] 80 ALLOW IN Anywhere

如果您決定要刪除編號為 2 的規則,即允許端口 80(HTTP)連接的規則,您可以像這樣在 UFW 刪除命令中指定它:

  1. sudo ufw delete 2
Output
Deleting: allow 80 Proceed with operation (y|n)? y Rule deleted

這將提示確認,然後刪除允許 HTTP 連接的規則 2。請注意,如果您啟用了 IPv6,您還會想刪除相應的 IPv6 規則。

按名稱刪除 UFW 規則

您也可以根據其人類可讀的名稱來引用規則,這個名稱是基於規則類型(通常是 允許拒絕)和該規則的服務名稱或端口號,或者在使用應用程序配置文件名稱的情況下。例如,如果您想刪除之前啟用的名為 Apache Full 的應用程序配置文件的 允許 規則,您可以使用:

  1. sudo ufw delete allow "Apache Full"
Output
Rule deleted Rule deleted (v6)

delete 命令對於以服務名稱或端口來建立規則的情況工作方式相同。例如,如果您先前設置了一條允許 HTTP 連接的規則,使用 sudo ufw allow http,這是您刪除該規則的方法:

  1. sudo ufw delete allow http
Output
Rule deleted Rule deleted (v6)

因為在指定規則時,服務名稱可以與端口號互換使用,您也可以將相同的規則稱為 allow 80,而不是 allow http

  1. sudo ufw delete allow 80
Output
Rule deleted Rule deleted (v6)

在按名稱刪除 UFW 規則時,如果存在的話,IPv4 和 IPv6 規則都會被刪除。

步驟 8 — 檢查 UFW 狀態和規則

隨時可以使用以下命令檢查 UFW 的狀態:

  1. sudo ufw status verbose

如果 UFW 被停用(默認情況下是這樣),您會看到類似以下的內容:

Output
Status: inactive

如果 UFW 是啟用的(如果您按照步驟 3 進行了設置,應該是這樣),輸出將會顯示它是活動的,並列出任何已設置的規則。例如,如果防火牆設置為允許從任何地方進行 SSH(端口 22)連接,輸出可能會類似於:

Output
Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere

如果要檢查 UFW 如何配置防火牆,請使用 status 命令。

步驟 9 — 停用或重置防火牆

如果您決定不想使用 UFW 防火牆,可以使用以下命令停用它:

  1. sudo ufw disable
Output
Firewall stopped and disabled on system startup

使用 UFW 創建的任何規則將不再有效。如果以後需要啟用它,您始終可以運行 sudo ufw enable

如果您已經配置了 UFW 規則,但決定要重新開始,可以使用重置命令:

  1. sudo ufw reset
Output
Resetting all rules to installed defaults. This may disrupt existing ssh connections. Proceed with operation (y|n)? y Backing up 'user.rules' to '/etc/ufw/user.rules.20210729_170353' Backing up 'before.rules' to '/etc/ufw/before.rules.20210729_170353' Backing up 'after.rules' to '/etc/ufw/after.rules.20210729_170353' Backing up 'user6.rules' to '/etc/ufw/user6.rules.20210729_170353' Backing up 'before6.rules' to '/etc/ufw/before6.rules.20210729_170353' Backing up 'after6.rules' to '/etc/ufw/after6.rules.20210729_170353'

這將停用 UFW 並刪除以前定義的任何規則。這將使您重新開始使用 UFW。請注意,如果您曾經修改過,則默認策略不會更改為其原始設置。

使用DigitalOcean App Platform從 GitHub 部署您的前端應用程序。讓 DigitalOcean 專注於擴展您的應用程序。

結論

您的防火牆現已配置為允許(至少)SSH 連接。請確保允許您的服務器需要的任何其他傳入連接,同時限制任何不必要的連接,以使您的服務器功能正常且安全。

要了解更多常見的UFW配置,請查看UFW基本知識:常見防火牆規則和命令教程。

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-22-04