介紹
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
在最近的 Ubuntu 版本中,IPv6 默認是啟用的。實際上,這意味著添加到伺服器的大多數防火牆規則將包括 IPv4 和 IPv6 版本,後者在 UFW 狀態命令的輸出中由 v6
標識。要確保啟用了 IPv6,您可以檢查位於 /etc/default/ufw
的 UFW 配置文件。使用 nano
或您喜歡的命令行編輯器打開此文件:
然後,確保 IPV6
的值設置為 yes
。它應該看起來像這樣:
保存並關閉文件。如果您使用 nano
,可以通過輸入 CTRL+X
,然後 Y
和 ENTER
來執行。
當在本指南的後續步驟中啟用 UFW 時,將配置為編寫 IPv4 和 IPv6 防火牆規則。
步驟2 — 設置默認策略
如果您剛開始使用 UFW,一個很好的第一步是檢查您的默認防火牆策略。這些規則控制如何處理未明確匹配任何其他規則的流量。
預設情況下,UFW 設置為拒絕所有傳入連接並允許所有傳出連接。這意味著任何試圖連接到您的服務器的人都無法連接,而服務器內的任何應用程序都可以連接到外部世界。允許特定服務和端口的其他規則作為此一般策略的例外。
為了確保您能夠跟隨本教程的其餘部分,現在您將設置 UFW 的傳入和傳出流量的默認策略。
要將 UFW 的默認傳入策略設置為 deny
,執行:
OutputDefault incoming policy changed to 'deny'
(be sure to update your rules accordingly)
要將 UFW 的默認傳出策略設置為 allow
,執行:
OutputDefault outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
這些命令將默認設置為拒絕傳入和允許傳出連接。這些防火牆默認策略可能足夠用於個人計算機,但是服務器通常需要對來自外部用戶的傳入請求做出響應。接下來我們會討論這個問題。
步驟 3 — 允許 SSH 連線
如果現在啟用您的 UFW 防火牆,它將拒絕所有傳入連線。這意味著您需要創建規則,明確允許合法的傳入連線 — 例如 SSH 或 HTTP 連線 — 如果您希望您的伺服器對這些類型的請求做出回應。如果您使用的是雲伺服器,您可能希望允許傳入的 SSH 連線,以便您可以連接並管理您的伺服器。
允許 OpenSSH UFW 應用程式配置檔
在安裝時,大多依賴網絡連接的應用程式將在 UFW 內註冊一個應用程式配置檔,這使用戶可以快速允許或拒絕對服務的外部訪問。您可以使用以下命令檢查目前在 UFW 中註冊的配置檔:
OutputAvailable applications:
OpenSSH
要啟用 OpenSSH 應用程式配置檔,請運行:
OutputRule added
Rule added (v6)
這將創建防火牆規則,允許默認情況下 SSH 守護程序監聽的端口 22
上的所有連線。
通過服務名稱允許 SSH
另一種配置 UFW 允許傳入的 SSH 連接的方法是通過參考其服務名稱:ssh
。
OutputRule added
Rule added (v6)
UFW 根據 /etc/services
文件知道服務使用的端口和協議。
通過端口號碼允許 SSH
或者,您可以通過指定端口而不是應用程序配置文件或服務名稱來撰寫等效的規則。例如,這個命令與前面的示例相同:
OutputRule added
Rule added (v6)
如果您配置了 SSH 守護程序使用不同的端口,您將需要指定適當的端口。例如,如果您的 SSH 服務器正在監聽端口 2222
,您可以使用此命令允許在該端口上的連接:
OutputRule added
Rule added (v6)
現在您的防火牆已經配置為允許傳入的 SSH 連接,您可以啟用它。
第 4 步 — 啟用 UFW
您的防火牆現在應該已配置為允許SSH連接。要驗證目前已添加了哪些規則,即使防火牆仍處於停用狀態,您可以使用:
OutputAdded user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
在確認您已設置一個允許入站SSH連接的規則後,您可以啟用防火牆,方法是:
OutputCommand 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 http
或sudo ufw allow 80
允許端口80上的HTTP,這是非加密Web服務器使用的端口。 - HTTPS 使用 443 端口,這是加密網絡服務器所用的端口,使用
sudo ufw allow https
或sudo ufw allow 443
- Apache 同時支持 HTTP 和 HTTPS,使用
sudo ufw allow ‘Apache Full’
- Nginx 同時支持 HTTP 和 HTTPS,使用
sudo ufw allow ‘Nginx Full’
別忘了使用 sudo ufw app list
檢查伺服器上有哪些應用程式配置文件。
除了指定端口或已知服務名稱外,還有其他幾種允許連接的方式。接下來我們將看到其中一些。
指定端口範圍
您可以使用 UFW 指定端口範圍。有些應用程式使用多個端口,而不是單個端口。
例如,要允許使用端口 6000
–6007
的 X11 連接,請使用以下命令:
在使用 UFW 指定端口範圍時,必須指定規則應適用的協議(tcp
或 udp
)。我們之前沒有提到這一點,因為不指定協議會自動允許兩種協議,這在大多數情況下都沒問題。
指定 IP 地址
在使用 UFW 時,您也可以在規則中指定 IP 地址。例如,如果您想要允許來自特定 IP 地址的連接,比如工作或家庭 IP 地址203.0.113.4
,您需要使用 from
參數,然後提供您想要允許的 IP 地址:
OutputRule added
您還可以通過添加to any port
,後跟端口號,指定該 IP 地址允許連接的端口。例如,如果您想要允許203.0.113.4
連接到端口22
(SSH),請使用此命令:
OutputRule added
子網
如果您想要允許一個 IP 地址子網,您可以使用 CIDR 表示法來指定子網遮罩。例如,如果您想要允許從203.0.113.1
到203.0.113.254
範圍內的所有 IP 地址,您可以使用此命令:
OutputRule added
同樣地,您也可以指定子網203.0.113.0/24
被允許連接的目標端口。再次以端口22
(SSH)作為示例:
OutputRule added
到特定網絡接口的連接
如果您想要創建一個僅適用於特定網絡接口的防火牆規則,可以通過指定「允許在」後跟網絡接口的名稱來完成。
在繼續之前,您可能需要查找您的網絡接口。要這樣做,請使用以下命令:
Output Excerpt2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
. . .
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
. . .
突出顯示的輸出顯示了網絡接口的名稱。它們通常被命名為像 eth0
或 enp3s2
這樣的名稱。
因此,如果您的服務器有一個名為 eth0
的公共網絡接口,您可以使用以下命令允許對其進行 HTTP 通信(端口 80
):
OutputRule added
Rule added (v6)
這樣做可以使您的服務器從公共互聯網接收 HTTP 請求。
或者,如果您希望您的 MySQL 數據庫服務器(端口 3306
)在私有網絡接口 eth1
上聽取連接,您可以使用以下命令:
OutputRule added
Rule added (v6)
這將允許私有網絡上的其他服務器連接到您的 MySQL 數據庫。
步驟 6 — 拒絕連接
如果您尚未更改傳入連接的默認策略,UFW 配置為拒絕所有傳入連接。通常,這簡化了通過要求您明確允許特定端口和 IP 地址的規則來創建安全防火牆策略的過程。
然而,有時您可能希望根據來源 IP 地址或子網拒絕特定的連接,可能是因為您知道您的伺服器正在受到攻擊。此外,如果您想將您的默認入站策略更改為允許(不建議),您需要為您不希望允許連接的任何服務或 IP 地址創建拒絕規則。
為了撰寫拒絕規則,您可以使用先前描述的命令,將 允許 替換為 拒絕。
例如,要拒絕 HTTP 連接,您可以使用此命令:
OutputRule added
Rule added (v6)
或者如果您想要拒絕來自 203.0.113.4
的所有連接,您可以使用此命令:
OutputRule added
在某些情況下,您可能還希望阻止伺服器的出站連接。要拒絕所有用戶使用伺服器上的端口,例如 SMTP 流量的端口 25
,您可以使用 deny out
後跟端口號:
OutputRule added
Rule added (v6)
這將阻止伺服器上的所有出站 SMTP 流量。
第 7 步 — 刪除規則
知道如何刪除防火牆規則與知道如何創建它們一樣重要。有兩種不同的方法可以指定要刪除的規則:按規則編號或按其人類可讀的名稱(類似於創建規則時指定的方式)。
按編號刪除 UFW 規則
要按編號刪除 UFW 規則,首先您需要獲取所有防火牆規則的編號列表。UFW 狀態命令具有一個選項,可以在每個規則旁邊顯示編號,如下所示:
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 刪除命令中指定它:
OutputDeleting:
allow 80
Proceed with operation (y|n)? y
Rule deleted
這將提示確認,然後刪除允許 HTTP 連接的規則 2。請注意,如果您啟用了 IPv6,您還會想刪除相應的 IPv6 規則。
按名稱刪除 UFW 規則
您也可以根據其人類可讀的名稱來引用規則,這個名稱是基於規則類型(通常是 允許
或 拒絕
)和該規則的服務名稱或端口號,或者在使用應用程序配置文件名稱的情況下。例如,如果您想刪除之前啟用的名為 Apache Full
的應用程序配置文件的 允許
規則,您可以使用:
OutputRule deleted
Rule deleted (v6)
delete
命令對於以服務名稱或端口來建立規則的情況工作方式相同。例如,如果您先前設置了一條允許 HTTP 連接的規則,使用 sudo ufw allow http
,這是您刪除該規則的方法:
OutputRule deleted
Rule deleted (v6)
因為在指定規則時,服務名稱可以與端口號互換使用,您也可以將相同的規則稱為 allow 80
,而不是 allow http
:
OutputRule deleted
Rule deleted (v6)
在按名稱刪除 UFW 規則時,如果存在的話,IPv4 和 IPv6 規則都會被刪除。
步驟 8 — 檢查 UFW 狀態和規則
隨時可以使用以下命令檢查 UFW 的狀態:
如果 UFW 被停用(默認情況下是這樣),您會看到類似以下的內容:
OutputStatus: inactive
如果 UFW 是啟用的(如果您按照步驟 3 進行了設置,應該是這樣),輸出將會顯示它是活動的,並列出任何已設置的規則。例如,如果防火牆設置為允許從任何地方進行 SSH(端口 22
)連接,輸出可能會類似於:
OutputStatus: 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 防火牆,可以使用以下命令停用它:
OutputFirewall stopped and disabled on system startup
使用 UFW 創建的任何規則將不再有效。如果以後需要啟用它,您始終可以運行 sudo ufw enable
。
如果您已經配置了 UFW 規則,但決定要重新開始,可以使用重置命令:
OutputResetting 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