如何在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,您可以检查 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 默认入站和出站流量策略。

要将默认的 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连接,您可以启用它。

步骤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回答提示,然后按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
  • 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数据库。

步骤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-22-04