如何在Ubuntu上使用UFW设置防火墙

介绍

UFW(Uncomplicated Firewall)是一个针对简化配置防火墙过程而设计的接口,它基于iptables。虽然iptables是一个强大且灵活的工具,但对于初学者来说,学习如何正确配置防火墙可能会有些困难。如果您希望开始保护您的网络,但不确定应该使用哪个工具,那么UFW可能是您的正确选择。

本教程将向您展示如何在Ubuntu v18.04及以上版本上使用UFW设置防火墙。

先决条件

如果您使用的是Ubuntu 16.04或更低版本,我们建议您升级到更新的版本,因为Ubuntu不再为这些版本提供支持。这个系列指南将帮助您升级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 已启用,您可以检查位于 /etc/default/ufw 的 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 的传入和传出流量的默认策略。

要将默认的 UFW 传入策略设置为 拒绝,运行:

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

要将默认的 UFW 传出策略设置为 允许,运行:

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

这些命令将默认设置为拒绝传入和允许传出连接。这些防火墙默认策略可能足够用于个人计算机,但服务器通常需要响应外部用户的传入请求。我们接下来会详细讨论这个问题。

第3步 — 允许SSH连接

如果您现在启用UFW防火墙,它将拒绝所有传入连接。这意味着您需要创建明确允许合法传入连接的规则 — 例如SSH或HTTP连接 — 如果您希望服务器对这些类型的请求做出响应。如果您正在使用云服务器,则可能希望允许传入的SSH连接,以便您可以连接到并管理您的服务器。

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

这将创建防火墙规则,允许在默认情况下SSH守护程序监听的端口22上的所有连接。

通过服务名称允许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连接,您可以启用它。

第四步 — 启用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响应提示并按ENTER

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

步骤 5 — 允许其他连接

此时,您应该允许服务器需要响应的所有其他连接。您应该允许的连接取决于您的具体需求。您已经知道如何编写基于应用程序配置文件、服务名称或端口的连接规则;您已经为端口22上的SSH执行了此操作。您也可以为以下服务执行此操作:

  • 使用sudo ufw allow httpsudo ufw allow 80来允许端口 80 上的HTTP连接,这是未加密的Web服务器使用的端口。
  • HTTPS使用端口443,这是加密网络服务器使用的端口,可以使用sudo ufw allow httpssudo ufw allow 443
  • 同时使用HTTP和HTTPS的Apache,可以使用sudo ufw allow ‘Apache Full’
  • 同时使用HTTP和HTTPS的Nginx,可以使用sudo ufw allow ‘Nginx Full’

不要忘记使用sudo ufw app list检查服务器可用的应用程序配置文件。

除了指定端口或已知服务名称之外,还有几种允许连接的方法。接下来我们会看到其中一些。

特定端口范围

您可以使用UFW指定端口范围。一些应用程序使用多个端口,而不是单个端口。

例如,要允许X11连接,使用端口60006007的命令:

  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后跟端口号来指定允许连接的端口。例如,如果您想允许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数据库。

步骤6 —— 拒绝连接

如果您没有更改传入连接的默认策略,UFW配置为拒绝所有传入连接。通常,这简化了通过要求您明确允许特定端口和IP地址的规则来创建安全防火墙策略的过程。

然而,有时您会希望根据源 IP 地址或子网来拒绝特定连接,可能是因为您知道您的服务器正在受到攻击。此外,如果您想将默认传入策略更改为允许(不建议这样做),您需要为任何不想允许连接的服务或 IP 地址创建拒绝规则。

要编写拒绝规则,您可以使用先前描述的命令,将允许替换为拒绝

例如,要拒绝 HTTP 连接,您可以使用此命令:

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

或者,如果您想要拒绝来自203.0.113.4的所有连接,您可以使用此命令:

  1. sudo ufw deny from 203.0.113.4
Output
Rule added

在某些情况下,您可能还希望阻止服务器的出站连接。要拒绝所有用户使用服务器上的端口,例如用于 SMTP 流量的端口25,您可以使用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)连接的规则,您可以在UFW删除命令中指定如下:

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

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

通过名称删除UFW规则

您也可以通过可读的名称来引用规则,这基于规则的类型(通常为允许拒绝)以及该规则的目标服务名称或端口号,或者以前使用的应用程序配置文件名称。例如,如果要删除先前启用的名为Apache Full的应用程序配置文件的允许规则,可以使用:

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

delete命令对于以服务名称或端口为参考创建的规则工作方式相同。例如,如果您之前设置了一个允许HTTP连接的规则使用 sudo ufw allow 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处于活动状态,这应该是您遵循第3步后的情况,输出将会显示它处于活动状态,并列出已设置的任何规则。例如,如果防火墙设置为允许来自任何地方的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

如果您想要检查UFW如何配置防火墙,请使用 status 命令。

步骤 9 — 禁用或重置防火墙

如果您决定不使用 UFW 防火墙,您可以使用以下命令将其停用:

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

您创建的任何 UFW 规则都将不再生效。如果以后需要激活它,您始终可以运行 sudo ufw enable

如果您已经配置了 UFW 规则,但决定重新开始,可以使用重置命令:

  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