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

本指南解释了什么是 UFW,如何在 Linux 中安装 UFW,以及如何在各种 Linux 操作系统上使用 UFW 设置防火墙。

介绍

安全是一项严肃的业务。 无论您是在数据中心还是在桌面上运行 Linux 操作系统,您都应该保护您的操作系统免受所有可能的威胁。

事实上,运行在企业环境中的服务器会得到很好的保护。 大多数公司投资数百万美元来保护他们的基础设施。

将有一个单独的网络团队、防火墙团队、安全团队来保护您的环境和 Linux 服务器。 当您在台式机或服务器上运行 Linux 时,情况并非如此。

您应该知道如何使用正确的工具来保护您的 Linux 机器。 一种这样的工具是 UFW.

什么是UFW?

UFW, 代表 ü不复杂 F愤怒wall,是一个防火墙程序,默认预装在基于 Ubuntu 的发行版中。

为什么选择 UFW 而不是 iptables? 你可能想知道。

如果您还不知道,Netfilter 是一个带有 Linux 内核的数据包过滤系统,iptables 用于通过一组命令来操作网络过滤器。

熟悉 iptables 可能需要时间,而且可能是一项艰巨的任务。 为了简化防火墙管理,创建了许多 iptables 的前端。 UFW就是其中之一。

UFW 是管理 iptables 的命令行前端。 它提供了一个管理和操作 netfilter 防火墙的框架。

UFW 在 8.04 LTS 版本之后的所有 Ubuntu 安装中默认可用。

还有一个用于 UFW 的图形前端,名为 古风. 我们将在单独的指南中讨论它。 在本文中,我们的重点是从命令行使用 ufw。

事不宜迟,让我们继续看看如何在 Linux 上安装和设置 UFW 防火墙。

1.在Linux中安装UFW

UFW 预装了大多数基于 Debian 和 Arch 的发行版。 要检查是否安装了 UFW,请运行以下命令:

$ which ufw
/usr/sbin/ufw
$ ufw version
ufw 0.36
Copyright 2008-2015 Canonical Ltd.

如果您的发行版上没有安装它,您可以使用发行版的默认包管理器安装它。

要在 Alpine Linux 中安装 UFW,请运行:

$ sudo apk add ufw

在 Arch Linux 及其变体(如 EndeavourOS 和 Manjaro Linux)中安装 UFW:

$ sudo pacman -S ufw

在 Debian、Ubuntu 及其衍生产品中安装 ufw:

$ sudo apt update
$ sudo apt install ufw

安装UFW Fedora:

$ sudo dnf install ufw

UFW 可在 [EPEL] 企业 Linux 操作系统的存储库,例如 RHEL、CentOS、AlmaLinux 和 Rocky Linux。

使能够 [EPEL] 存储库并在 RHEL、CentOS、AlmaLinux、Rocky Linux 中安装 UFW,如下所示:

$ sudo dnf install epel-release
$ sudo dnf install ufw

在 openSUSE 中安装 UFW:

$ sudo zypper install ufw

1.1。 启用、启动和停止 UFW 服务

在基于 Debian 的系统中,UFW 守护程序将自动启动和启用。

运行以下命令检查 UFW 服务的状态:

$ systemctl status ufw

样本输出:

● ufw.service - Uncomplicated firewall
     Loaded: loaded (/usr/lib/systemd/system/ufw.service; enabled; vendor prese>
     Active: active (exited) since Mon 2021-07-05 20:08:01 IST; 44s ago
       Docs: man:ufw(8)
             man:ufw-framework(8)
             file://usr/share/doc/ufw/README
    Process: 21690 ExecStart=/usr/libexec/ufw/ufw-init start (code=exited, stat>
   Main PID: 21690 (code=exited, status=0/SUCCESS)
        CPU: 169ms

Jul 05 20:08:01 ostechnix systemd[1]: Starting Uncomplicated firewall...
Jul 05 20:08:01 ostechnix systemd[1]: Finished Uncomplicated firewall.

检查 UFW 服务是否已启用并处于活动状态的另一种方法:

$ systemctl is-enabled ufw
enabled
$ systemctl is-active ufw
active

如果安装后未自动启动UFW服务,请运行以下命令启动UFW服务:

$ sudo systemctl start ufw

还应启用 Ufw 以在系统重新启动之间自动启动。

$ sudo systemctl enable ufw

或者,您可以将这两个命令合二为一,以一次性启用和启动 UFW 服务,如下所示:

$ sudo systemctl enable --now ufw

要停止 UFW 服务,只需运行:

$ sudo systemctl stop ufw

3. 在 Linux 上使用 UFW 设置防火墙

3.1。 获得帮助

如果您是 UFW 的新手,安装它后要做的第一件事是参考 UFW 的帮助部分和手册页,以了解有关 UFW 使用的基本概念。

$ ufw --help
$ man ufw

如果您忘记了语法或需要参考 ufw 的特定功能,这两个命令将非常方便。

3.2. 设置默认规则

使用 UFW,您可以创建防火墙规则(或策略)以允许或拒绝特定服务。 通过这些策略,您可以指示 UFW 应该允许或拒绝哪些端口、服务、IP 地址和接口。

ufw 附带了一些默认策略。 默认策略将丢弃所有传入连接并允许所有传出连接。

重要的: 如果您在远程服务器中设置 ufw,请确保在启用 ufw 防火墙之前已允许 ssh 端口或服务。

默认传入策略将拒绝所有传入连接。 因此,如果您没有配置规则以允许 SSH,您将被锁定在远程系统之外,您将无法登录系统。 当您在本地系统上运行 ufw 时,情况并非如此。

默认策略定义在 /etc/default/ufw 文件。 这是文件的内容:

Ufw 默认策略

从这里,我们可以设置默认策略。

或者,我们可以使用 ufw allow 命令为传入和传出命令设置默认策略:

$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing

3.2.1。 检查 UFW 防火墙规则的状态

要检查默认策略是否处于活动状态,请运行以下命令:

$ sudo ufw status

样本输出:

Status: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere                  
224.0.0.251 mDNS           ALLOW       Anywhere                  
SSH (v6)                   ALLOW       Anywhere (v6)             
ff02::fb mDNS              ALLOW       Anywhere (v6)             

对于更详细的状态信息,请使用以下命令:

$ sudo ufw status verbose

样本输出:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (SSH)               ALLOW IN    Anywhere                  
224.0.0.251 5353/udp (mDNS) ALLOW IN    Anywhere                  
22/tcp (SSH (v6))          ALLOW IN    Anywhere (v6)             
ff02::fb 5353/udp (mDNS)   ALLOW IN    Anywhere (v6)             

要查看编​​号格式,请运行:

$ sudo ufw status numbered
查看 UFW 状态

3.2.2. 添加规则

让我拿 SSH 作为一个 example 演示如何添加防火墙规则 ufw 命令。 看看下面的命令:

$ sudo ufw allow ssh
$ sudo ufw allow 22
$ sudo ufw allow 22/tcp
$ sudo ufw allow 2222/tcp

所有命令都具有相同的目的。

[ 1 ] – 在第一个命令中,我允许所有访问 ssh 服务。 UFW 默认知道 ssh 监听端口 22. 所以当你使用允许 ssh 服务,它还将执行端口规则 22.
[ 2 ] – 在第二个命令中,我明确告诉允许端口的传入连接 22.
[ 3 ] – 第三条命令与第二条命令相同。 它允许所有访问 tcp 港口 22. 支持 TCP 和 UDP 协议。
[ 4 ] – 在第四个命令中,我允许自定义 ssh 端口(即 2222) 接受传入的连接。

您不仅可以对 ssh 使用这四个命令,还可以对任何服务和端口使用这四个命令。 例如,如果您想连接到在端口上运行的 PostgreSQL 5433,那么应该像下面这样添加规则。

$ sudo ufw allow 5433

同样,我们可以使用 ufw deny 拒绝传入连接的命令:

$ sudo ufw deny 5433

此命令将拒绝端口上的流量 5433.

3.2.3。 删除 UFW 防火墙规则

要删除规则或策略,可以使用 ufw delete 命令。

例如,如果您不再希望允许 HTTP 流量,只需运行:

sudo ufw delete allow 80

3.2.4。 启用、禁用和重新加载 UFW 防火墙规则

这与启用和启动 UFW 守护程序不同。 启动 ufw systemd 单元不会强制执行您的防火墙规则。 UFW 有专门的命令来启用、禁用和重新加载防火墙规则。

要使规则生效,您必须运行以下命令:

$ sudo ufw enable
Firewall is active and enabled on system startup

正如我已经提到的,使用以下命令查看 UFW 防火墙规则的状态:

$ sudo ufw status

样本输出:

Status: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere                  
224.0.0.251 mDNS           ALLOW       Anywhere                  
SSH (v6)                   ALLOW       Anywhere (v6)             
ff02::fb mDNS              ALLOW       Anywhere (v6)           

要禁用防火墙规则,请运行:

$ sudo ufw disable
Firewall stopped and disabled on system startup

请注意: 上述命令只会禁用防火墙规则。 UFW 守护程序将在重新启动时仍在运行并启用。

添加任何策略后,使用命令重新加载 ufw 以使策略生效:

$ sudo ufw reload

3.2.5。 为端口范围添加策略

您可以为一系列端口添加策略,而不是为单个端口创建策略:

$ sudo ufw allow 8000:8080/tcp
$ sudo ufw deny 8000:8080/tcp

3.2.6。 为特定 IP 地址、子网和端口添加策略

您可以使用 ufw 创建更细粒度的规则。 假设您希望您的服务器仅从特定 IP 连接(ssh’ed),您可以通过添加以下规则来实现。

$ sudo ufw allow from 192.168.156.2
$ sudo ufw allow from 192.168.156.2 to any port 2222

第一个命令允许指定 IP 基于打开的端口进行连接。 第二个命令指定用户可以连接到端口 2222 只从 192.168.156.2.

允许来自同一子网的一组 IP 连接到 ssh,您可以在添加规则时使用子网,允许该子网的所有 IP 部分连接到端口 2222.

$ sudo ufw allow from 192.168.156.1/24 to any port 2222

3.2.7。 添加网络接口策略

您还可以基于网络接口创建策略。 以下命令将创建一个策略来接受网络接口的连接 en01 到港口 2222.

$ sudo ufw allow in on en01 to any port 2222

3.2.8。 使用试运行选项测试规则而不应用它们

UFW有 --dry-run 在不实际应用规则的情况下测试规则的选项。 为了 example以下是打开 SSH 端口时将应用的内容:

$  sudo ufw --dry-run allow ssh
空运行 UFW 命令空运行 UFW 命令

正如您在上面的输出中看到的那样,ufw 命令只输出结果规则,而不是在我们添加时应用它们 --dry-run 选项。 当您想要测试任何防火墙策略时,这会派上用场。

3.2.9。 为每个规则添加注释

您可能已经添加了几条规则。 在特定数量的规则(例如 50 条)之后,您无法记住规则的内容。

在这种情况下,您可以为每个规则添加注释,如下所示:

$ sudo ufw allow 22 comment 'open port 22 for ssh'

上面的命令将允许所有流量到端口 22 并为规则添加注释。 通过这种方式,您可以轻松找到特定规则的用途。

4. 哪个规则优先?

当您为相同的服务/端口创建多个规则时,优先级很重要。 策略按照它们创建的顺序获得优先级。 运行以下命令,它将为您提供策略及其优先级。

$ sudo ufw status numbered

样本输出:

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    Anywhere                  
[ 2] 2222                       ALLOW IN    Anywhere                  
[ 3] 2222                       ALLOW IN    192.168.156.2             
[ 4] 2222                       DENY IN     192.168.157.0/24          
[ 5] 22 (v6)                    ALLOW IN    Anywhere (v6)             
[ 6] 2222 (v6)                  ALLOW IN    Anywhere (v6)   

看一眼 [ 4 ] 在上面的输出中。 任何到端口的连接 2222 从子网 192.168.157.0/24 应该被丢弃。

但是当我尝试从同一子网中的任何机器连接时,连接将被允许,因为已给予高优先级 [ 2 ].

要覆盖此行为,您必须创建具有优先级的规则。 您可以删除现有规则并添加具有优先级的新规则并重新加载服务。

$ sudo ufw delete 4
Deleting:
deny from 192.168.157.0/24 to any port 2222
Proceed with operation (y|n)? y
Rule deleted
$ sudo ufw insert 2 deny from 192.168.157.0/24 to any port 2222
Rule inserted
$ sudo ufw reload
Firewall reloaded
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 2222 DENY IN 192.168.157.0/24
[ 3] 2222 ALLOW IN Anywhere
[ 4] 2222 ALLOW IN 192.168.156.2
[ 5] 22 (v6) ALLOW IN Anywhere (v6)
[ 6] 2222 (v6) ALLOW IN Anywhere (v6)

看看上面的输出。 优先级被重新分配给 [ 2 ]. 现在如果我尝试连接到端口 2222
192.168.157.0/24,我的连接将被拒绝。

5. UFW 日志记录

当出现问题时,日志是最好的选择。

要禁用 UFW 日志记录,请运行以下命令:

$ sudo ufw logging off
Logging disabled

要启用 UFW 日志记录,请运行:

$ sudo ufw logging on
Logging enabled

有四个级别的日志记录,即 低的, 中等的, 高的, 和 满的. 根据您选择的级别,将在下面生成日志 /var/log/ufw.log 文件。 默认情况下,日志级别会很低。

您可以使用以下命令设置为您想要的合适级别:

$ sudo ufw logging [ high | medium | Full | Low ]

要检查日志记录和日志级别的状态,请运行 ufw status 命令并寻找 logging 入口。

$ sudo ufw status verbose
Status: active
Logging: on (high)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

6. 应用简介

当您使用包管理器安装任何包时(例如 apt 或 pacman),定义该包规则的应用程序配置文件将在 ufw 中创建。

为了 example如果您正在使用安装 OpenSSH 服务器 apt,然后将为端口创建配置文件 22. 所有应用程序配置文件都存储在 /etc/ufw/applications.d 目录。

要获取应用程序配置文件列表,请运行以下命令:

$ sudo ufw app list

样本输出:

Available applications:
CUPS
OpenSSH

这是一台测试机。 我只安装了 OpenSSH。 所以你只看到两个配置文件。

要获取有关该配置文件及其实施的策略的详细信息,请运行以下命令:

$ sudo ufw app info 'OpenSSH'

样本输出:

Profile: OpenSSH
Title: Secure shell server, an rshd replacement
Description: OpenSSH is a free implementation of the Secure Shell protocol.
Port:
22/tcp

7.将UFW防火墙重置为默认策略

如果您希望清除您创建的所有规则并重置为默认值,您可以通过运行 ufw reset 命令。

$ sudo ufw reset

样本输出:

Resetting all rules to installed defaults. Proceed with operation (y|n)? y
Backing up 'user.rules' to '/etc/ufw/user.rules.20210705_131655'
Backing up 'before.rules' to '/etc/ufw/before.rules.20210705_131655'
Backing up 'after.rules' to '/etc/ufw/after.rules.20210705_131655'
Backing up 'user6.rules' to '/etc/ufw/user6.rules.20210705_131655'
Backing up 'before6.rules' to '/etc/ufw/before6.rules.20210705_131655'
Backing up 'after6.rules' to '/etc/ufw/after6.rules.20210705_131655'

当您运行此命令时,您当前的规则将在重置为默认配置文件之前进行备份。

Ufw 也有许多图形前端。 其中之一是 古风.

8. Gufw,UFW 的图形前端

你们中的一些人可能对命令行模式不满意。 幸运的是,有一个可用的 UFW 图形前端。

Gufw 是一个图形前端应用程序,用于管理 Linux 中的简单防火墙 (UFW)。 Gufw 主要是为 Linux 桌面安装和配置防火墙而开发的。

请参阅以下指南以了解如何在 Linux 上安装和配置 Gufw:

  • 如何在 Linux 桌面上使用 Gufw 设置防火墙

结论

在本指南中,我们讨论了什么是 UFW,如何在 Linux 上安装和设置 UFW 防火墙 example 命令。

现在轮到你在你的机器上测试 ufw 了。 我建议在您的桌面或服务器上实施之前在任何虚拟机中测试 ufw。

资源:

相关阅读:

  • 如何使用 Firejail 提高 Linux 系统的安全性