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

介紹

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
  2. 設置默認策略
  3. 允許SSH連線
  4. 啟用UFW
  5. 允許任何其他必要的連線
  6. 拒絕連線
  7. 刪除防火墙規則
  8. 檢查UFW狀態和規則
  9. 如何在Ubuntu上關閉或重置防火牆

第1步 — 確保IPv6已啟用

在Ubuntu的近期版本中,IPv6預設已啟用。實際上,這意味著大多數添加到伺服器的防火牆規則將包括IPv4和IPv6兩個版本,後者可通過UFW狀態命令輸出中的v6進行識別。要確保IPv6已啟用,您可以檢查您的UFW配置文件在/etc/default/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的defaultPolicy為incoming和outgoingtraffic。

要將defaultincomingpolicy設定為deny,執行以下命令:

要將defaultoutgoingpolicy設定為allow,執行以下命令:

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

這些命令將會將defaultpolicy設定為 denyingallincomingconnectionsandallowingalloutgoingconnections。這樣的defaultpolicy對於一般的使用者來說或許足夠,但服務器通常需要回應來自外面用戶的Request。我們會在下一個步驟中探討這個問題。

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

Step3—AllowingSSHConnections

如果您現在開啟UFW防火牆,它將會拒絶所有進來的連線。這表示您將需要創建rule explicitlyallowinglegitimateincomingconnections—例如SSHorHTTPconnections。如果您使用的是雲服務器,您可能想要allowincomingSSHconnections,以便您可以連接和管理您的服務器。

允許 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)

這將創建防火牆規則,允許所有在埠口 22 上的連接,這是 SSH 守護程序默認傾聽的埠口。

透過服務名稱允許 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并按回车

防火墙现已启用。运行sudo ufw status verbose命令以查看设置的规则。本教程的剩余部分将详细介绍如何使用UFW,例如允许或拒绝不同类型的连接。

第 5 步 — 允許其他連接

在這個階段,您應該允許您的伺服器需要回應的所有其他連接。您應該允許的連接取決於您的具體需求。您已經知道如何撰寫規則以根據應用程序配置文件、服務名稱或端口允許連接;您已經為 SSH 在端口 22 這樣做過了。您也可以為以下方面做這樣的操作:

  • HTTP 在端口 80,這是未加密的網絡伺服器使用的,使用 sudo ufw allow httpsudo ufw allow 80
  • 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

特定接口的防火墙规则

如果你想要创建一个只适用于特定网络接口的防火墙规则,你可以使用“allow in on”后面跟着网络接口的名字。

你可以使用以下命令查找你的网络接口:

  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資料庫了。

第六步:拒絕連接

如果您沒有改變預設的進階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:

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

Orifyouwanttodenyallconnectionsfrom203.0.113.4youshould usethiscommand:

  1. sudo ufw deny from 203.0.113.4
Output
Rule added

有些情況下,你還可能想要阻止服務器發出連線。要拒絕所有用戶使用伺服器的某個端口,例如端口 25 (用于SMTP流量),你可以使用 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)连接的规则,您可以像这样指定它:

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

这会提示您确认然后删除规则2,该规则允许HTTP连接。注意,如果您启用了IPv6,您还需要删除相应的IPv6规则。

透過名稱刪除UFW規則

除了使用規則編號外,您還可以通過其人類可讀的名稱來引用規則,該名稱基於規則的類型(通常為允許拒絕)以及該規則的目標服務名稱或端口號,或在使用應用程序配置文件時所用。例如,如果您想刪除一個之前啟用的允許規則,該規則為針對稱為Apache Full的應用程序配置文件,您可以使用:

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

用於通過其名稱或端口引用服務創建的規則的delete命令也是同樣的。例如,如果您之前使用sudo ufw allow http設定了一個允許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处于活动状态,则应该显示其活动状态并列出设置的任何规则。例如,如果防火墙设置为允许来自任何地方的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

使用status命令检查UFW配置的防火墙。

第9步 – 禁用或重置防火墙

如果您决定不再使用UFW防火墙,您可以使用以下命令禁用它:

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

任何使用UFW创建的规则都将不再生效。您总是可以稍后运行sudo ufw enable以重新启用它。

如果您已经有UFW规则配置但决定从头开始,可以使用reset命令:

  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应用平台从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