介紹
UFW,或稱為Uncomplicated Firewall,是一個簡化的防火牆管理介面,隱藏了較低層次的封包過濾技術(如iptables
和nftables
)的複雜性。如果您想開始保護您的網絡,並且不確定應該使用哪個工具,UFW可能是您的正確選擇。
本教程將向您展示如何在Debian 11上使用UFW設置防火牆。
先決條件
要按照本教程進行操作,您需要一台安裝有Debian 11並具有sudo
非root用戶的服務器,您可以通過按照第1至3步在Debian 11初始服務器設置教程中進行設置。
步驟1 – 安裝UFW
Debian 預設並未安裝 UFW。如果您已按照整個初始伺服器設定教程的步驟進行操作,則已經安裝並啟用了 UFW。否則,請使用apt
進行安裝:
- sudo apt install ufw
下面的步驟將引導您設置並啟用 UFW。
第二步 — 使用 IPv6 與 UFW(可選)
本教程是以 IPv4 為基礎撰寫的,但如果您啟用了 IPv6,也可以使用它。如果您的 Debian 伺服器已啟用 IPv6,請確保 UFW 被配置以支援 IPv6。這將確保 UFW 除了 IPv4 外,還管理 IPv6 的防火牆規則。要配置這一點,請使用nano
或您喜歡的編輯器打開 UFW 配置文件/etc/default/ufw
:
- sudo nano /etc/default/ufw
在文件中尋找IPV6
,確保其值為yes
:
IPV6=yes
保存並關閉文件。如果您使用的是nano
,請按CTRL+X
,然後按Y
,再按ENTER
保存並退出文件。
現在啟用 UFW 時,它將被配置為編寫 IPv4 和 IPv6 的防火牆規則。不過,在啟用 UFW 之前,您需要確保防火牆已配置以允許通過 SSH 連接。首先設置默認策略。
第三步 — 設置預設策略
如果您剛開始使用防火牆,首先需要定義的是預設策略。這些規則處理那些不明確符合其他規則的流量。UFW 的預設設定是拒絕所有的入站連接並允許所有的出站連接。這意味著任何嘗試連接到您的伺服器的人都將無法連接,而伺服器內的應用程式則可以連接外部世界。
將 UFW 規則恢復為預設設定,以確保您可以按照本教程進行操作。使用以下命令設置 UFW 使用的預設值:
- sudo ufw default deny incoming
- sudo ufw default allow outgoing
您將收到以下類似的輸出:
OutputDefault incoming policy changed to 'deny'
(be sure to update your rules accordingly)
Default outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
這些命令將預設設置為拒絕入站連接並允許出站連接。這些防火牆預設值可能已經足夠滿足個人電腦的需求,但伺服器通常需要對來自外部用戶的入站請求作出回應。您將在下一步開始進行此過程。
第四步 — 允許 SSH 連接
您目前無法啟用UFW防火牆,因為它會拒絕所有的入站連接,包括您訪問伺服器的嘗試。這意味著,如果您希望伺服器對這些類型的請求做出回應,您需要創建明確允許合法入站連接的規則,例如SSH或HTTP連接。如果您使用的是雲伺服器,您可能希望允許入站SSH連接,以便您可以連接並管理伺服器。
要配置伺服器以允許入站SSH連接,請使用以下命令:
- sudo ufw allow ssh
這將創建防火牆規則,允許在預設情況下SSH守護程序監聽的端口22
上的所有連接。UFW知道allow ssh
綁定的是哪個端口,因為它在/etc/services
文件中列出了該服務。
不過,您也可以通過指定端口而非服務名稱來撰寫等效的規則。例如,以下命令與上述命令產生相同的結果:
- sudo ufw allow 22
如果您配置了SSH守護程序使用不同的端口,則必須指定相應的端口。例如,如果您的SSH伺服器監聽在端口2222
上,您可以使用相同的命令,只需將22
替換為2222
。
現在,您的防火牆已配置為允許入站SSH連接,您可以啟用它。
第5步 – 啟用UFW
要啟用UFW,請使用以下命令:
- sudo ufw enable
您將收到一個警告,內容是該命令可能會中斷現有的SSH連接。您已經設置了一個允許SSH連接的防火牆規則,所以可以繼續進行。請使用y
鍵回答提示,然後按下ENTER
鍵。
防火牆現在已啟用。要查看您設置的規則,運行以下命令:
- sudo ufw status verbose
本教程的其餘部分將詳細介紹如何使用UFW,包括允許和拒絕不同類型的連接。
第6步-允許其他連接
此時,您應該允許服務器所需的其他所有連接。您應該允許的連接取決於您的具體需求。您已經知道如何根據服務名稱或端口編寫允許連接的規則;您已經為端口22
上的SSH進行了這樣的設置。
您可以為端口80
上的HTTP進行這樣的設置,這是未加密的Web服務器使用的端口。要允許此類流量,您應該輸入:
- sudo ufw allow http
您也可以為端口443
上的HTTPS進行同樣的設置,這是加密的Web服務器使用的端口。要允許此類流量,您應該輸入:
- sudo ufw allow https
在這兩種情況下,指定端口也是可行的,HTTP為80
,HTTPS為443
。例如:
- sudo ufw allow 80
然而,除了指定端口或已知服務外,還有其他允許連接的方法。這將在下一部分中討論。
特定的端口范围
您可以使用UFW指定端口范围。例如,一些应用程序使用多个端口而不是单个端口。
例如,要允许使用端口6000
–6007
的X11
连接,请使用以下命令:
- sudo ufw allow 6000:6007/tcp
- sudo ufw allow 6000:6007/udp
在使用UFW指定端口范围时,必须指定规则应适用的协议(tcp
或udp
)。之前没有提到这一点是因为不指定协议会自动允许两种协议,在大多数情况下是可以的。
特定的IP地址
在使用UFW时,您还可以指定IP地址。例如,如果您想要允许来自特定IP地址的连接,例如工作或家庭IP地址203.0.113.4
,您需要指定from
,然后是IP地址:
- sudo ufw allow from 203.0.113.4
您还可以通过添加to any port
后跟端口号来指定允许IP地址连接的特定端口。例如,如果您想要允许203.0.113.4
连接到端口22
(SSH),请使用此命令:
- sudo ufw allow from 203.0.113.4 to any port 22
子網路
如果您想允許一個IP地址的子網路,可以使用CIDR表示法來指定網絡遮罩。例如,如果您想允許從203.0.113.1
到203.0.113.254
範圍的所有IP地址,可以使用以下命令:
- sudo ufw allow from 203.0.113.0/24
同樣地,您還可以指定子網路203.0.113.0/24
允許連接的目標端口。以端口22
(SSH)為例:
- sudo ufw allow from 203.0.113.0/24 to any port 22
連接到特定網絡接口
如果您想創建僅適用於特定網絡接口的防火牆規則,可以通過指定allow in on
,後跟網絡接口的名稱來實現。
在繼續之前查找網絡接口將很有幫助。要這樣做,使用以下命令:
- ip addr
Output. . .
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
. . .
突出顯示的輸出指示網絡接口名稱。它們通常具有像eth0
或enp3s2
這樣的名稱。
例如,如果您的服務器有一個名為eth0
的公共網絡接口,您可以使用以下命令允許HTTP流量:
- sudo ufw allow in on eth0 to any port 80
這樣做將允許您的服務器接收來自公共互聯網的HTTP請求。
或者,如果您想讓 MySQL 數據庫服務器(端口3306
)在私有網絡接口eth1
上監聽連接,您可以使用以下命令:
- sudo ufw allow in on eth1 to any port 3306
這將允許私有網絡上的其他服務器連接到您的 MySQL 數據庫。
步驟 7 — 拒絕連接
如果您尚未更改傳入連接的默認策略,UFW 將配置為拒絕所有傳入連接。通常,這簡化了通過要求您創建明確允許特定端口和 IP 地址的規則來創建安全防火牆策略的過程。
有時,您可能希望基於源 IP 地址或子網掩碼拒絕特定的連接,因為您知道您的服務器正在從該地區遭受攻擊。此外,如果您想將默認傳入策略更改為允許
(不建議這樣做),則需要為任何不希望允許連接的服務或 IP 地址創建拒絕
規則。
要編寫拒絕
規則,您可以使用上述描述的命令,將允許
替換為拒絕
。
例如,要拒絕 HTTP 連接,您可以使用以下命令:
- sudo ufw deny http
或者如果您想從203.0.113.4
拒絕所有連接,您可以使用以下命令:
- sudo ufw deny from 203.0.113.4
現在,您可以學習如何實施刪除規則。
第八步 – 刪除規則
知道如何刪除防火牆規則和知道如何建立它們一樣重要。有兩種方式可以指定要刪除的規則:根據規則號碼或根據規則本身。這與創建規則時指定的方式類似。
根據規則號碼
如果您使用規則號碼來刪除防火牆規則,首先要做的是獲取防火牆規則列表。UFW status
命令帶有 numbered
選項,可以在每個規則旁邊顯示號碼:
- sudo ufw status numbered
OutputStatus: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN 15.15.15.0/24
[ 2] 80 ALLOW IN Anywhere
如果您決定要刪除允許在端口 80
上進行 HTTP 連接的規則 2
,您可以在以下 UFW delete
命令中指定這一點:
- sudo ufw delete 2
這將顯示一個確認提示,您可以用 y/n
回答。輸入 y
將刪除規則 2
。請注意,如果您啟用了 IPv6,您還需要刪除相應的 IPv6 規則。
根據實際規則
替代规则编号的方法是指定要删除的实际规则。例如,如果您想删除允许http
规则,可以这样写:
- sudo ufw delete allow http
您还可以使用允许80
来指定规则而不是服务名:
- sudo ufw delete allow 80
如果存在,此方法将同时删除IPv4和IPv6规则。
第9步 — 检查UFW状态和规则
您可以随时使用以下命令检查UFW的状态:
- sudo ufw status verbose
如果UFW被禁用(默认情况),输出将是这样的:
OutputStatus: inactive
如果UFW处于活动状态(如果您遵循了第3步),输出将显示其处于活动状态,并列出您设置的任何规则。例如,如果防火墙设置为允许来自任何地方的SSH(端口22
)连接,则输出可能包含类似以下内容:
OutputStatus: active
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
如果要检查UFW如何配置防火墙,可以使用status
命令。
第10步 — 禁用或重置UFW(可选)
如果您决定不使用UFW,可以使用此命令禁用它:
- sudo ufw disable
任何您使用UFW创建的规则都将不再生效。如果您需要重新激活它,您可以随时运行sudo ufw enable
。
如果您已经配置了UFW规则,但是决定重新开始,您可以使用重置命令:
- sudo ufw reset
这将禁用UFW并删除您之前定义的任何规则。请注意,如果您在任何时候修改了默认策略,它们的原始设置将不会更改。这将为您提供一个全新的UFW起点。
总结
您的防火墙现已配置为允许(至少)SSH连接。请确保允许您的服务器需要的任何其他传入连接,同时限制不必要的连接。这将确保您的服务器既功能正常又安全。
要了解更多常见的UFW配置,请参阅这篇关于UFW基础知识:常见防火墙规则和命令的教程。