正确配置的防火墙是整体系统安全最重要的方面之一。默认情况下,Ubuntu 附带了一个名为 UFW (Uncomplicated Firewall) 的防火墙配置工具。UFW 是一个用于管理 iptables 防火墙规则的用户友好前端界面,其主要目标是让管理 iptables 变得更简单,或者正如名字所说的那样——“不复杂”。
先决条件
在开始本教程之前,请确保您已使用具有 sudo 权限的用户账户或 root 用户登录到您的服务器。最佳实践是以 sudo 用户身份运行管理命令,而不是以 root 身份运行。如果您的 Ubuntu 系统中没有 sudo 用户,您可以按照以下说明创建一个。
安装 UFW
Firewall 应该已在 Ubuntu 18.04 中默认安装,但如果您的系统未安装该包,您可以通过键入以下内容进行安装:
sudo apt install ufw检查 UFW 状态
安装完成后,您可以使用以下命令检查 UFW 的状态:
sudo ufw status verboseUFW 默认处于禁用状态。如果您以前从未激活过 UFW,输出将如下所示:
Status: inactive如果 UFW 已激活,输出将与以下内容类似:

UFW 默认策略
默认情况下,UFW 将阻止所有传入连接并允许所有传出连接。这意味着除非您明确开放端口,否则任何试图访问您服务器的人都将无法连接,而您服务器上运行的所有应用程序和服务都可以访问外部网络。
默认策略定义在 /etc/default/ufw 文件中,可以使用 sudo ufw default <policy> <chain> 命令进行更改。
防火墙策略是构建更详细和用户自定义规则的基础。在大多数情况下,初始的 UFW 默认策略是一个良好的起点。
应用程序配置文件
当使用 apt 命令安装包时,它会在 /etc/ufw/applications.d 目录中添加一个应用程序配置文件。该配置文件描述了服务并包含 UFW 设置。
您可以通过键入以下内容列出服务器上所有可用的应用程序配置文件:
sudo ufw app list根据系统上安装的软件包,输出将与以下内容类似:
Available applications: Dovecot IMAP
Dovecot POP3
Dovecot Secure IMAP
Dovecot Secure POP3
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Postfix
Postfix SMTPS
Postfix Submission要查找有关特定配置文件及其包含规则的更多信息,请使用以下命令:
sudo ufw app info 'Nginx Full'Profile: Nginx Full
Title: Web Server (Nginx, HTTP + HTTPS)
Description: Small, but very powerful and efficient
web serverPorts: 80,443/tcp从上面的输出可以看出,“Nginx Full” 配置文件打开了端口 80 和 443。
允许 SSH 连接
在启用 UFW 防火墙之前,我们需要添加一条允许传入 SSH 连接的规则。如果您是从远程位置连接到服务器(这几乎是常态),并且在明确允许传入 SSH 连接之前就启用了 UFW 防火墙,那么您将无法再连接到您的 Ubuntu 服务器。
要将您的 UFW 防火墙配置为允许传入 SSH 连接,请输入以下命令:
sudo ufw allow sshRules updatedRules updated (v6)如果您将 SSH 端口更改为自定义端口而不是默认的 22 端口,则需要打开该端口。
例如,如果您的 ssh 守护进程监听端口 4422,则可以使用以下命令允许该端口上的连接:
sudo ufw allow 4422/tcp启用 UFW
现在您的 UFW 防火墙已配置为允许传入 SSH 连接,我们可以通过键入以下内容来启用它:
sudo ufw enableCommand may disrupt existing ssh connections. Proceed with operation (y|n)? yFirewall is active and enabled on system startup系统将警告您启用防火墙可能会中断现有的 ssh 连接,只需输入 y 并按下 Enter 即可。
允许其他端口的连接
根据您的服务器上运行的应用程序以及您的具体需求,您可能还需要允许某些其他端口的传入访问。
下面我们将向您展示如何允许一些最常见服务的传入连接的几个示例:
开放端口 80 - HTTP
可以使用以下命令允许 HTTP 连接:
sudo ufw allow http除了使用 http,您也可以使用端口号 80:
sudo ufw allow 80/tcp或者您可以使用应用程序配置文件,在本例中为 “Nginx HTTP”:
sudo ufw allow 'Nginx HTTP'开放端口 443 - HTTPS
可以使用以下命令允许 HTTPS 连接:
sudo ufw allow https为了达到相同的效果,除了使用 https 配置文件外,您还可以使用端口号 443:
sudo ufw allow 443/tcp或者您可以使用应用程序配置文件 “Nginx HTTPS”:
sudo ufw allow 'Nginx HTTPS'开放端口 8080
如果您运行 Tomcat 或任何其他监听端口 8080 的应用程序,要允许传入连接,请输入:
sudo ufw allow 8080/tcp允许端口范围
除了允许访问单个端口外,UFW 还允许我们允许访问端口范围。在使用 UFW 允许端口范围时,必须指定协议,即 tcp 或 udp。例如,如果您想在 tcp 和 udp 上都允许从 7100 到 7200 的端口,请运行以下命令:
sudo ufw allow 7100:7200/tcp
sudo ufw allow 7100:7200/udp允许特定 IP 地址
要允许来自家庭机器(IP 地址为 64.63.62.61)对所有端口的访问,请指定 from,后跟您要加入白名单的 IP 地址:
sudo ufw allow from 64.63.62.61允许特定 IP 地址访问特定端口
要允许来自工作机器(IP 地址为 64.63.62.61)对特定端口(假设为端口 22)的访问,请使用 to any port,后跟端口号:
sudo ufw allow from 64.63.62.61 to any port 22允许子网
允许连接到 IP 地址子网的命令与使用单个 IP 地址时相同,唯一的区别在于您需要指定掩码。例如,如果您想允许 IP 地址范围从 192.168.1.1 到 192.168.1.254 访问端口 3306 (MySQL),您可以使用此命令:
sudo ufw allow from 192.168.1.0/24 to any port 3306允许连接到特定网络接口
要仅允许特定网络接口(例如 eth2)访问特定端口(假设端口 3306),则需要指定 allow in on 和网络接口的名称:
sudo ufw allow in on eth2 to any port 3306拒绝连接
所有传入连接的默认策略设置为 deny,如果您未更改它,除非您明确开放连接,否则 UFW 将阻止所有传入连接。
假设您打开了端口 80 和 443,并且您的服务器正受到来自 23.24.25.0/24 网络的攻击。要拒绝来自 23.24.25.0/24 的所有连接,您可以使用以下命令:
sudo ufw deny from 23.24.25.0/24如果您只想拒绝来自 23.24.25.0/24 对端口 80 和 443 的访问,您可以使用以下命令:
sudo ufw deny from 23.24.25.0/24 to any port 80
sudo ufw deny from 23.24.25.0/24 to any port 443编写拒绝规则与编写允许规则相同,只需将 allow 替换为 deny 即可。
删除 UFW 规则
有两种不同的方法可以删除 UFW 规则:按规则编号和通过指定实际规则。
特别是对于 UFW 新手来说,按规则编号删除 UFW 规则更容易。要按规则编号删除规则,首先需要找到要删除的规则编号,您可以使用以下命令执行此操作:
sudo ufw status numberedStatus: active To Action From -- ------ ----[ 1]
22/tcp ALLOW IN Anywhere[ 2]
80/tcp ALLOW IN Anywhere[ 3]
8080/tcp ALLOW IN Anywhere要删除规则编号 3(即允许连接到端口 8080 的规则),请使用以下命令:
sudo ufw delete 3第二种方法是通过指定实际规则来删除规则,例如,如果您添加了一条打开端口 8069 的规则,可以使用以下命令将其删除:
sudo ufw delete allow 8069禁用 UFW
如果出于任何原因您想要停止 UFW 并停用所有规则,您可以使用:
sudo ufw disable稍后如果您想重新启用 UFW 并激活所有规则,只需输入:
sudo ufw enable重置 UFW
重置 UFW 将禁用 UFW,并删除所有活动规则。如果您想撤销所有更改并重新开始,这会很有帮助。
要重置 UFW,只需输入以下命令:
sudo ufw reset