UFW是什么?

UFW(Uncomplicated Firewall)是Arch Linux、Debian或Ubuntu中管理防火墙规则的前端工具。UFW通常在命令行环境下使用(尽管UFW也提供了图形界面),目的是让配置防火墙变得简单(或者说,没那么复杂)。

使用UFW配置防火墙
使用UFW配置防火墙

开始前的准备

  1. 熟悉入门指南,并按正确步骤设置好Linode的主机名及时区。
  2. 本指南会尽可能使用sudo权限。请阅读文档中保护您的服务器安全章节部分,以创建标准用户账号,加强SSH访问并移除不必要的网络服务。请不要遵循 创建防火墙 章节的指引——本指南将介绍如何使用UFW来控制防火墙,这是iptables命令之外另一种控制防火墙的方法。
  3. 升级您的系统

Arch Linux

sudo pacman -Syu

Debian / Ubuntu

sudo apt-get update && sudo apt-get upgrade

安装UFW

UFW默认包含在Ubuntu中,但在Arch Linux及Debian中必须手动安装。Debian会自动启动UFW的systemd单元并使其在重启时启动,但Arch Linux并不会这样做。这与告诉UFW启用防火墙规则不同,因为通过systemd或upstart启动UFW只会告诉系统初始化程序启动UFW守护进程。

默认情况下,UFW的规则集为空——因此即使守护进程正在运行,也不会启用任何防火墙规则。启用防火墙规则集的内容将在页面下方进行介绍。

Arch Linux

安装UFW:

 sudo pacman -S ufw

启动并启用UFW的systemd单元:

sudo systemctl start ufw
sudo systemctl enable ufw

Debian / Ubuntu

安装UFW

sudo apt-get install ufw

使用UFW管理防火墙规则

设置默认规则

大部分系统只需要一小部分端口为传入连接打开,其余所有端口均关闭。先从简单的基础规则开始,ufw default命令可用来设置对传入和传出连接的默认响应。要想拒绝所有传入连接并允许所有传出连接,请运行:

sudo ufw default allow outgoing
sudo ufw default deny incoming

ufw default命令还允许使用reject参数。

警告

除非有明确的允许规则,否则配置默认拒绝或拒绝规则可能会阻止您退出Linode。在应用默认拒绝或拒绝规则之前,请确保已按照以下部分为SSH和其他关键服务配置了允许规则。

添加规则

可以通过两种方式添加防火墙规则:声明端口号或声明服务名称

例如,要允许22端口上的传入和传出连接用于SSH,您可以运行:

sudo ufw allow ssh

您还可以运行:

sudo ufw allow 22

同样的,要拒绝某个端口上的流量(本例中为111端口),您只需运行:

sudo ufw deny 111

要进一步微调规则,您还可以允许基于TCP或UDP的数据包通过。以下命令将允许80端口上的TCP数据包通过:

sudo ufw allow 80/tcp
sudo ufw allow http/tcp

而以下命令将允许1725端口上的UDP数据包通过:

sudo ufw allow 1725/ufw

高级规则

除了仅通过指定端口来添加允许或拒绝规则之外,UFW还可让您允许/阻止来自指定IP地址、子网或特定IP地址/子网/端口组合的连接。

允许来自指定IP地址的连接:

sudo ufw allow from 123.45.67.89

允许来自指定子网的连接:

sudo ufw allow from 123.45.67.89/24

允许来自指定IP地址/端口组合的连接:

sudo ufw allow from 123.45.67.89 to any port 22 proto tcp

可根据您的实际需求删除proto tcp参数或替换为proto udp,并且如有需要,所有示例中的allow都可替换为deny

删除规则

要想删除规则,请在规则语句前添加delete。如果您不在希望允许HTTP流量通过,则可运行:

sudo ufw delete allow 80

还可以通过指定服务名称来删除规则。

编辑UFW配置文件

虽然可以通过命令行添加简单的规则,但有些时候也需要添加或删除更加高级或特定的防火墙规则。在运行通过终端输入的规则之前,UFW会首先运行before.rules文件中的规则,该文件允许本地环回(loopback)、ping以及DHCP通过防火墙。要对这些规则添加修改,请编辑/etc/ufw/before.rules文件。在相同目录下同样存在一个名为before6.rules的文件用来对IPv6的规则进行配置。

同样的,还存在after.ruleafter6.rule文件,用来添加在UFW运行从命令行输入的规则后需要添加的任何规则。

另一个配置文件位于/etc/default/ufw。在该配置文件中可以禁用或启用IPv6,设置默认规则,还可以设置UFW来管理内置的防火墙链。

UFW状态

您可随时使用sudo ufw status命令查看UFW的状态信息。这将以列表的形式打印出所有的规则信息,并显示UFW是否处于活跃状态:

sudo ufw status
Status: 

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

启用防火墙

根据您设置的规则,首次运行ufw status可能会输出Status: inactive。可通过以下命令启用UFW并强制执行防火墙规则:

sudo ufw enable active

同样的,可通过以下命令禁用防火墙规则:

sudo ufw disable

注意

系统重启后UFW服务仍会启动并运行。

UFW日志

您可使用以下命令启用UFW日志记录:

sudo ufw logging on

日志级别可通过sudo ufw logging low|medium|high设置,lowmediumhigh分别对应从低到高的级别,默认级别为low

一条正常的日志记录与以下内容类似,它位于/var/logs/ufw

Sep 16 15:08:14 <hostname> kernel: [UFW BLOCK] IN=eth0 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=123.45.67.89 DST=987.65.43.21 LEN=40 TOS=0x00 PREC=0x00 TTL=249 ID=8475 PROTO=TCP SPT=48247 DPT=22 WINDOW=1024 RES=0x00 SYN URGP=0

最开始的值分别表示日期,时间以及您的主机名。其他重要的字段包括:

  • [UFW BLOCK]:此位置表示日志描述所定位的位置。本例中,日志是在阻止连接时记录的
  • IN:如果该字段有值,表示这是一个传入连接
  • OUT:如果该字段有值,表示这是一个传出连接
  • MAC:目的MAC地址和源MAC地址的组合
  • SRC:数据包的源IP地址
  • DST:数据包的目的IP地址
  • LEN:数据包长度
  • TTL:TTL(Time To Live)包,或称为生存时间。表示在没有找到目的地址的情况下,数据包会在路由器之间传输多久直至过期
  • PROTO:数据包的协议
  • SPT:数据包的源端口
  • DPT:数据包的目标端口
  • WINDOW:发送方可以接收的数据包大小
  • SYN URGP:表示是否需要三次握手,0表示不需要

参考文章

  1. How to Configure a Firewall with UFW | Linode
  2. 如何使用UFW配置防火墙 | 腾讯云+社区