介紹
UFW,即Uncomplicated Firewall,是一個針對簡化配置防火牆流程而設計的iptables
介面。儘管iptables
是一個穩固且靈活的工具,但對於初學者來說,學習如何正確配置防火牆可能會有困難。如果您想開始保護您的網絡,但不確定應該使用哪個工具,UFW可能是您的正確選擇。
本教程將向您展示如何在Ubuntu v18.04及以上版本上使用UFW設置防火牆。
先決條件
如果您使用的是Ubuntu 16.04或更低版本,我們建議您升級到更高版本,因為Ubuntu不再提供對這些版本的支持。這個指南集合將幫助您升級Ubuntu版本。
要遵循本教程,您需要:
-
一台運行Ubuntu的服務器,以及一個具有
sudo
權限的非root用戶。有關如何設置這些的指南,請從此列表中選擇您的發行版並按照我們的初始服務器設置指南進行操作。 -
在 Ubuntu 上,預設安裝了 UFW。如果因某些原因它已被刪除,您可以使用
sudo apt install ufw
來安裝。
使用 UFW 設置 Ubuntu 防火牆
步驟 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端口,這是加密Web伺服器使用的端口,使用
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 地址)的連接,您需要使用 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 地址創建拒絕規則。
要撰寫拒絕規則,您可以使用先前描述的命令,將allow替換為deny。
例如,要拒絕 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 應用平台 從 GitHub 部署您的前端應用程序。讓 DigitalOcean 專注於擴展您的應用。
結論
您的防火牆現已配置為允許(至少)SSH 連接。請確保允許任何其他所需的服務器入站連接,同時限制任何不必要的連接,以使您的服務器功能正常並保持安全。
要了解更常見的UFW配置,請查看UFW基礎:常見防火牆規則和命令教程。
Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu