介绍
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
在最近的 Ubuntu 版本中,默认情况下启用了 IPv6。实际上,这意味着添加到服务器的大多数防火墙规则将包括 IPv4 和 IPv6 版本,后者在 UFW 状态命令的输出中通过 v6
进行识别。为了确保启用了 IPv6,您可以检查 UFW 配置文件位于 /etc/default/ufw
。使用 nano
或您喜欢的命令行编辑器打开此文件:
然后确保 IPV6
的值设置为 yes
。它应该看起来像这样:
保存并关闭文件。如果您使用 nano
,可以通过键入 CTRL+X
,然后按 Y
和 ENTER
确认来执行此操作。
当在本指南的后续步骤中启用 UFW 时,将配置为编写 IPv4 和 IPv6 防火墙规则。
步骤 2 — 设置默认策略
如果您刚开始使用 UFW,一个好的第一步是检查您的默认防火墙策略。这些规则控制如何处理不明确匹配任何其他规则的流量。
默认情况下,UFW 被设置为拒绝所有传入连接并允许所有传出连接。这意味着任何试图连接到您的服务器的人都无法连接,而服务器内的任何应用程序都可以访问外部世界。允许特定服务和端口的其他规则被包括为此通用策略的例外。
为了确保您能够跟随本教程的其余部分进行操作,现在将设置您的 UFW 默认入站和出站流量策略。
要将默认的 UFW 入站策略设置为 拒绝
,请运行:
OutputDefault incoming policy changed to 'deny'
(be sure to update your rules accordingly)
要将默认的 UFW 出站策略设置为 允许
,请运行:
OutputDefault outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
这些命令将默认设置为拒绝传入连接并允许传出连接。这些防火墙默认值本身可能足够用于个人计算机,但服务器通常需要响应来自外部用户的传入请求。我们接下来会研究这个问题。
步骤3 — 允许SSH连接
如果你现在启用UFW防火墙,它将拒绝所有传入连接。这意味着你需要创建明确允许合法传入连接的规则 — 例如SSH或HTTP连接 — 如果你希望你的服务器响应这些类型的请求。如果你正在使用云服务器,你可能希望允许传入的SSH连接,这样你就可以连接并管理你的服务器。
允许OpenSSH UFW应用程序配置文件
在安装时,大多数依赖网络连接的应用程序将在UFW中注册一个应用程序配置文件,这使用户可以快速允许或拒绝对服务的外部访问。你可以通过以下方式检查当前在UFW中注册的配置文件:
OutputAvailable applications:
OpenSSH
要启用OpenSSH应用程序配置文件,请运行:
OutputRule added
Rule added (v6)
这将创建防火墙规则,允许在默认情况下SSH守护程序侦听的端口22
上的所有连接。
通过服务名称允许SSH
配置UFW以允许传入的SSH连接的另一种方法是通过引用其服务名称:ssh
。
OutputRule added
Rule added (v6)
UFW根据/etc/services
文件了解服务使用的端口和协议。
通过端口号允许SSH
或者,您可以通过指定端口而不是应用程序配置文件或服务名称来编写等效的规则。例如,此命令与前面的示例效果相同:
OutputRule added
Rule added (v6)
如果您配置了SSH守护程序使用不同的端口,则必须指定适当的端口。例如,如果您的SSH服务器正在侦听端口2222
,您可以使用此命令允许该端口上的连接:
OutputRule added
Rule added (v6)
现在您的防火墙已配置为允许传入的SSH连接,您可以启用它。
步骤4 — 启用UFW
您的防火墙现在应该配置为允许SSH连接。要验证到目前为止添加了哪些规则,即使防火墙仍处于禁用状态,您可以使用:
OutputAdded user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
确认您已经设置了允许传入SSH连接的规则后,您可以启用防火墙:
OutputCommand 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 http
或sudo ufw allow 80
允许端口80上的HTTP连接,这是未加密的Web服务器使用的端口。 - HTTPS在端口443上使用,这是加密网络服务器使用的端口,使用
sudo ufw allow https
或sudo ufw allow 443
- Apache同时支持HTTP和HTTPS,使用
sudo ufw allow ‘Apache Full’
- Nginx同时支持HTTP和HTTPS,使用
sudo ufw allow ‘Nginx Full’
别忘了用sudo ufw app list
检查服务器上可用的应用程序配置文件。
除了指定端口或已知服务名称外,还有几种允许连接的方法。我们接下来会看到其中一些。
特定端口范围
您可以使用UFW指定端口范围。一些应用程序使用多个端口,而不是单个端口。
例如,要允许使用端口6000
至6007
的X11连接,请使用以下命令:
在使用UFW指定端口范围时,必须指定规则应用的协议(tcp
或udp
)。我们之前没有提到这一点,因为不指定协议会自动允许两种协议,这在大多数情况下都是可以的。
特定IP地址
在使用UFW时,您还可以在规则中指定IP地址。例如,如果您想允许来自特定IP地址(例如工作或家庭IP地址203.0.113.4
)的连接,则需要使用from
参数,并提供您想要允许的IP地址:
OutputRule added
您还可以通过添加to any port
后跟端口号来指定允许IP地址连接的端口。例如,如果您想要允许203.0.113.4
连接到端口22
(SSH),请使用以下命令:
OutputRule added
子网
如果您想要允许IP地址子网,可以使用CIDR表示法指定网络掩码。例如,如果您想要允许从203.0.113.1
到203.0.113.254
的所有IP地址,则可以使用以下命令:
OutputRule added
同样,您还可以指定子网203.0.113.0/24
允许连接的目标端口。再次以端口22
(SSH)为例:
OutputRule added
连接到特定网络接口
如果您想创建一个仅适用于特定网络接口的防火墙规则,可以通过指定“allow in on”后跟网络接口的名称来实现。
在继续之前,您可能需要查看您的网络接口。要这样做,请使用以下命令:
Output Excerpt2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
. . .
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
. . .
突出显示的输出指示了网络接口的名称。它们通常被命名为类似eth0
或enp3s2
的东西。
因此,如果您的服务器有一个名为eth0
的公共网络接口,您可以使用以下命令允许HTTP流量(端口80
)通过:
OutputRule added
Rule added (v6)
这样做将允许您的服务器从公共互联网接收HTTP请求。
或者,如果您希望您的MySQL数据库服务器(端口3306
)在私有网络接口eth1
上监听连接,您可以使用以下命令:
OutputRule added
Rule added (v6)
这将允许您的私有网络中的其他服务器连接到您的MySQL数据库。
步骤6 — 拒绝连接
如果您没有更改传入连接的默认策略,那么UFW已配置为拒绝所有传入连接。通常,这简化了通过需要您明确允许特定端口和IP地址的规则来创建安全防火墙策略的过程。
然而,有时您可能希望根据源IP地址或子网拒绝特定连接,可能是因为您知道您的服务器正在受到攻击。此外,如果您想将默认传入策略更改为允许(不建议),则需要为不想允许连接的任何服务或IP地址创建拒绝规则。
要编写拒绝规则,您可以使用先前描述的命令,将允许替换为拒绝。
例如,要拒绝HTTP连接,您可以使用此命令:
OutputRule added
Rule added (v6)
或者,如果您想拒绝来自203.0.113.4
的所有连接,您可以使用此命令:
OutputRule added
在某些情况下,您可能还希望阻止服务器发出的连接。要拒绝所有用户使用服务器上的端口,例如SMTP流量的端口25
,您可以使用deny out
后跟端口号:
OutputRule added
Rule added (v6)
这将阻止服务器上的所有出站SMTP流量。
步骤 7 — 删除规则
了解如何删除防火墙规则与如何创建它们同样重要。有两种不同的方式来指定要删除的规则:按规则编号或按其人类可读的名称(类似于创建规则时指定的方式)。
按编号删除UFW规则
要按照编号删除UFW规则,首先您需要获取所有防火墙规则的编号列表。UFW状态命令有一个选项可以显示每个规则的编号,如下所示:
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删除命令中指定如下:
OutputDeleting:
allow 80
Proceed with operation (y|n)? y
Rule deleted
这将提示确认,然后删除允许HTTP连接的规则2。请注意,如果启用了IPv6,您还需要删除相应的IPv6规则。
按名称删除UFW规则
您也可以根据其人类可读的名称引用规则,这基于规则类型(通常为允许
或拒绝
)和该规则的目标服务名称或端口号,或者在使用应用程序配置文件名称的情况下。例如,如果要删除先前启用的名为Apache Full
的应用程序配置文件的允许
规则,则可以使用:
OutputRule deleted
Rule deleted (v6)
delete
命令对以名称或端口引用服务创建的规则的操作方式相同。例如,如果您之前设置了一个规则允许HTTP连接,使用sudo ufw allow http
,那么您可以这样删除该规则:
OutputRule deleted
Rule deleted (v6)
因为在指定规则时,服务名称可以与端口号互换使用,所以您也可以将同一规则称为allow 80
,而不是allow http
:
OutputRule deleted
Rule deleted (v6)
通过名称删除UFW规则时,如果存在IPv4和IPv6规则,则两者都将被删除。
步骤8 —— 检查UFW状态和规则
随时可以使用以下命令检查UFW的状态:
如果UFW被禁用(默认情况下是这样),您会看到类似以下的内容:
OutputStatus: inactive
如果UFW处于活动状态(如果您按照第3步的指示进行了操作),输出将会显示它是活动的,并列出任何设置的规则。例如,如果防火墙设置为允许来自任何地方的SSH(端口22
)连接,则输出可能如下:
OutputStatus: 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 防火墙,可以使用以下命令来停用它:
OutputFirewall stopped and disabled on system startup
您使用 UFW 创建的任何规则都将不再生效。如果以后需要激活它,您可以随时运行 sudo ufw enable
。
如果您已经配置了 UFW 规则,但决定重新开始,可以使用重置命令:
OutputResetting 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