UFW,即简单防火墙(uncomplicated firewall),是一个 Arch Linux、Debian 或 Ubuntu 中管理防火墙规则的前端。

安装 UFW

UFW 默认包含在 Ubuntu 中,但在 Arch 和 Debian 中需要安装。 Debian 将自动启用 UFW 的 systemd 单元,并使其在重新启动时启动,但 Arch 不会。 这与告诉 UFW 启用防火墙规则不同,因为使用 systemd 或者 upstart 启用 UFW 仅仅是告知 init 系统打开 UFW 守护程序。

默认情况下,UFW 的规则集为空,因此即使守护程序正在运行,也不会强制执行任何防火墙规则。 强制执行防火墙规则集的部分在下面。

Arch Linux

1
2
3
4
5
6
# 安装
sudo pacman -S ufw
# 启动
sudo systemctl start ufw
# 开机自启
sudo systemctl enable ufw

Debian

1
2
# Debian 将自动启用 systemd
sudo apt-get install ufw

使用 UFW 管理防火墙规则

警告:

除非明确设置允许规则,否则配置默认 denyreject 规则会锁定服务器。确保在应用默认 denyreject 规则之前,已按照下面的部分配置了 SSH 和其他关键服务的允许规则。

添加规则

可以有两种方式添加规则:用端口号或者服务名表示。

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

1
2
3
sudo ufw allow ssh
# or
sudo ufw allow 22

为了更好地调整规则,也可以允许基于 TCP 或者 UDP 的包。下面例子会允许 80 端口的 TCP 包:

1
2
3
sudo ufw allow 80/tcp
# or
sudo ufw allow http/tcp

这个会允许 1725 端口上的 UDP 包:

1
sudo ufw allow 1725/udp

高级规则

除了基于端口的允许或阻止,UFW 还允许您按照 IP 地址、子网和 IP 地址/子网/端口的组合来允许/阻止。

允许从一个 IP 地址连接:

1
sudo ufw allow from 123.45.67.89

允许特定子网的连接:

1
sudo ufw allow from 123.45.67.89/24

允许特定 IP/ 端口的组合:

1
sudo ufw allow from 123.45.67.89 to any port 22 proto tcp

proto tcp 可以删除或者根据需求改成 proto udp,所有例子的 allow 都可以根据需要变成 deny

删除规则

要删除一条规则,在规则的前面加上 delete。如果希望不再允许 HTTP 流量,可以运行:

1
sudo ufw delete allow 80

编辑 UFW 的配置文件

虽然可以通过命令行添加简单的规则,但仍有可能需要添加或删除更高级或特定的规则。 在运行通过终端输入的规则之前,UFW 将运行一个文件 before.rules,它允许回环接口、ping 和 DHCP 等服务。要添加或改变这些规则,编辑 /etc/ufw/before.rules 这个文件。 同一目录中的 before6.rules 文件用于 IPv6 。

还存在一个 after.ruleafter6.rule 文件,用于添加在 UFW 运行通过命令行输入的规则之后需要添加的任何规则。

还有一个配置文件位于 /etc/default/ufw。 从此处可以禁用或启用 IPv6,可以设置默认规则,并可以设置 UFW 以管理内置防火墙链。

UFW 状态

可以在任何时候使用命令:sudo ufw status 查看 UFW 的状态。这会显示所有规则列表,以及 UFW 是否处于激活状态:

1
2
3
4
5
6
7
8
9
Status: active
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 并强制执行防火墙规则:

1
sudo ufw enable

禁用 UFW 规则:

1
sudo ufw disable

日志记录

可以用下面的命令启动日志记录:

1
sudo ufw logging on

可以通过运行 sudo ufw logging low|medium|high 设计日志级别,可以选择 lowmedium 或者 high。默认级别是 low

常规日志类似于下面这样,位于 /var/logs/ufw

1
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 地址的组合
  • SRC:包源的 IP
  • DST:包目的地的 IP
  • LEN:数据包长度
  • TTL:数据包 TTL,或称为 time to live。 在找到目的地之前,它将在路由器之间跳跃,直到它过期。
  • PROTO:数据包的协议
  • SPT:包的源端口
  • DPT:包的目标端口
  • WINDOW:发送方可以接收的数据包的大小
  • SYN URGP:指示是否需要三次握手。 0 表示不需要。

评论

富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善