介绍
什么是 UFW 呢?UFW 是通常在 Ubuntu 和 Debian 等 Linux 发行版上使用的一个简单易用的防火墙管理工具。它提供了更加易懂的命令用于配置和管理 iptables 规则,使得配置防火墙更加直接。
为什么我会选择使用 UFW 呢?因为方便快捷。这里我们以开放 http 端口为例看一下 UFW 和 iptables 的命令区别。
# iptables 开放 http 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
# ufw 开放 http 端口
ufw allow http
很显然 UFW 的命令更加简洁,更加适合需要防火墙设置的普通用户或者初学者。而 iptables 的命令更加复杂,但是如果看得懂会觉得条理更加清晰,更适合需要更细粒度控制的场景。
安装
# 更新软件包列表
sudo apt update
# 安装 UFW
sudo apt install ufw
默认策略
首先我们先覆盖一下默认策略,防止意外情况发生。这样的策略将会阻止未经您授权的访问,这有助于提高服务器的安全性。
注意: 默认情况下 ufw 管不到 docker
# 拒绝所有入站流量
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 启用使规则生效
sudo ufw enable
注意: 请不要关闭当前终端,请新开终端测试以防止失联
查看防火墙规则
下面命令仅限于启用下才可以使用哦,不同命令查看的效果不同,大家可以尝试一下。
# 查看基础防火墙规则
sudo ufw status
# 查看详细防火墙规则
sudo ufw status verbose
# 这会在基础防火墙规则前加上数字编号
sudo ufw status unmbered
删除防火墙规则
- 在需要删除的配置命令中加上 delete
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 端口,但是这里的规则按照从上往下的顺序,已经允许其访问本机的所有端口了,直接应用了这条规则,那么下面的 deny
的规则也就不生效了。所以要达成目的话 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>
这里需要注意的是如果您的系统是 Debian 12 那么需要手动安装 rsyslog 才能记录日志文件。
# 更新软件包列表
sudo apt update
# 安装 rsyslog
sudo apt install rsyslog