介绍
UFW(Uncomplicated Firewall,简易防火墙)是iptables的一个前端,旨在简化防火墙的配置过程。虽然iptables功能强大且灵活,但对于初学者来说,学习如何正确配置防火墙可能比较困难。如果您正准备开始保护您的网络,但又不确定该使用哪种工具,那么UFW或许是一个不错的选择。.
先决条件
如果您使用的是 Ubuntu 16.04 或更低版本,我们建议您升级到更新的版本,因为 Ubuntu 已停止对这些版本的支持。以下说明将帮助您升级 Ubuntu 版本。.
步骤 1 — 确保已启用 IPv6
在最新版本的 Ubuntu 系统中,IPv6 默认启用。实际上,这意味着添加到服务器的大多数防火墙规则都会同时包含 IPv4 和 IPv6,其中 IPv6 在 UFW status 命令的输出中会被标识为 v6。要确认 IPv6 是否已启用,您可以检查位于 /etc/default/ufw 的 UFW 配置文件。使用 nano 或其他您喜欢的命令行编辑器打开此文件:
sudo nano /etc/default/ufw然后确保 IPv6 值设置为“是”。它应该类似于这样:
IPV6=yes保存并关闭文件。如果您使用的是 nano 编辑器,可以按 CTRL+X,然后按 Y 和 ENTER 确认。.
在本指南的下一步中启用 UFW 时,它将被配置为写入 IPv4 和 IPv6 防火墙规则。.
步骤 2 — 设置默认策略
如果您刚开始使用UFW,那么第一步最好是查看防火墙的默认策略。这些规则控制着如何处理那些未明确匹配任何其他规则的流量。.
UFW 默认配置为拒绝所有入站连接,允许所有出站连接。这意味着任何试图访问您服务器的人都将无法连接,而服务器内部的任何应用程序都可以访问外部网络。此外,UFW 还包含一些规则,允许特定服务和端口作为此通用策略的例外。.
为了确保您能够继续学习本教程的其余部分,您现在需要设置入站和出站流量的默认 UFW 策略。.
要将默认的 UFW 入口策略设置为拒绝,请运行以下命令:
sudo ufw default deny incomingOutput
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)要将 UFW 的默认出站策略设置为宽松,请运行以下命令:
这些命令会将默认设置设为拒绝入站连接并允许出站连接。对于个人电脑来说,这些防火墙默认设置可能就足够了,但服务器通常需要响应来自外部用户的请求。我们稍后会详细介绍这一点。.
步骤 3 – 允许 SSH 连接
如果您现在启用 UFW 防火墙,它将拒绝所有入站连接。这意味着,如果您希望服务器响应此类请求,则需要创建规则,明确允许合法的入站连接,例如 SSH 或 HTTP 连接。如果您使用的是云服务器,则可能需要允许入站 SSH 连接,以便您可以连接到服务器并进行管理。.
允许 OpenSSH UFW 应用程序配置文件
安装完成后,大多数依赖网络连接的应用程序都会向 UFW 注册一个应用程序配置文件,使用户能够快速允许或禁止外部访问服务。您可以使用以下命令查看当前已向 UFW 注册的配置文件:
sudo ufw app listOutput
Available applications:
OpenSSH要启用 OpenSSH 应用程序配置文件,请运行以下命令:
允许基于服务名称的 SSH 连接
配置 UFW 以允许传入 SSH 连接的另一种方法是引用其服务名称:
根据端口号启用 SSH
作为替代方案,您可以通过指定端口而不是应用程序或服务配置文件名称来编写等效规则。例如,以下命令的工作方式与前面的示例类似:
sudo ufw allow 22Output
Rule added
Rule added (v6)如果您已将 SSH 服务配置为使用其他端口,则需要指定相应的端口。例如,如果您的 SSH 服务器监听端口 2222,则可以使用以下命令允许该端口上的连接:
sudo ufw allow 2222Output
Rule added
Rule added (v6)现在您的防火墙已配置为允许传入的 SSH 连接,您可以启用它了。.
步骤 4 — 启用 UFW
您的防火墙现在应该已配置为允许 SSH 连接。即使防火墙仍处于禁用状态,您也可以使用以下命令来验证目前已添加的规则:
sudo ufw show added
Output
Added user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH确认已设置允许传入 SSH 连接的规则后,即可使用以下命令启用防火墙:
sudo ufw enable
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` 命令,允许 HTTP 协议在 80 端口上运行,该端口也用于未加密的 Web 服务器。
- 使用 `sudo ufw allow https` 或 `sudo ufw allow 443` 命令,允许 HTTPS 协议在 443 端口上运行,该端口也是加密 Web 服务器使用的端口。
- 使用 sudo ufw allow 'Apache Full' 启用 Apache 的 HTTP 和 HTTPS 功能‘
- 使用 sudo ufw allow 'Nginx Full' 启用 Nginx 的 HTTP 和 HTTPS 功能‘
别忘了使用 sudo ufw app list 命令检查服务器上有哪些应用程序配置文件可用。.
除了指定端口或常用服务名称外,还有其他几种方法可以允许连接。我们将在下文讨论其中的一些方法。.
具体端口范围
您可以使用 UFW 指定端口范围。有些应用程序会使用多个端口,而不仅仅是一个。.
例如,要允许使用端口 6000-6007 的 X11 连接,请使用以下命令:
sudo ufw allow 6000:6007/tcp
sudo ufw allow 6000:6007/udp
使用 UFW 指定端口范围时,必须指定规则适用的协议(TCP 或 UDP)。之前没有提到这一点,是因为如果不指定协议,则会自动允许两种协议同时使用,这在大多数情况下都没问题。.
特定 IP 地址
在使用 UFW 时,您也可以在规则中指定 IP 地址。例如,如果您想允许来自特定 IP 地址的连接,例如您的工作或家庭 IP 地址 203.0.113.4,则可以使用 `from` 参数,然后输入您想要的 IP 地址:
sudo ufw allow from 203.0.113.4Output
Rule added您还可以通过在每个端口号后附加 `--port` 来指定允许 IP 地址连接的端口。例如,如果您想允许 203.0.113.4 连接到端口 22(SSH),请使用以下命令:
sudo ufw allow from 203.0.113.4 to any port 22
OutputRule added
子网
如果要允许访问某个 IP 地址子网,可以使用 CIDR 表示法指定网络掩码。例如,如果要允许访问 203.0.113.1 到 203.0.113.254 之间的所有 IP 地址,可以使用以下命令:
sudo ufw allow from 203.0.113.0/24
Output
Rule added同样,您可以指定 203.0.113.0/24 子网允许连接的目标端口。我们仍然以端口 22(SSH)为例:
sudo ufw allow from 203.0.113.0/24 to any port 22Output
Rule added连接到特定网络接口
如果要创建仅适用于特定网络接口的防火墙规则,可以指定«允许日志记录»,后跟网络接口的名称。.
在继续操作之前,您可以先查找您的网络接口。为此,请使用以下命令:
ip addrOutput 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
. . .高亮显示的输出结果显示了网络接口的名称。它们通常被命名为类似 eth0 或 enp3s2 之类的名称。.
因此,如果您的服务器有一个名为 eth0 的公共网络接口,您可以使用以下命令允许 HTTP 流量(端口 80)访问该接口:
sudo ufw allow in on eth0 to any port 80Output
Rule added
Rule added (v6)这样做将允许您的服务器接收来自公共互联网的 HTTP 请求。.
或者,如果您希望 MySQL 数据库服务器(端口 3306)监听私有网络接口 eth1 上的连接,例如,您可以使用以下命令:
sudo ufw allow in on eth1 to any port 3306Output
Rule added
Rule added (v6)这样,您私有网络上的其他服务器就可以连接到您的 MySQL 数据库。.
步骤 6 – 断开连接
如果您没有更改入站连接的默认策略,UFW 将配置为拒绝所有入站连接。总的来说,这简化了创建安全防火墙策略的过程,因为它要求您创建规则,明确允许特定端口和 IP 地址通过。.
但是,有时您可能需要根据源 IP 地址或子网拒绝特定连接,例如,您可能知道您的服务器正遭受来自该地址的攻击。此外,如果您想将默认入站策略更改为允许(不建议这样做),则需要为每个您不想允许连接的服务或 IP 地址创建拒绝规则。.
要编写拒绝规则,可以使用前面描述的命令,将 allow 替换为 deny。.
例如,要拒绝 HTTP 连接,可以使用以下命令:
sudo ufw deny httpOutput
Rule added (v6)或者,如果您想拒绝来自 203.0.113.4 的所有连接,可以使用以下命令:
sudo ufw deny from 203.0.113.4Output
Rule added在某些情况下,您可能还需要阻止服务器的出站连接。要阻止所有用户使用服务器上的某个端口(例如用于 SMTP 流量的端口 25),您可以使用 `deny out` 命令,后跟端口号:
sudo ufw deny out 25Output
Rule added
Rule added (v6)这将阻止服务器上所有出站的SMTP流量。.
步骤 7 – 删除规则
了解如何删除防火墙规则与了解如何创建规则同样重要。有两种方法可以指定要删除的规则:通过规则编号或通过易于理解的名称(类似于创建规则时指定规则的方式)。.
按编号删除 UFW 规则
要根据编号删除 UFW 规则,首先需要获取所有防火墙规则的编号列表。UFW status 命令提供了一个选项,可以在每条规则旁边显示编号,如下所示:
sudo ufw status numberedNumbered 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 2Output
Deleting:
allow 80
Proceed with operation (y|n)? y
Rule deleted系统会要求您确认,然后删除允许 HTTP 连接的规则 2。请注意,如果您启用了 IPv6,则还需要删除相应的 IPv6 规则。.
按名称删除 UFW 规则
除了使用规则编号,您还可以使用易于理解的名称来引用规则。该名称由规则类型(通常为允许或拒绝)以及规则所针对的服务名称或端口号(如果使用了应用程序配置文件,则为应用程序配置文件名称)决定。例如,如果您想要删除之前已启用的名为“Apache Full”的应用程序配置文件的允许规则,可以使用以下命令:
sudo ufw delete allow "Apache Full"Output
Rule deleted
Rule deleted (v6)
删除命令对于通过名称或端口引用服务创建的规则的处理方式相同。例如,如果您之前创建了一条规则以允许 HTTP 连接到 sudo ufw allow http 您可以按以下步骤删除该规则:
sudo ufw delete allow httpOutput
Rule deleted
Rule deleted (v6)由于在指定规则时服务名称与端口号可以互换,因此您也可以引用相同的规则 allow 80 而不是 allow http:
sudo ufw delete allow http
Output
Rule deleted Rule deleted (v6)由于在指定规则时服务名称与端口号可以互换,因此您也可以引用相同的规则 allow 80 而不是 allow http:
sudo ufw delete allow 80Output
Rule deleted
Rule deleted (v6)按名称删除 UFW 规则时,IPv4 和 IPv6 规则(如果有)都会被删除。.
步骤 8 — 检查 UFW 状态和规则
您可随时使用以下命令查看UFW的状态:
sudo ufw status verbose如果UFW被禁用(默认情况下是禁用的),你会看到类似这样的内容:
Output
Status: inactive如果 UFW 已启用(如果您按照步骤 3 操作,则应该已启用),则输出将显示 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اگر میخواهید بررسی کنید که UFW چگونه فایروال را پیکربندی کرده است، از دستور status استفاده کنید.
مرحله ۹ – غیرفعال کردن یا تنظیم مجدد فایروال
اگر تصمیم دارید که از فایروال UFW استفاده نکنید، میتوانید آن را با این دستور غیرفعال کنید:
sudo ufw disableOutput
Firewall stopped and disabled on system startup您使用 UFW 创建的所有规则将不再生效。如果您以后需要启用它们,您可以随时进行操作。 sudo ufw enable 跑步。.
如果您已经配置了 UFW 规则,但决定重新开始,可以使用 reset 命令:
sudo ufw resetOutput
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 并删除之前定义的所有规则。这样您就可以重新开始使用 UFW 了。请注意,如果您更改了默认策略,它们将不会恢复到原始设置。.
结论
您的防火墙现已配置为允许(至少)SSH 连接。请确保允许服务器所需的其他所有入站连接,同时限制任何不必要的连接,以确保服务器正常运行和安全。.
有关常见 UFW 配置的更多信息,请参阅教程。
UFW Essentials:Linux 安全常用防火墙规则和命令
一探究竟。.









