如何在 Ubuntu 20.04 上安装和配置简单的防火墙

介绍

就像普通访客每天都会访问我们的服务器一样,其他怀有更邪恶意图的人也是如此。 在没有某种保护层的情况下运行在线服务是不合理的。 为了防止其中一些攻击,Ubuntu 附带了 ufw(简单防火墙)。 这是一个旨在使 Ubuntu 防火墙管理尽可能简单和用户友好的工具。 具体来说,ufw 为核心防火墙工具 netfilter 和 iptables 提供了一个更干净的接口,虽然这些工具很强大,但很难掌握。

什么是防火墙?

从广义上讲,防火墙是网络或服务器的一部分,旨在限制对硬件的潜在恶意和未经授权的访问,同时仍允许来自网络或服务器的向外通信。 为了帮助理解这里的概念,我们首先需要对防火墙的工作原理有一个舒适的理解。 如果您已经熟悉它,请随意跳过本节。

防火墙的工作原理

任何进出服务器的连接都有两个可用于识别它的主要信息。

  • 远程地址(服务器正在与之交谈的人)。
  • 港口。

把港口想象成一条双向街道。 每个端口都可以在其上运行自己的服务来与外界通信,或者根本不与外界通信。 按照惯例,0 到 1023 之间的端口专门用于系统服务。 动态分配的 1024 和 49151 之间的端口。 49152 和 65535 之间的端口,在需要时使用和释放。

防火墙具有一组规则,这些规则会针对每个传入连接进行检查。 使用这些规则,防火墙决定是允许还是中断连接。 最好默认禁止所有连接,然后只允许我们需要的连接。 这可以防止攻击者连接到服务器。

我们的 Ubuntu 防火墙的初始设置

以下所有示例均基于使用新的 Ubuntu 服务器,使用其中一种安装 官方 Ubuntu 映像.

注意:需要管理员权限,因此每个命令都将以 sudo.

自 8.04 LTS 以来的每个 ubuntu 版本都默认安装了 ufw。 如果需要,我们可以运行以下命令来安装它。

sudo apt install ufw -y

全新安装后,防火墙被禁用。

user@host:~$ sudo ufw status
[sudo] password for user:
Status: inactive 

允许用户访问

现在,我们还不想启用它,因为我们通过 SSH 通过端口 22 连接到服务器。 如果防火墙切断了该连接,我们可能会遇到很多麻烦。 幸运的是,很容易告诉防火墙让我们通过。

首先,我们必须弄清楚服务器看到我们使用的 IP 地址。 我们可以通过发出 who 命令找到该信息。

user@host:~$ who
user  pts/0     2021-01-02 23:55 (192.168.226.1) 

在那里我们可以看到我们当前的连接,其远程 IP 地址在括号中。 然后,我们将该 IP 地址列入白名单,因此允许来自我们 IP 的任何连接。

user@host:~$ sudo ufw allow from 192.168.226.1
Rules updated 

启用防火墙

即使我们已经添加了第一条规则,防火墙还没有过滤任何东西。 我们可以通过运行 ufw enable 来改变它。

user@host:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup 

我们现在收到一个明确的警告,该命令可能会中断现有的 SSH 连接。 这是一个很好的健全性检查,以确保我们实际上已经完成了允许自己访问的早期步骤。 既然我们已经做到了,我们继续说是的。

在检查服务器状态时,我们现在看到防火墙处于活动状态。 此外,默认情况下,它仅使用一条规则拒绝传入连接。

 user@host:~$ sudo ufw status verbose
 Status: active
 Logging: on (low)
 Default: deny (incoming), allow (outgoing), disabled (routed)
 New profiles: skip
 To                      Action   From
 --                      ------   ----
 Anywhere                ALLOW IN 192.168.226.1 

添加和删​​除防火墙规则

由于我们计划将其用作 Web 服务器,因此我们需要打开端口 80 和 443。这些是 HTTP 和 HTTPS 流量常用的端口。 虽然我们可以使用端口号添加规则,但 ufw 包括使用服务名称的能力。

 user@host:~$ sudo ufw allow 80/tcp
 Rule added
 Rule added (v6)
 user@host:~$ sudo ufw allow https
 Rule added
 Rule added (v6)
 user@host:~$ sudo ufw status
 Status: active
 To                      Action   From
 --                      ------   ----
 Anywhere                ALLOW    192.168.226.1
 80/tcp                  ALLOW    Anywhere
 443/tcp                 ALLOW    Anywhere
 80/tcp (v6)             ALLOW    Anywhere (v6)
 443/tcp (v6)            ALLOW    Anywhere (v6) 

在这里,我们允许使用端口号 (80) 的 HTTP 流量,并允许使用服务名称的 HTTPS 流量。 注意结果是一样的; 端口 80 和 443 现在对 IPv4 和 IPv6 流量开放。

协议

/etc/services 文件中提供了完整的协议列表。 它很长,但我们可以通过运行 less /etc/services 命令来查看它。 下面是一些需要记住的有用协议。

对于电子邮件传输:

  • SMTP/SMTPS
  • POP3/POP3S
  • IMAP/IMAP

对于文件传输:

  • FTP/FTPS

上述以 S 结尾的协议表示通过 TLS 协议等效的安全使用。 有许多选项可供选择,具体取决于我们计划对服务器执行的操作。

添加允许规则

一起来个实用的 example. 想象一下,我们有一个远程开发人员需要连接到服务器上的 MySQL 数据库。 同样,只允许我们需要的连接是个好主意。 所以,我们只想向他们的 IP 地址开放这个端口。 如果他们的 IP 是,对于 example192.168.1.50,我们可以使用以下命令让他们访问 MySQL 端口:

 user@host:~$ sudo ufw allow from 192.168.1.50 to any port mysql
 Rule added
 user@host:~$ sudo ufw status
 Status: active
 To                      Action   From
 --                      ------   ----
 Anywhere                ALLOW    192.168.226.1
 80/tcp                  ALLOW    Anywhere
 443/tcp                 ALLOW    Anywhere
 3306/tcp                ALLOW    192.168.1.50
 80/tcp (v6)             ALLOW    Anywhere (v6)
 443/tcp (v6)            ALLOW    Anywhere (v6) 

添加拒绝规则

请注意,端口 3306 现在只对开发人员的 IP 开放。 一旦我们决定他们不再需要此访问权限,我们就可以删除该规则。 我们使用 ufw delete 运行相同的命令来完成此操作,如下所示。

 user@host:~$ sudo ufw delete allow from 192.168.1.50 to any port mysql
 Rule deleted 

如果出于任何原因,我们想完全阻止这位前开发人员访问我们的服务器,我们可以使用此命令轻松完成。

 user@host:~$ sudo ufw deny from 192.168.1.50
 Rule added 

上述命令对 IP 范围或子网的工作方式相同,例如 192.168.0.0/24。 允许来自内部 IP 地址的连接可以节省时间。

删除规则

删除规则的另一种简单方法是按编号对其进行寻址。 我们可以通过运行 ufw status numbered 查看每个规则的编号。

 user@host:~$ sudo ufw status numbered
 Status: active
      To                         Action      From
      --                         ------      ----
 [ 1] Anywhere                   ALLOW IN    192.168.226.1
 [ 2] 80/tcp                     ALLOW IN    Anywhere
 [ 3] 443/tcp                    ALLOW IN    Anywhere
 [ 4] Anywhere                   DENY IN     192.168.1.50
 [ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
 [ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)
 user@host:~$ sudo ufw delete 4
 Deleting:
  deny from 192.168.1.50
 Proceed with operation (y|n)? y
 Rule deleted 

应用程序集成

ufw 的另一个非常有用的功能是我们安装的应用程序能够在 Ubuntu 防火墙上注册自己。 我们可以使用 ufw app list 命令查看这些规则。 在下面的 example,我们已经有了 Apache 并安装了 OpenSSH。 列表功能使我们能够轻松打开其他端口。

 user@host:~$ sudo apt install apache2
 [...]
 apache2 is already the newest version (2.4.41-4ubuntu3.1).
 user@host:~$ sudo ufw app list
 Available applications:
   Apache
   Apache Full
   Apache Secure
   OpenSSH 

有了这个,我们可以使用服务的全名来快速地允许或拒绝整个服务。 为了这 example,我们也已经删除了我们之前添加的端口 80 和 443。

 user@host:~$ sudo ufw status
 Status: active
 To                      Action   From
 --                      ------   ----
 Anywhere                ALLOW    192.168.226.1
 user@host:~$ sudo ufw allow "Apache Full"
 Rule added
 Rule added (v6)
 user@host:~$ sudo ufw status
 Status: active
 To                      Action   From
 --                      ------   ----
 Anywhere                ALLOW    192.168.226.1
 Apache Full             ALLOW    Anywhere
 Apache Full (v6)        ALLOW    Anywhere (v6) 

这些应用程序集成不同于我们之前使用的假名(分别用于 HTTPS 和 MySQL)。 它允许应用程序为其特定需求制定复杂的规则,而不是简单地转换为单个开放端口。 同样,它可以让我们通过一个命令启用或禁用此应用程序所需的所有规则。

结论

ufw 中包含更多超出本文范围的工具。 其中包括日志控制、更复杂的规则语法、速率限制和多个网络接口的管理。 如果您对与此 Ubuntu 防火墙工具相关的高级功能感兴趣,我们鼓励您在我们更愿意进行更改的非生产服务器或虚拟机上探索 ufw。 更多的 有关 ufw 功能的信息 可以通过手册页找到。

我们以成为 Hosting™ 中最乐于助人的人而自豪!

我们的技术支持人员全年 365 天、每周 7 天、每天 24 小时随时可以帮助解决与本文相关的任何问题。

我们可以通过我们的票务系统 [email protected]、电话(800-580-4986)或通过 在线聊天 或您喜欢的任何方法。 我们为您努力工作,以便您可以放松。