Linux UFW 防火墙的安装、配置及使用教程

什么是 UFW

UFW 是通常在 Debian/Ubuntu 上使用的一个简单易用的防火墙管理工具,它提供了更加易懂的命令用于配置和管理 iptables 规则,使用该工具可以让配置防火墙更加通俗易懂。

注意:UFW 默认并不可以管到 Docker 的端口映射,对于不需要公开访问的端口请绑定到 127.0.0.1

为什么使用它

因为方便快捷,这里我们以开放 http 端口为例看一下 UFW 和 iptables 的命令区别。

# iptables 开放 http 端口
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

# ufw 开放 http 端口
sudo ufw allow http

很显然 UFW 的命令更加简洁,更加适合需要防火墙设置的普通用户或者初学者。而 iptables 的命令更加复杂,但是如果看得懂会觉得条理更加清晰,更适合需要更细粒度控制的场景。

如何安装

# 更新软件包列表
sudo apt update

# 安装 UFW
sudo apt install ufw

配置默认策略

首先我们先覆盖一下默认策略,防止意外情况发生。这样的策略将会阻止未经你授权的访问,这有助于提高服务器的安全性。

# 禁止所有入站流量
sudo ufw default deny incoming

# 允许所有出站流量
sudo ufw default allow outgoing

基础命令

注意:不管在何时请将你连接服务器方式的端口放行,例如 SSH 的端口。并且不要关闭当前终端,请开启一个新的终端进行测试防止失联。如果已经失联请通过服务商提供的应急救援方式或者寻求工单支持找回机器。

通过端口配置规则

这里以允许和禁止 4433 端口为例

# 允许 4433 端口流量,含 TCP&UDP
sudo ufw allow 4433

# 禁止 4433 端口流量,含 TCP&UDP
sudo ufw deny 4433

端口协议限制

如果你的服务只需要用到 TCP 或者 UDP,只需要在端口后加上 /tcp 或者 /udp 即可

# 允许 TCP 流量通过 4433 端口 
sudo ufw allow 4433/tcp

# 允许 UDP 流量通过 4433 端口
sudo ufw allow 4433/udp

服务名配置规则

所有服务名称规则使用的是服务默认端口,例如 SSH(22) HTTP(80)

如果你已经将默认端口进行修改,请直接通过端口配置规则

# 允许 SSH 访问
sudo ufw allow ssh

# 允许 HTTP 访问
sudo ufw allow http

为规则添加注释

这里的 comment 与日常生活的不同,表示的不是评论而是注释的意思。这在多人维护或者较多规则的时候有重大用处,所以添加有意义的注释是一个非常好的习惯。

# 允许 SSH 访问并添加注释为 SSH
sudo ufw allow ssh comment "SSH"

为ufw规则添加注释

启用和禁用防火墙规则

随后我们可以将 UFW 启用使规则生效

注意:请不要关闭当前终端,请新开终端测试防止失联

# 启用防火墙规则
sudo ufw enable

# 禁用防火墙规则
sudo ufw disable

启用UFW规则

查看防火墙规则

下面命令仅限于启用下才可以使用哦,不同命令查看的效果不同,大家可以尝试一下。

# 查看基础防火墙规则
sudo ufw status

# 查看详细防火墙规则
sudo ufw status verbose

# 这会在基础防火墙规则前加上数字编号
sudo ufw status unmbered

查看所有防火墙规则

删除防火墙规则

根据原始命令删除

我们只需要在需要删除的原始命令中加上 delete 就可以删除这条规则了

# 原始命令
sudo ufw allow 4433/tcp

# 删除命令
sudo ufw delete allow 4433/tcp

根据原始命令删除防火墙规则

根据编号删除

查看编号并删除对应编号的规则

# 查看所有规则编号
sudo ufw status numbered

# 删除编号为 4 的规则
sudo ufw delete 4

根据编号删除防火墙规则

重置防火墙规则

有时候我们需要重置所有规则,这时候这条命令就帮大忙了。另外只会重置创建的规则,并不会重置 UFW 的配置文件

sudo ufw reset

重置防火墙规则

顺序原则

规则生效顺序

在 UFW 中,规则的生效顺序是从上往下的,因此当找到匹配的规则后就会应用该规则并停止进一步的检查。

下面给出一个例子,这里我需要允许 192.168.1.100 访问本机,但是不允许其访问 22 端口,但是这里的规则按照从上往下的顺序,已经允许其访问本机的所有端口了,直接应用了 allow 这条规则,那么下面的 deny 的规则也就不生效了。

规则匹配生效顺序的错误例子

最佳的做法是 22 deny 这条规则要在上方,所以大家在配置规则的时候要注意顺序,避免因为顺序原因出现无效规则。

规则匹配生效顺序的最佳做法

规则添加顺序

默认情况下规则是直接添加在末尾的,这对于保持特定规则生效是不利的,可以通过下面的方式将规则放到合适的位置。

开头添加规则

# 将禁止 192.168.1.100 访问 22 端口添加到最前面
sudo ufw prepend deny from 192.168.1.100 to any port 22

开头添加防火墙规则

在编号位置插入规则

前面我们在查看防火墙规则的时候见到了编号,同样这里我们也可以直接在对应编号的位置插入规则,插入到相应编号后,原编号的规则则向后挪位。

# 将禁止 192.168.1.100 访问 23 端口添加到编号为 2 的位置
sudo ufw insert 2 deny from 192.168.1.100 to any port 23

在编号位置插入防火墙规则

控制地址或地址段

# 允许来自 192.168.1.100 的流量访问本机所有端口
sudo ufw allow from 192.168.1.100

# 允许来自 192.168.1.100 的 TCP 流量访问本机所有端口
sudo ufw allow from 192.168.1.100 proto tcp

# 允许来自 192.168.1.0/24 的所有 IP 地址访问本机所有端口
sudo ufw allow from 192.168.1.0/24

# 允许来自 192.168.1.100 的流量访问本机 4433 端口
sudo ufw allow from 192.168.1.100 to any port 4433

# 允许来自 192.168.1.100 的 TCP 流量访问本机 4433 端口
sudo ufw allow from 192.168.1.100 to any port 4433 proto tcp

拒绝匹配的流量

上面我们讲的是 allow 或者 deny ,其实还有 reject 的选项,这用于拒绝匹配的流量而不是直接丢弃。这在需要进行调试或者需要对方明确知道自己被拒绝的情况下使用。用法与 deny 完全相同,下面给出几个例子。

# 拒绝来自 192.168.1.100 的流量访问本机所有端口
sudo ufw reject from 192.168.1.100

# 拒绝来自 192.168.1.100 的流量访问本机 4433 端口
sudo ufw reject from 192.168.1.100 to any port 4433

查看更多信息

# 查看添加的规则(不需要启动 UFW)
sudo ufw show added

# 查看监听的端口和相应端口规则
sudo ufw show listening

控制日志文件

默认情况下日志会以 low 级别启用,如果你有需要可以关闭或者修改为其他级别。

# 修改为其他级别
sudo ufw logging <full|high|medium|low>

# 打开或者关闭日志文件
sudo ufw logging <on|off>

评论