介绍
UFW (uncomplicated firewall) 是在 iptables
之上运行的防火墙配置工具,默认包含在 Ubuntu 发行版中. 它提供了一个简化的界面,用于通过命令行配置常见的防火墙用例。
这个备忘单式指南提供了对常见 UFW 用例和命令的快速参考,包括如何通过端口、网络接口和源 IP 地址允许和阻止服务的示例。
如何使用本指南
- 本指南采用备忘单格式,带有独立的命令行片段。
- 跳转到与您尝试完成的任务相关的任何部分。
- 当您在本指南的命令中看到突出显示的文本时,请记住该文本应指您自己网络中的 IP 地址。
请记住,您可以使用 sudo ufw status
或 sudo ufw status verbose
检查当前的 UFW 规则集。
验证 UFW 状态
要检查 ufw
是否启用,请运行:
sudo ufw status
OutputStatus: inactive
输出将指示您的防火墙是否处于活动状态。
启用 UFW
如果在运行 ufw status
时收到 Status: inactive
消息,则表示系统上尚未启用防火墙。 您需要运行命令来启用它。
默认情况下,启用 UFW 后,将阻止对服务器上所有端口的外部访问。 实际上,这意味着如果您通过 SSH 连接到服务器并在允许通过 SSH 端口访问之前启用 ufw
,您将被断开连接。 如果是这种情况,请确保在启用防火墙之前遵循本指南的 如何启用 SSH 访问 部分。
要在您的系统上启用 UFW,请运行:
sudo ufw enable
你会看到这样的输出:
OutputFirewall is active and enabled on system startup
要查看当前被阻止或允许的内容,您可以在运行 ufw status
时使用 verbose
参数,如下所示:
sudo ufw status
OutputStatus: active Logging: on (low) Default: deny (incoming), allow (outgoing), deny (routed) New profiles: skip
禁用 UFW
如果由于某种原因您需要禁用 UFW,您可以使用以下命令执行此操作:
sudo ufw disable
请注意,此命令将完全禁用系统上的防火墙服务。
阻止 IP 地址
要阻止源自特定 IP 地址的所有网络连接,请运行以下命令,将突出显示的 IP 地址替换为要阻止的 IP 地址:
sudo ufw deny from 203.0.113.100
OutputRule added
在此示例中,from 203.0.113.100
指定 源 IP 地址为“203.0.113.100”。
如果你现在运行 sudo ufw status
,你会看到指定的 IP 地址被列为拒绝:
OutputStatus: active To Action From -- ------ ---- Anywhere DENY 203.0.113.100
对于指定的 IP 地址,所有进出连接都会被阻止。
阻止子网
如果您需要阻止整个子网,您可以在 ufw deny
命令中使用子网地址作为 from
参数。 这将阻止示例子网 203.0.113.0/24
中的所有 IP 地址:
sudo ufw deny from 203.0.113.0/24
OutputRule added
阻止到网络接口的传入连接
要阻止从特定 IP 地址到特定网络接口的传入连接,请运行以下命令,将突出显示的 IP 地址替换为要阻止的 IP 地址:
sudo ufw deny in on eth0 from 203.0.113.100
OutputRule added
in
参数告诉 ufw
仅将规则应用于 传入 连接,on eth0
参数指定规则仅适用于 【X175X】接口。 如果您的系统具有多个网络接口(包括虚拟接口)并且您需要阻止对其中一些接口(但不是全部)的外部访问,这可能会很有用。
允许 IP 地址
要允许源自特定 IP 地址的所有网络连接,请运行以下命令,将突出显示的 IP 地址替换为您要允许访问的 IP 地址:
sudo ufw allow from 203.0.113.101
OutputRule added
如果您现在运行 sudo ufw status
,您将看到与此类似的输出,在您刚刚添加的 IP 地址旁边显示单词 ALLOW
。
OutputStatus: active To Action From -- ------ ---- ... Anywhere ALLOW 203.0.113.101
您还可以通过为主机提供相应的子网掩码来允许来自整个子网的连接,例如 203.0.113.0/24
。
允许到网络接口的传入连接
要允许从特定 IP 地址到特定网络接口的传入连接,请运行以下命令,将突出显示的 IP 地址替换为您要允许的 IP 地址:
sudo ufw allow in on eth0 from 203.0.113.102
OutputRule added
in
参数告诉 ufw
仅将规则应用于 传入 连接,on eth0
参数指定规则仅适用于 【X175X】接口。
如果你现在运行 sudo ufw status
,你会看到类似这样的输出:
OutputStatus: active To Action From -- ------ ---- ... Anywhere on eth0 ALLOW 203.0.113.102
删除 UFW 规则
要删除您之前在 UFW 中设置的规则,请使用 ufw delete
后跟规则(allow
或 deny
)和目标规范。 以下示例将删除先前设置为允许来自 IP 地址 203.0.113.101
的所有连接的规则:
sudo ufw delete allow from 203.0.113.101
OutputRule deleted
指定要删除的规则的另一种方法是提供规则 ID。 可以使用以下命令获取此信息:
sudo ufw status numbered
OutputStatus: active To Action From -- ------ ---- [ 1] Anywhere DENY IN 203.0.113.100 [ 2] Anywhere on eth0 ALLOW IN 203.0.113.102
从输出中,您可以看到有两个活动规则。 第一条规则带有突出显示的值,拒绝来自 IP 地址 203.0.113.100
的所有连接。 第二条规则允许来自 IP 地址 203.0.113.102
的 eth0
接口上的连接。
因为默认情况下,除非明确允许,否则 UFW 已经阻止所有外部访问,所以第一条规则是多余的,因此您可以将其删除。 要按 ID 删除规则,请运行:
sudo ufw delete 1
系统将提示您确认操作并确保您提供的 ID 引用了您要删除的正确规则。
OutputDeleting: deny from 203.0.113.100 Proceed with operation (y|n)? y Rule deleted
如果您再次使用 sudo ufw status
列出您的规则,您会看到该规则已被删除。
列出可用的应用程序配置文件
安装后,依赖网络通信的应用程序通常会设置一个 UFW 配置文件,您可以使用该配置文件来允许来自外部地址的连接。 这通常与运行 ufw allow from
相同,其优点是提供了一种快捷方式,可以抽象出服务使用的特定端口号,并为引用的服务提供用户友好的命名法。
要列出当前可用的配置文件,请运行以下命令:
sudo ufw app list
如果您安装了诸如 Web 服务器或其他网络相关软件之类的服务,并且在 UFW 中没有提供配置文件,请首先确保该服务已启用。 对于远程服务器,您通常可以随时使用 OpenSSH:
OutputAvailable applications: OpenSSH
启用应用程序配置文件
要启用 UFW 应用程序配置文件,请运行 ufw allow
后跟要启用的应用程序配置文件的名称,您可以使用 sudo ufw app list
命令获取该名称。 在以下示例中,我们启用 OpenSSH 配置文件,这将允许默认 SSH 端口上的所有传入 SSH 连接。
sudo ufw allow “OpenSSH”
OutputRule added Rule added (v6)
请记住引用包含多个单词的配置文件名称,例如 Nginx HTTPS
。
禁用应用程序配置文件
要禁用您之前在 UFW 中设置的应用程序配置文件,您需要删除其相应的规则。 例如,考虑 sudo ufw status
的以下输出:
sudo ufw status
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)
此输出表明 Nginx Full
应用程序配置文件当前已启用,允许通过 HTTP 和 HTTPS 与 Web 服务器进行任何和所有连接。 如果您只想允许来自和发往 Web 服务器的 HTTPS 请求,您必须首先启用最严格的规则,在这种情况下为 Nginx HTTPS
,然后禁用当前活动的 [X203X ] 规则:
sudo ufw allow "Nginx HTTPS" sudo ufw delete allow "Nginx Full"
请记住,您可以使用 sudo ufw app list
列出所有可用的应用程序配置文件。
允许 SSH
使用远程服务器时,您需要确保 SSH 端口对连接开放,以便您能够远程登录到您的服务器。
以下命令将启用 OpenSSH UFW 应用程序配置文件并允许所有连接到服务器上的默认 SSH 端口:
sudo ufw allow OpenSSH
OutputRule added Rule added (v6)
虽然不太友好,但另一种语法是指定 SSH 服务的确切端口号,默认情况下通常设置为 22
:
sudo ufw allow 22
OutputRule added Rule added (v6)
允许来自特定 IP 地址或子网的传入 SSH
要允许来自特定 IP 地址或子网的传入连接,您将包含一个 from
指令来定义连接的来源。 这将要求您还使用 to
参数指定目标地址。 要将此规则仅锁定到 SSH,您需要将 proto
(协议)限制为 tcp
,然后使用 port
参数并将其设置为 22
, SSH 的默认端口。
以下命令将只允许来自 IP 地址 203.0.113.103
的 SSH 连接:
sudo ufw allow from 203.0.113.103 proto tcp to any port 22
OutputRule added
您还可以使用子网地址作为 from
参数来允许来自整个网络的传入 SSH 连接:
sudo ufw allow from 203.0.113.0/24 proto tcp to any port 22
OutputRule added
允许来自特定 IP 地址或子网的传入 Rsync
Rsync 程序在端口 873
上运行,可用于将文件从一台计算机传输到另一台计算机。
要允许来自特定 IP 地址或子网的传入 rsync
连接,请使用 from
参数指定源 IP 地址并使用 port
参数设置目标端口 873
。 以下命令将只允许来自 IP 地址 203.0.113.103
的 Rsync 连接:
sudo ufw allow from 203.0.113.103 to any port 873
OutputRule added
要允许整个 203.0.113.0/24
子网能够 rsync
到您的服务器,请运行:
sudo ufw allow from 203.0.113.0/24 to any port 873
OutputRule added
允许 Nginx HTTP / HTTPS
安装后,Nginx Web 服务器会在服务器中设置几个不同的 UFW 配置文件。 安装 Nginx 并将其作为服务启用后,运行以下命令来确定哪些配置文件可用:
sudo ufw app list | grep Nginx
Output Nginx Full Nginx HTTP Nginx HTTPS
要同时启用 HTTP 和 HTTPS 流量,请选择 Nginx Full
。 否则,选择 Nginx HTTP
以仅允许 HTTP 或 Nginx HTTPS
以仅允许 HTTPS。
以下命令将允许服务器上的 HTTP 和 HTTPS 流量(端口 80
和 443
):
sudo ufw allow "Nginx Full"
OutputRule added Rule added (v6)
允许 Apache HTTP / HTTPS
安装后,Apache Web 服务器会在服务器中设置几个不同的 UFW 配置文件。 安装 Apache 并将其作为服务启用后,运行以下命令来确定哪些配置文件可用:
sudo ufw app list | grep Apache
Output Apache Apache Full Apache Secure
要同时启用 HTTP 和 HTTPS 流量,请选择 Apache Full
。 否则,为 HTTP 选择 Apache
或为 HTTPS 选择 Apache Secure
。
以下命令将允许服务器上的 HTTP 和 HTTPS 流量(端口 80
和 443
):
sudo ufw allow "Nginx Full"
OutputRule added Rule added (v6)
允许所有传入的 HTTP(端口 80
)
Web 服务器,例如 Apache 和 Nginx,通常在端口 80
上侦听 HTTP 请求。 如果传入流量的默认策略设置为丢弃或拒绝,则需要创建 UFW 规则以允许端口 80
上的外部访问。 您可以使用端口号或服务名称 (http
) 作为此命令的参数。
要允许所有传入的 HTTP(端口 80
)连接,请运行:
sudo ufw allow http
OutputRule added Rule added (v6)
另一种语法是指定 HTTP 服务的端口号:
sudo ufw allow 80
OutputRule added Rule added (v6)
允许所有传入的 HTTPS(端口 443
)
HTTPS 通常在端口 443
上运行。 如果传入流量的默认策略设置为丢弃或拒绝,则需要创建 UFW 规则以允许端口 443
上的外部访问。 您可以使用端口号或服务名称 (https
) 作为此命令的参数。
要允许所有传入的 HTTPS(端口 443
)连接,请运行:
sudo ufw allow https
OutputRule added Rule added (v6)
另一种语法是指定 HTTPS 服务的端口号:
sudo ufw allow 443
OutputRule added Rule added (v6)
允许所有传入的 HTTP 和 HTTPS
如果您希望同时允许 HTTP 和 HTTPS 流量,您可以创建一个允许两个端口的规则。 此用法要求您还使用 proto
参数定义协议,在这种情况下应设置为 tcp
。
要允许所有传入的 HTTP 和 HTTPS(端口 80
和 443
)连接,请运行:
sudo ufw allow proto tcp from any to any port 80,443
OutputRule added Rule added (v6)
允许来自特定 IP 地址或子网的 MySQL 连接
MySQL 在端口 3306
上侦听客户端连接。 如果远程服务器上的客户端正在使用您的 MySQL 数据库服务器,则需要创建 UFW 规则以允许该访问。
要允许来自特定 IP 地址或子网的传入 MySQL 连接,请使用 from
参数指定源 IP 地址并使用 port
参数设置目标端口 3306
。
以下命令将允许 IP 地址 203.0.113.103
连接到服务器的 MySQL 端口:
sudo ufw allow from 203.0.113.103 to any port 3306
OutputRule added
要允许整个 203.0.113.0/24
子网能够连接到您的 MySQL 服务器,请运行:
sudo ufw allow from 203.0.113.0/24 to any port 3306
OutputRule added
允许来自特定 IP 地址或子网的 PostgreSQL 连接
PostgreSQL 在端口 5432
上侦听客户端连接。 如果您的 PostgreSQL 数据库服务器正被远程服务器上的客户端使用,您需要确保允许该流量。
要允许来自特定 IP 地址或子网的传入 PostgreSQL 连接,请使用 from
参数指定源,并将端口设置为 5432
:
sudo ufw allow from 203.0.113.103 to any port 5432
OutputRule added
要允许整个 203.0.113.0/24
子网能够连接到您的 PostgreSQL 服务器,请运行:
sudo ufw allow from 203.0.113.0/24 to any port 5432
OutputRule added
阻止传出 SMTP 邮件
邮件服务器,例如 Sendmail 和 Postfix,通常使用端口 25
进行 SMTP 通信。 如果您的服务器不应该发送外发邮件,您可能希望阻止这种流量。 要阻止传出 SMTP 连接,请运行:
sudo ufw deny out 25
OutputRule added Rule added (v6)
这会将您的防火墙配置为 drop 端口 25
上的所有传出流量。 如果您需要拒绝不同端口号上的传出连接,可以重复此命令并将 25
替换为您要阻止的端口号。
结论
UFW 是一个强大的工具,如果配置正确,它可以极大地提高服务器的安全性。 本参考指南涵盖了一些常用的 UFW 规则,这些规则通常用于在 Ubuntu 上配置防火墙。
本指南中的大多数命令都可以通过更改源 IP 地址和/或目标端口等参数来适应不同的用例和场景。 有关每个命令参数和可用修饰符的更多详细信息,您可以使用 man
实用程序查看 UFW 的手册:
man ufw
Ubuntu 文档 上的 official UFW 页面是另一个资源,您可以将其用作更高级用例和示例的参考。