介绍
防火墙是用于监控所有传入和传出流量的网络安全系统。它根据预定义的安全规则允许或阻止数据包。如果您正在运行生产系统,了解如何配置防火墙对您来说至关重要。受防火墙保护的系统不太可能被有害信息感染,因为它们很少暴露在 Internet 上,因为传入和传出流量都根据安全规则进行严格过滤。
什么是 UFW?
UFW,也称为 Uncomplicated Firewall,是一个前端框架,它提供了一个简单的界面,用于使用 iptables 实用程序来管理 netfilter - 默认的 Linux 内核数据包过滤系统。它是 Ubuntu 20.04 内置的防火墙系统,可以简化复杂的 iptables 命令,让您更轻松地创建基本的防火墙配置。
UFW 使用带有少量简单命令的命令行界面。它支持所有基本的防火墙规则、各种网络协议、日志记录和更多功能。您可以查看官方 UFW 文档中的大量功能列表。
先决条件
要配置 UFW,您需要事先准备好以下内容:
- 具有root权限的Ubuntu 20.04系统
- 命令行界面 (CLI) 的基础知识
注意: 本教程不仅适用于 Ubuntu 20.04,也适用于其他 LTS 版本。UFW 的早期版本从 Ubuntu 12.04 开始可用。
安装 UFW 防火墙
UFW 预装了 Ubuntu 操作系统。但是,您可以通过尝试使用以下命令安装它来确保您拥有最新版本的 UFW:
apt install ufw
现在您已经安装了最新版本的 UFW,让我们使用以下命令检查其状态:
ufw status
如您所见,默认情况下 UFW 处于非活动状态。我们将在首先进行一些重要更改后启用它。
UFW 默认防火墙策略
如果您是第一次使用 UFW,最好仔细检查默认的防火墙策略。为此,请检查 UFW 的默认配置文件:
nano /etc/default/ufw
默认情况下,UFW 配置为拒绝所有传入流量并允许所有传出流量。这意味着没有人能够访问您的系统,而您可以从任何应用程序或服务发出传出请求。
可以使用以下命令模式更改默认 UFW 策略:
ufw default <policy> <chain>
例如,如果要允许所有传入流量,请使用以下命令:
ufw default allow incoming
虽然以下命令将拒绝所有传出流量:
ufw default deny outgoing
每次政策更改后都会显示一条确认消息,例如:
允许 SSH 连接
默认情况下,UFW 将阻止所有传入流量,包括 SSH 和 HTTP。如果您在设置例外之前启用防火墙,您当前的远程会话将被终止,您将无法再连接到您的服务器。
为避免这种情况,您需要使用以下命令允许传入的 SSH 连接:
ufw allow ssh
它将打开端口 22,这是默认端口。可以看到,分别为 IPv4 和 IPv6 协议添加了两条新的防火墙规则:
如果您已将 SSH 配置为使用其他端口,请使用更具体的命令为 SSH 连接创建允许规则。例如,如果您有 ssh 服务侦听端口 4422,请使用以下命令:
ufw allow 4422/tcp
此防火墙规则允许 TCP 连接到端口 4422。
启用 UFW 防火墙
现在您的 UFW 已经配置完毕,您需要使用以下命令启用它:
ufw enable
这将立即启动 UFW 守护进程并在系统启动时启用它。通过键入 y 接受给定的提示,然后按 ENTER 继续。
您可以使用 systemctl 服务管理器仔细检查它是否正在运行:
systemctl status ufw
添加 UFW 防火墙规则
您可以通过 UFW 将各种防火墙规则应用于您的系统:
- allow– 允许流量
- deny– 静默丢弃流量
- reject– 拒绝流量并将错误数据包发送回发件人
- limit– 限制来自在过去 30 秒内尝试发起 6 个或更多连接的特定 IP 地址的连接
您可以在通用或更具体的范围内应用这些防火墙规则。通用范围将 UFW 规则应用于传入和传出流量。您可以将它与以下命令模式一起使用:
ufw [rule] [target]
另一方面,您可能希望将规则专门应用于传入或传出流量。在这种情况下,您应该相应地使用以下命令模式:
ufw [rule] in [target]
ufw [rule] out [target]
稍后我们将通过一些实际示例,以便您可以看到一些现实生活中的应用程序。
UFW 防火墙规则可以在许多不同的目标上运行。您可以将服务名称、IP 地址、端口甚至网络接口作为目标。现在让我们逐一了解这些目标模式,看看有什么可能。
目标应用程序配置文件
安装 ufw 后,大多数依赖网络进行通信的应用程序都会向 ufw 注册它们的配置文件,从而允许用户快速允许或拒绝对该应用程序的外部访问。
您可以使用以下命令检查哪些应用程序已在 UFW 注册:
ufw app list
您的输出可能如下所示:
要允许对这些应用程序中的任何应用程序进行传入和传出访问,请使用以下命令模式:
ufw allow [App name]
例如,您可以使用以下命令允许 OpenSSH 连接:
ufw allow OpenSSH
此防火墙规则允许 OpenSSH 应用程序的所有传入和传出流量。您可以更具体,只允许使用以下命令传入的 SSH 流量:
ufw allow in OpenSSH
尽管如此,在远程服务器中启用 SSH 访问的最佳实践是使用限制规则集。它只允许在 30 秒窗口内来自同一 IP 地址的 6 个连接,使您免受潜在的暴力攻击。在生产环境中对 OpenSSH 应用程序使用限制而不是允许规则集:
ufw limit OpenSSH
目标 IP 地址
在 UFW 中,您可以使用以下命令模式允许或拒绝特定 IP 地址:
ufw [rule] from [ip_address]
例如,如果您看到来自 IP 地址 192.168.100.20 的一些恶意活动,您可以使用以下命令阻止来自它的所有流量:
ufw deny from 192.168.100.20
尽管您已阻止来自此恶意 IP 地址的所有传入流量,但在某些情况下它仍可能到达您的服务器。这可能是因为 UFW 从上到下应用其规则。例如,您的第一个规则可能allow是所有传入流量到端口 22,您的deny from 192.168.100.20规则可能是一步失败。
为了避免这种情况,请使用该prepend选项将最具体的防火墙规则添加到规则列表的最顶部。最终命令如下所示:
ufw prepend deny from 192.168.100.20
目标端口
您还可以使用 UFW 定位特定端口或端口范围。例如,您可以允许使用任何协议连接到端口 8080:
ufw allow 8080
通常,您可能想要更具体,并且只允许使用特定网络协议连接到特定端口。例如,您可以仅使用以下命令允许 TCP 连接到端口 8080:
ufw allow 8080/tcp
但是,有时您的应用程序可能会针对不同的活动使用一系列端口。在这种情况下,您可以使用以下命令将端口范围列入白名单:
ufw allow 8080:9090/tcp
还记得定位 IP 地址的可能性吗?如果您不想阻止来自某个 IP 地址的所有流量,您可能会更具体一些,只阻止到特定端口的流量:
ufw deny from 192.168.100.20 to any port 53 proto udp
这样,您将使用 UDP 协议阻止从 192.168.100.20 到端口 53 的所有流量,该协议通常为 DNS 服务保留。
您的输出如下所示:
目标网络接口
一些系统配置了多个网络接口,可能需要不同的防火墙规则。幸运的是,UFW 允许您针对特定的网络接口并仅对其应用防火墙规则。让我们试试看。
首先,使用以下命令列出系统的网络接口:
ip addr
如您所见,目前在 Ubuntu 20.04 系统上配置了三个网络接口。让我们瞄准第二个名为eth0. 为此,您应该on eth0在 UFW 命令中使用该选项:
ufw allow in on eth0 from 192.168.100.255
现在所有来自 192.168.100.255 的流量只允许流向 eth0 网络接口:
检查 UFW 防火墙规则
现在您已经完成添加防火墙规则,最好仔细检查规则表以查看结果。您可以使用以下命令检查您的活动 UFW 规则:
ufw status
要查看 UFW 防火墙规则的更详细版本,请使用以下verbose选项:
ufw status verbose
如果您只想以您第一次键入规则的方式查看规则列表,请使用以下命令:
ufw show added
与 相比ufw status,ufw show命令即使在禁用 UFW 时也会显示防火墙规则。
删除 UFW 防火墙规则
现在您已经完成添加防火墙规则,如果您想删除其中的一些怎么办?为此,我们有两种方法可用:您可以通过规则编号删除规则,或通过名称删除规则。让我们逐一分析。
按编号删除
您可以通过对规则表进行编号来删除 UFW 规则,然后使用其关联编号删除特定规则。
首先,使用以下命令检查 UFW 规则的编号列表:
ufw status numbered
如您所见,您的防火墙规则现在有一个与之关联的编号,您可以使用这些编号来定位它们。例如,现在让我们使用以下命令删除第 6 条规则:
ufw delete 6
只需按 y 接受确认提示,规则 3 将被删除。
按规则名称删除
删除 UFW 规则的第二种方法是通过名称指定它。首先以您第一次输入规则的方式列出规则:
ufw show added
假设您要删除拒绝来自 192.168.100.20 IP 地址的所有流量的规则。为此,您必须使用delete带有规则名称的命令deny from 192.168.100.20。最终命令如下所示:
ufw delete deny from 192.168.100.20
管理 UFW 日志
UFW 支持多个日志记录级别,因此您可以仔细查看您的网络活动。默认情况下,UFW 会记录所有不符合定义策略的被阻止的数据包,以及符合您定义的规则的数据包。这是low您可以根据需要修改的日志记录级别。
您可以使用以下命令仔细检查您的日志记录活动:
ufw status verbose
输出的第二行显示日志记录已打开,日志记录级别设置为低。
设置 UFW 日志级别
有五个 UFW 日志记录级别。他们每个人都有不同的日志记录策略,并收集越来越多的数据。请注意,中等以上的日志级别可能会生成大量日志输出,并且可能会在繁忙的系统上快速填满磁盘,因此请谨慎使用。
- off- 禁用 UFW 管理的日志记录。
- low- 记录所有不匹配默认策略的被阻止的数据包,以及匹配预设规则的数据包。
- medium- 同上,加上所有不符合定义策略的允许数据包、所有无效数据包和所有新连接。
- high- 与上面相同,只是没有速率限制,加上所有具有速率限制的数据包。
- full- 同上,只是没有速率限制。
您可以使用以下命令模式更改默认的低日志记录级别:
ufw logging [level]
例如,使用以下命令将日志记录级别更改为中等:
ufw logging medium
通过这种方式,您可以启用中等日志记录级别并增加日志记录范围。
了解 UFW 日志
日志文件存储在 /var/log/ 目录中。您可以使用 ls 命令列出 UFW 创建的所有日志文件:
ls /var/log/ufw*
您现在可以检查您的日志文件以查找有关 UFW 活动的相关信息,例如:
less /var/log/ufw.log
如您所见,有大量信息可供您了解 UFW 活动。单行可能如下所示:
Jan 2 00:00:14 ubuntu-sandbox kernel: [142705.160851] [UFW BLOCK] IN=eth0 OUT= MAC=52:54:21:9a:ca:d7:fe:54:21:9a:ca:d7:08:00 SRC=198.144.159.22 DST=5.199.162.56 LEN=40 TOS=0x00 PREC=0x00 TTL=239 ID=61187 PROTO=TCP SPT=49194 DPT=10164 WINDOW=1024 RES=0x00 SYN URGP=0
现在让我们剖析这行 UFW 日志以更好地理解其含义。信息量最大的变量可能是 SRC 和 DST IP 地址及其相关端口号 SPT 和 DPT,但了解所有这些变量很有用:
- [UFW BLOCK]: 表示数据包被阻塞
- IN=eth0:传入流量设备。
- OUT=:传出流量设备为空,因为流量是传入的。
- MAC=52:54:21:9a:ca:d7:fe:54:21:9a:ca:d7:08:00:设备的MAC地址。
- SRC=198.144.159.22:数据包发送方的源IP地址。
- DST=5.199.162.56:用于接收数据包的目标 IP 地址。在这种情况下,它是我的 IP 地址。
- LEN=40:数据包长度。
- TOS=0x00和PREC=0x00:不推荐使用的不相关的变量并设置为 0。
- TTL=239: 一次换一个包。每个数据包在终止之前只能通过给定数量的路由器反弹。
- ID=61187:IP 数据报的唯一 ID,由同一数据包的片段共享。
- PROTO=TCP: 使用的协议。
- SPT=49194:连接的源端口。该端口可能表明是什么服务发起了连接尝试。
- DPT=10164: 连接的目标端口。该端口可能表明什么服务是用来接收连接尝试的。
- WINDOW=1024:发送方愿意接收的数据包大小。
- RES=0x00:该位保留供将来使用。它目前无关紧要并设置为 0。
- SYN URGP=0: SYN表示这个连接需要三次握手,URGP代表紧急指针相关性是无关紧要的,设置为0。
重置 UFW 配置
有时您需要从头开始配置。如果您想将 UFW 配置重置为默认设置,可以使用以下命令:
ufw reset
出现提示时输入y并按下ENTER以重置所有活动的防火墙规则并关闭 UFW 守护进程。如您所见,UFW 会自动为您刚刚重置的规则创建备份文件,以防您改变主意或想在将来查看它们。