2024年9月10日星期二

UFW 防火墙安装

快速指南:

1、更新软件包。
sudo apt update
2、安装 UFW。
sudo apt install ufw
3、如果你在远程位置连接你的服务器,在启用 UFW 防火墙之前,你必须先允许进来的 SSH 连接。否则,你将永远都无法连接到机器上。
sudo ufw allow 22/tcp

sudo ufw allow 22
如果 SSH 运行在非标准端口,你需要将上述命令中的 22 端口替换为对应的 SSH 端口。

设置默认策略。

允许所有入站(自定义)
sudo ufw default allow incoming
拒绝所有入站(默认)
sudo ufw default deny incoming
查看防火墙状态
sudo ufw status verbose

4、启动 UFW

sudo ufw enable


详细指南:

第 1 步 — 将 IPv6 与 UFW 一起使用(可选)

本教程是在考虑 IPv4 的情况下编写的,但只要您启用它,它就适用于 IPv6。 如果您的 Ubuntu 服务器启用了 IPv6,请确保将 UFW 配置为支持 IPv6,以便除了 IPv4 之外,它还将管理 IPv6 的防火墙规则。 为此,请使用 nano 或您喜欢的编辑器打开 UFW 配置。

sudo nano /etc/default/ufw

然后确保 IPV6 的值为 yes。 它应该如下所示:

/etc/default/ufw 摘录

IPV6=yes

保存并关闭文件。 现在,当启用 UFW 时,它将被配置为同时编写 IPv4 和 IPv6 防火墙规则。 但是,在启用 UFW 之前,我们需要确保您的防火墙配置为允许您通过 SSH 连接。 让我们从设置默认策略开始。

第 2 步 — 设置默认策略

如果您刚刚开始使用防火墙,首先要定义的规则是您的默认策略。 这些规则控制如何处理不明确匹配任何其他规则的流量。 默认情况下,UFW 设置为拒绝所有传入连接并允许所有传出连接。 这意味着任何试图访问您的服务器的人都无法连接,而服务器内的任何应用程序都可以访问外部世界。

让我们将您的 UFW 规则设置回默认值,这样我们就可以确保您能够按照本教程进行操作。 要设置 UFW 使用的默认值,请使用以下命令:

sudo ufw default deny incoming
sudo ufw default allow outgoing

您将收到如下输出:

OutputDefault incoming policy changed to 'deny'
(be sure to update your rules accordingly)
Default outgoing policy changed to 'allow'
(be sure to update your rules accordingly)

这些命令将默认设置为拒绝传入并允许传出连接。 仅这些防火墙默认值可能足以满足个人计算机的需要,但服务器通常需要响应来自外部用户的传入请求。 我们接下来会研究这个。

第 3 步 — 允许 SSH 连接

如果我们现在启用我们的 UFW 防火墙,它将拒绝所有传入的连接。 这意味着如果我们希望我们的服务器响应这些类型的请求,我们将需要创建明确允许合法传入连接(例如 SSH 或 HTTP 连接)的规则。 如果您使用的是云服务器,您可能希望允许传入的 SSH 连接,以便您可以连接和管理您的服务器。

要将您的服务器配置为允许传入的 SSH 连接,您可以使用以下命令:

sudo ufw allow ssh

这将创建防火墙规则,允许端口 22 上的所有连接,这是 SSH 守护程序默认侦听的端口。 UFW 知道端口 allow ssh 的含义,因为它在 /etc/services 文件中列为服务。

但是,我们实际上可以通过指定端口而不是服务名称来编写等效规则。 例如,此命令与上述命令的工作方式相同:

sudo ufw allow 22

如果您将 SSH 守护程序配置为使用不同的端口,则必须指定适当的端口。 例如,如果您的 SSH 服务器正在侦听端口 2222,您可以使用以下命令来允许该端口上的连接:

sudo ufw allow 2222

现在您的防火墙已配置为允许传入的 SSH 连接,我们可以启用它。

第 4 步 - 启用 UFW

要启用 UFW,请使用以下命令:

sudo ufw enable

您将收到一条警告,指出该命令可能会中断现有的 SSH 连接。 您已经设置了允许 SSH 连接的防火墙规则,因此可以继续。 使用 y 响应提示并点击 ENTER

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

第 5 步 — 允许其他连接

此时,您应该允许服务器需要响应的所有其他连接。 您应该允许的连接取决于您的特定需求。 幸运的是,您已经知道如何编写允许基于服务名称或端口的连接的规则; 我们已经在端口 22 上为 SSH 执行了此操作。 您也可以这样做:

  • 端口 80 上的 HTTP,这是未加密的 Web 服务器使用的,使用 sudo ufw allow http 或 sudo ufw allow 80
  • 端口 443 上的 HTTPS,这是加密 Web 服务器使用的,使用 sudo ufw allow https 或 sudo ufw allow 443

除了指定端口或已知服务之外,还有其他几种方法可以允许其他连接。

特定端口范围

您可以使用 UFW 指定端口范围。 一些应用程序使用多个端口,而不是单个端口。

例如,要允许使用端口 6000-6007 的 X11 连接,请使用以下命令:

sudo ufw allow 6000:6007/tcp
sudo ufw allow 6000:6007/udp

使用 UFW 指定端口范围时,您必须指定规则应适用的协议(tcp 或 udp)。 我们之前没有提到这一点,因为不指定协议会自动允许两种协议,这在大多数情况下是可以的。

特定 IP 地址

使用 UFW 时,您还可以指定 IP 地址。 例如,如果要允许来自特定 IP 地址的连接,例如 203.0.113.4 的工作或家庭 IP 地址,则需要指定 from,然后 IP 地址:

sudo ufw allow from 203.0.113.4

您还可以通过在端口号后添加 to any port 来指定允许 IP 地址连接的特定端口。 例如,如果要允许 203.0.113.4 连接到端口 22 (SSH),请使用以下命令:

sudo ufw allow from 203.0.113.4 to any port 22

子网

如果要允许 IP 地址的子网,可以使用 CIDR 表示法指定网络掩码。 例如,如果要允许从 203.0.113.1 到 203.0.113.254 的所有 IP 地址,可以使用以下命令:

sudo ufw allow from 203.0.113.0/24

同样,您也可以指定允许子网 203.0.113.0/24 连接的目标端口。 同样,我们将使用端口 22 (SSH) 作为示例:

sudo ufw allow from 203.0.113.0/24 to any port 22

与特定网络接口的连接

如果要创建仅适用于特定网络接口的防火墙规则,可以通过指定“allow in on”后跟网络接口名称来实现。

在继续之前,您可能需要查找网络接口。 为此,请使用以下命令:

ip addr
Output Excerpt2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
. . .
3: enp0s4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
. . .

突出显示的输出指示网络接口名称。 它们通常被命名为 eth0ens1 或 enp3s2

因此,如果您的服务器有一个名为 ens3 的公共网络接口,您可以使用以下命令允许 HTTP 流量(端口 80)到它:

sudo ufw allow in on ens3 to any port 80

这样做将允许您的服务器接收来自公共互联网的 HTTP 请求。

或者,如果您希望您的 MySQL 数据库服务器(端口 3306)侦听专用网络接口 eth1 上的连接,例如,您可以使用以下命令:

sudo ufw allow in on eth1 to any port 3306

这将允许您专用网络上的其他服务器连接到您的 MySQL 数据库。

第 6 步 — 拒绝连接

如果您尚未更改传入连接的默认策略,则 UFW 配置为拒绝所有传入连接。 通常,这通过要求您创建明确允许特定端口和 IP 地址通过的规则来简化创建安全防火墙策略的过程。

但是,有时您会希望根据源 IP 地址或子网拒绝特定连接,这可能是因为您知道您的服务器正在从那里受到攻击。 此外,如果您想将默认传入策略更改为 allow(不推荐),则需要为您不使用的任何服务或 IP 地址创建 deny 规则想要允许连接。

要编写 deny 规则,可以使用上述命令,将 allow 替换为 deny

例如,要拒绝 HTTP 连接,您可以使用以下命令:

sudo ufw deny http

或者,如果您想拒绝来自 203.0.113.4 的所有连接,您可以使用以下命令:

sudo ufw deny from 203.0.113.4

现在让我们看看如何删除规则。

第 7 步 — 删除规则

知道如何删除防火墙规则与知道如何创建它们一样重要。 有两种不同的方式来指定删除哪些规则:通过规则编号或通过实际规则(类似于在创建规则时指定规则的方式)。 我们将从 按规则编号 删除方法开始,因为它更容易。

按规则编号

如果您使用规则编号来删除防火墙规则,那么您要做的第一件事就是获取防火墙规则列表。 UFW status 命令具有在每个规则旁边显示数字的选项,如下所示:

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 删除命令中指定它,如下所示:

sudo ufw delete 2

这将显示一个确认提示,然后删除允许 HTTP 连接的规则 2。 请注意,如果您启用了 IPv6,您还需要删除相应的 IPv6 规则。

按实际规则

规则编号的替代方法是指定要删除的实际规则。 例如,如果你想删除 allow http 规则,你可以这样写:

sudo ufw delete allow http

您还可以通过 allow 80 指定规则,而不是通过服务名称:

sudo ufw delete allow 80

此方法将删除 IPv4 和 IPv6 规则(如果存在)。

第 8 步 — 检查 UFW 状态和规则

您可以随时使用以下命令检查 UFW 的状态:

sudo ufw status verbose

如果 UFW 被禁用(默认情况下),您将看到如下内容:

OutputStatus: inactive

如果 UFW 处于活动状态(如果您按照步骤 3 进行操作,则应该处于活动状态),输出将显示它处于活动状态,并且会列出所有设置的规则。 例如,如果防火墙设置为允许来自任何地方的 SSH(端口 22)连接,则输出可能如下所示:

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

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
22 (v6)                    ALLOW IN    Anywhere (v6)

如果要检查 UFW 如何配置防火墙,请使用 status 命令。

第 9 步 - 禁用或重置 UFW(可选)

如果您决定不想使用 UFW,可以使用以下命令禁用它:

sudo ufw disable

您使用 UFW 创建的任何规则都将不再有效。 如果您以后需要激活它,您可以随时运行 sudo ufw enable

如果您已经配置了 UFW 规则,但您决定要重新开始,您可以使用 reset 命令:

sudo ufw reset

这将禁用 UFW 并删除之前定义的任何规则。 请记住,如果您在任何时候修改默认策略,它们都不会更改为其原始设置。 这应该让您重新开始使用 UFW。