介紹
UFW,或稱Uncomplicated Firewall,是一個用於配置防火牆的接口,它旨在簡化configuring a firewall的过程。雖然iptables
是個堅強且靈活的工具,但它對於初学者來說可能很難學會如何使用來正確配置防火牆。如果您不知道該使用哪個工具來開始保護您的網絡,UFW可能會是您的最佳選擇。
本教程將向您展示如何在Ubuntu 18.04及以上版本上使用UFW設置防火牆。
前置條件
如果您仍在使用Ubuntu 16.04或以下版本,我們建議您升級至更latest的版本,因為Ubuntu不再為這些版本提供支援。此系列指南將助您進行升級。
要遵循本教程,您需要:
-
一台運行 Ubuntu 的伺服器,以及一個具有
sudo
權限的非 root 用戶。有關如何設置這些的指南,請從 這個列表 選擇您的發行版,並遵循我們的初始伺服器設置指南。 -
UFW 預設已經在 Ubuntu 上安裝。如果因某些原因被卸載了,您可以使用
sudo apt install ufw
來安裝它。
使用 UFW 設置 Ubuntu 防火牆
第1步 — 確保IPv6已啟用
在Ubuntu的近期版本中,IPv6預設已啟用。實際上,這意味著大多數添加到伺服器的防火牆規則將包括IPv4和IPv6兩個版本,後者可通過UFW狀態命令輸出中的v6
進行識別。要確保IPv6已啟用,您可以檢查您的UFW配置文件在/etc/default/ufw
。使用nano
或您喜歡的命令行編輯器打開此文件:
然後確保IPV6
的值設為yes
。它應該看起來像這樣:
保存並關閉文件。如果您使用的是nano
,您可以通過鍵入CTRL+X
,然後Y
和ENTER
來確認。
當在本指南的後續步驟中啟用UFW時,它將被配置為撰寫IPv4和IPv6的防火牆規則。
第2步 — 設置默認策略
如果您剛開始使用UFW,一個好的第一步是檢查您的默認防火牆策略。這些規則控制如何處理未明確匹配任何其他規則的流量。
預設情況下,UFW會將所有進來的連線拒之門外,而讓所有的出內連線通過。這表示任何試圖與您的伺服器連線的人都會失敗,而伺服器内的任何應用程式都能夠連線到外部世界。為了確保您能跟隨接下来的教學,現在將會設定UFW的defaultPolicy為incoming和outgoingtraffic。
要將defaultincomingpolicy設定為deny
,執行以下命令:
要將defaultoutgoingpolicy設定為allow
,執行以下命令:
OutputDefault incoming policy changed to 'deny'
(be sure to update your rules accordingly)
這些命令將會將defaultpolicy設定為 denyingallincomingconnectionsandallowingalloutgoingconnections。這樣的defaultpolicy對於一般的使用者來說或許足夠,但服務器通常需要回應來自外面用戶的Request。我們會在下一個步驟中探討這個問題。
OutputDefault outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
Step3—AllowingSSHConnections
如果您現在開啟UFW防火牆,它將會拒絶所有進來的連線。這表示您將需要創建rule explicitlyallowinglegitimateincomingconnections—例如SSHorHTTPconnections。如果您使用的是雲服務器,您可能想要allowincomingSSHconnections,以便您可以連接和管理您的服務器。
允許 OpenSSH UFW 應用程式個人檔案
在安裝時,大多數依賴於網路連接的應用程式將在 UFW 中註冊一個應用程式個人檔案,這允許用戶快速允許或拒絕外部對服務的訪問。您可以用以下方式檢查目前註冊在 UFW 的個人檔案:
OutputAvailable applications:
OpenSSH
要啟用 OpenSSH 應用程式個人檔案,請運行:
OutputRule added
Rule added (v6)
這將創建防火牆規則,允許所有在埠口 22
上的連接,這是 SSH 守護程序默認傾聽的埠口。
透過服務名稱允許 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
并按回车
。
防火墙现已启用。运行sudo ufw status verbose
命令以查看设置的规则。本教程的剩余部分将详细介绍如何使用UFW,例如允许或拒绝不同类型的连接。
第 5 步 — 允許其他連接
在這個階段,您應該允許您的伺服器需要回應的所有其他連接。您應該允許的連接取決於您的具體需求。您已經知道如何撰寫規則以根據應用程序配置文件、服務名稱或端口允許連接;您已經為 SSH 在端口 22
這樣做過了。您也可以為以下方面做這樣的操作:
- HTTP 在端口 80,這是未加密的網絡伺服器使用的,使用
sudo ufw allow http
或sudo ufw allow 80
- 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
特定接口的防火墙规则
如果你想要创建一个只适用于特定网络接口的防火墙规则,你可以使用“allow in on”后面跟着网络接口的名字。
你可以使用以下命令查找你的网络接口:
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資料庫了。
第六步:拒絕連接
如果您沒有改變預設的進階policy來允許传入connections,UFW是configuredto denyall incoming connections。generallyspeaking,this simplifies the process of creating a secure firewall policy by requiring you to create rules that explicitly allow specific ports and IP addresses through.
However,sometimesyouwillwanttodeny specificconnectionsbasedonthe sourceIPaddressorsubnet,perhapsbecausetheyserverisbeingattackedfromthere.Also,ifyouwanttohangeyourdefaultincomingpolicytoallow(whichisnotrecommended),youdonothavetocreatedenyrulesforany servicesorIPaddresses thatyou donotwanttoconnectionsfor.
Towritedenyrules,youcanuse thecommandsthatwere previouslydescribed,replacingallowwithdeny.
Forexample,todenyHTTPconnections,youcouldusethiscommand:
OutputRule added
Rule added (v6)
Orifyouwanttodenyallconnectionsfrom203.0.113.4
youshould usethiscommand:
OutputRule added
有些情況下,你還可能想要阻止服務器發出連線。要拒絕所有用戶使用伺服器的某個端口,例如端口 25
(用于SMTP流量),你可以使用 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)连接的规则,您可以像这样指定它:
OutputDeleting:
allow 80
Proceed with operation (y|n)? y
Rule deleted
这会提示您确认然后删除规则2,该规则允许HTTP连接。注意,如果您启用了IPv6,您还需要删除相应的IPv6规则。
透過名稱刪除UFW規則
除了使用規則編號外,您還可以通過其人類可讀的名稱來引用規則,該名稱基於規則的類型(通常為允許
或拒絕
)以及該規則的目標服務名稱或端口號,或在使用應用程序配置文件時所用。例如,如果您想刪除一個之前啟用的允許
規則,該規則為針對稱為Apache Full
的應用程序配置文件,您可以使用:
OutputRule deleted
Rule deleted (v6)
用於通過其名稱或端口引用服務創建的規則的delete
命令也是同樣的。例如,如果您之前使用sudo ufw allow http
設定了一個允許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处于活动状态,则应该显示其活动状态并列出设置的任何规则。例如,如果防火墙设置为允许来自任何地方的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
使用status
命令检查UFW配置的防火墙。
第9步 – 禁用或重置防火墙
如果您决定不再使用UFW防火墙,您可以使用以下命令禁用它:
OutputFirewall stopped and disabled on system startup
任何使用UFW创建的规则都将不再生效。您总是可以稍后运行sudo ufw enable
以重新启用它。
如果您已经有UFW规则配置但决定从头开始,可以使用reset命令:
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 Essentials: 常見防火牆規則與命令教程。
Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-20-04