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

简介

UFW(Uncomplicated Firewall)是iptables的一个接口,旨在简化配置防火墙的过程。虽然iptables是一个可靠且灵活的工具,但对于初学者来说,学习如何使用它来正确配置防火墙可能会比较困难。如果您想开始保护您的网络,但不确定使用哪个工具,UFW可能是适合您的正确选择。

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

先决条件

如果您使用的是Ubuntu 16.04或以下版本,我们建议您升级到更新的版本,因为Ubuntu已不再为这些版本提供支持。这套升级指南将帮助您升级Ubuntu版本。

要跟随本教程,您需要:

使用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传入策略设置为deny,请运行:

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

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

  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)

这将创建防火墙规则,允许所有在端口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 并按 ENTER

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

步骤5 — 允许其他连接

在此阶段,您应该允许服务器需要响应的所有其他连接。您应该允许的连接取决于您的具体需求。您已经知道如何根据应用程序配置文件、服务名称或端口编写规则以允许连接;您已经为端口22上的SSH这样做过。您可以也为以下连接这样做:

  • 端口80上的HTTP,这是未加密的Web服务器使用的,使用sudo ufw allow httpsudo ufw allow 80
  • 端口443上的HTTPS,这是加密的Web服务器使用的,使用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指定端口范围。一些应用程序使用多个端口,而不是单个端口。

例如,要允许使用端口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地址或子网拒绝特定的连接,也许是因为您知道您的服务器正在被来自那里的攻击所攻击。此外,如果您想将默认的传入策略更改为允许(不建议这样做),您需要创建拒绝规则以禁止任何您不想允许的连接。

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

例如,要拒绝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

在某些情况下,您可能还想阻止服务器的外出连接。要拒绝所有用户使用服务器上的一个端口,例如端口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规则

除了使用规则编号外,您还可以通过规则的可读名称来引用规则,该名称基于规则的类型(通常是allowdeny)以及该规则的目标服务名称或端口号,或者在那种情况下使用的应用程序配置文件名称。例如,如果您想要删除一个针对先前启用的名为Apache Full的应用程序配置文件的allow规则,您可以使用:

  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并删除之前定义的所有规则。这会给您一个全新的开始,如果您以后需要的话。请记住,默认策略不会恢复到原始设置,如果您修改过它们的话。

使用DigitalOcean应用平台从GitHub部署您的前端应用程序。让DigitalOcean专注于扩展您的应用程序。

结论

您的防火墙现在已经配置为允许(至少)SSH连接。请确保允许服务器所需的其他传入连接,同时限制不必要的连接,以确保您的服务器既实用又安全。

要了解更多常见的UFW配置,请查看UFW基础知识:常见防火墙规则和命令教程。

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-20-04