# 功能介绍

Ubuntu 自带的防火墙配置工具被称为 UFW (Uncomplicated Firewall)。UFW 是一个用来管理 iptables 防火墙规则的用户友好的前端工具。它的主要目的就是为了使得管理 iptables 更简单。在 Ubuntu 20.04 上使用 UFW 工具来配置和管理一个防火墙。

# 安装 UFW

Ubuntu 20.04 一般情况下会预装 UFW。如果因为某些原因,UFW 没有被安装,你可以通过输入下面的命令安装它:

sudo apt update
sudo apt install ufw

# 检查 UFW 的状态

安装过程不会自动激活防火墙,以避免服务器被锁住。你可以检查 UFW 的状态,输入:

sudo ufw status verbose

如果 UFW 激活了,输入应该类似下面这样:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To                         Action      From
--                         ------      ----      
22                         ALLOW IN    Anywhere        
22 (v6)                    ALLOW IN    Anywhere (v6)

# UFW 默认策略

默认情况下,UFW 阻塞了所有进来的连接,并且允许所有出去的连接。这意味着任何人无法访问你的服务器,除非你打开端口。运行在服务器上的应用和服务可以访问外面的世界.

默认的策略定义在 /etc/default/ufw 文件中,并且可以通过使用 sudo ufw default <policy> <chain> 命令来修改。

防火墙策略是用来构建更多详细的和用户自定义的规则的基础。

# 应用配置

大部分应用都附带一份应用配置,它描述了服务,并且包含了 UFW 设置。这个规则在软件包安装的时候,被自动创建在 /etc/ufw/applications.d 目录下。想要列举出你系统上所有的应用配置,输入:

sudo ufw app list

与你系统上安装的软件包有关系,输出应该看起来像下面这样:

Available applications:
  OpenSSH

想要查找更多关于指定配置和包含规则的信息,使用下面的命令:

sudo ufw app info 'OpenSSH'

输出应该显示 "OpenSSH" 配置打开了端口 "22"。

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

你也可以为你的应用创建自定义的配置。

# 启用 UFW

如果你在远程位置连接你的 Ubuntu,在启用 UFW 防火墙之前,你必须允许 SSH 连接。否则,你将无法连接到机器上。

现在 UFW 防火墙被配置允许 SSH 远程连接,启用它,输入:

sudo ufw allow ssh

输出:

Rules updated
Rules updated (v6)

如果 SSH 运行在非标准端口,你需要打开这个端口。

例如,如果你的 SSH 守护程序监听了 8022,输入下面的命令,允许连接通过那个端口:

sudo ufw allow 7722/tcp

现在防火墙被配置允许进来的 SSH 连接,你可以输入下面的命令,启用 UFW:

sudo ufw enable

输出如下:

#你将会被警告启用防火墙可能会中断现有的 SSH 连接,输入 "y”,并且回车。
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

# 打开端口

取决于运行在你服务器上的应用,你需要根据服务打开不同的端口。通用的打开端口的语法如下:

ufw allow port_number/protocol

下面是一些关于如何允许 HTTP 连接的方法。第一个选项就是使用服务名。UFW 检查 /etc/services 文件,其中指定服务的端口和协议:

sudo ufw allow http

你也可以指定端口号和协议:

sudo ufw allow 80/tcp

当没有给出协议的时候,UFW 同时创建 tcp 和 udp 的规则。

另外一个选项就是使用应用程序配置。在这个例子中,是 OpenSSH

sudo ufw allow 'OpenSSH'

UFW 还支持另外一种语法,使用 proto 关键字来指定协议。

  1. 端口范围

UFW 允许你打开端口范围。使用分号分隔开端口的起点和终点,当你指定协议时,或者是 tcp,或者是 udp。例如,如果你想允许端口从 7100 到 7200,同时支持 tcp 和 udp,你将要运行下面的命令:

sudo ufw allow 7100:7200/tcp
sudo ufw allow 7100:7200/udp
  1. 允许指定 IP 地址访问指定端口

想要允许指定源 IP 的所有端口上的所有连接通过,使用 from 关键字,加上源地址。这里是一个 IP 地址白名单的例子:

sudo ufw allow from 1.1.1.1

如果你指向允许给定 IP 访问指定的端口,使用 to any port 关键字加上端口号。例如,允许从 IP 1.1.1.1 的机器,通过 22 端口访问,输入:

sudo ufw allow from 1.1.1.1 to any port 22
  1. 允许子网

允许一个子网 IP 地址的访问和允许一个单个 IP 地址的访问,命令是一样的。唯一的不同是需要指定网络掩码。

下面是一个例子,显示如何允许 IP 地址 (192.168.1.1 到 192.168.1.254),通过 3360 (MySQL),你可以使用这个命令:

sudo ufw allow from 192.168.1.0/24 to any port 3306
  1. 允许指定网络接口的连接

想要允许连接通过指定网络接口,使用 allow in on 和 网络接口的名字:

sudo ufw allow in on eth0 to any port 3306

# 禁止连接

对于所有进来连接的默认的策略被设置为 deny ,如果你没有修改它,UFW 将会屏蔽所有进来的连接,除非你指定打开连接。

写禁止规则和写允许规则是一样的,你需要的仅仅是使用 deny 关键字替换 allow

比如说你打开了端口 80 和 443,并且你的服务器处于来自 2.2.2.0/24 网络的攻击。想要禁止来自 2.2.2.0/24 的所有连接,使用下面的命令:

sudo ufw deny from 2.2.2.0/24

禁止从 2.2.2.0/24 对 80 和 443 端口的访问,你可以使用下面的命令:

sudo ufw deny proto tcp from 23.24.25.0/24 to any port 80,443

# 删除 UFW 规则

有两种不同的方式可以删除 UFW 规则。通过规则序号和通过指定的规则。

想要通过规则序号来删除,你需要找到你想删除的规则序号。运行下面的命令:

sudo ufw status numbered

输出:

Status: active
     To                         Action      From
     --                         ------      ----         
[ 1] 22                         ALLOW IN    Anywhere         
[ 2] 22 (v6)                    ALLOW IN    Anywhere (v6)

想要删除序号为 2 的规则,这个规则允许对 IPv6 22 端口的连接,你可以使用下面的命令:

sudo ufw delete 2

删除规则的第二种方法就是指定实际的规则。例如,如果你添加过一个打开端口 80 的规则,你可以通过下面的命令删除它:

sudo ufw delete allow 80

# 重载 UFW

在对 UFW 规则进行变更后,需要使用命令重载 UFW,你可以运行:

sudo ufw reload

# 禁用 UFW

如果因为任何原因,你需要停止 UFW,并且使得所有规则失效,你可以运行:

sudo ufw disable

稍后,如果你想重新启用 UFW,并且激活所有规则,输入:

sudo ufw enable

# 重置 UFW

重置 UFW 将会禁用 UFW,删除所有激活的规则。如果你想撤销所有的应用规则,并且重新开始时,这个很有用。想要重置 UFW,简单输入下面的命令:

sudo ufw reset
更新于