在 Debian 11 上使用 UFW 设置防火墙

1. UFW 简介

  • 防火墙是用于监控和过滤传入和传出网络流量的工具,它通过定义一组确定是允许还是阻止特定流量的安全规则来工作
  • UFW(Uncomplicated Firewall)是一种简化的防火墙管理界面,它隐藏了较低级别的数据包过滤技术,例如 iptables 和 nftables

2. 安装 UFW

1
2
3
4
$ sudo apt install ufw

# 检查UFW状态和规则
$ sudo ufw status verbose
  • 启用 IPV6(可选):如果 Debian 服务器启用了 IPv6,则需要确保 UFW 配置支持 IPv6。这样除了 IPv4 之外,UFW 还将管理 IPv6 的防火墙规则
1
2
$ sudo nano /etc/default/ufw
IPV6=yes

3. 设置默认规则

  • 默认规则会处理不明确匹配任何其他规则的流量
  • 默认情况下,UFW 设置为拒绝所有传入连接并允许所有传出连接。这意味着任何试图访问服务器的人都无法连接,而服务器内的任何应用程序都可以访问外部
1
2
3
4
5
6
$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)
$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'
(be sure to update your rules accordingly)

4. 允许 SSH 连接

  • 目前还不能启动 UFW 防火墙,因为它会拒绝所有传入连接,包括 SSH
1
2
3
4
5
6
# 创建防火墙规则,允许端口 22上的所有连接
# UFW知道哪个端口与`allow ssh`绑定,因为它在`/etc/services`文件中被列为服务
$ sudo ufw allow ssh

# 也可以通过指定端口而不是服务名称来编写等效规则
# $ sudo ufw allow 22

5. 启用 UFW

1
2
3
4
$ sudo ufw enable

# 查看设置的规则
$ sudo ufw status verbose

6. 允许其他连接

1
2
$ sudo ufw allow http  # 80
$ sudo ufw allow https # 443
  • 指定端口范围
    • 指定端口范围时必须指定规则适用的协议(TCP 或 UDP)
    • 之前的情况如果不指定协议会自动允许两种协议
1
2
3
# 开放端口`6000~6007`
$ sudo ufw allow 6000:6007/tcp
$ sudo ufw allow 6000:6007/udp
  • 具体 IP 地址
1
2
3
4
5
# 允许来自特定IP地址的连接
$ sudo ufw allow from 203.0.113.4

# 可以通过添加`to any port`后跟端口号来指定允许IP地址访问特定端口
$ sudo ufw allow from 203.0.113.4 to any port 22
  • 子网
1
2
3
4
5
#使用CIDR表示法来指定网络掩码
$ sudo ufw allow from 203.0.113.0/24 # 203.0.113.1~203.0.113.254

# 也可以指定允许子网连接到的目标端口
$ sudo ufw allow from 203.0.113.0/24 to any port 22
  • 连接到特定网络接口
1
2
3
4
5
6
# 创建仅适用于特定网络接口的防火墙规则,可以通过指定`allow in on`后跟网络接口名称来实现
# 允许HTTP流量到名为eth0的公共网络接口,这将允许服务器接收来自公共互联网的HTTP请求
$ sudo ufw allow in on eth0 to any port 80

# 允许MySQL流量到名为eth1的专用网络接口,这将允许专用网络上的其他服务器连接到MySQL数据库
$ sudo ufw allow in on eth1 to any port 3306

7. 拒绝连接

  • 默认规则下,UFW 将配置为拒绝所有传入连接。我们通常创建明确允许特定端口和 IP 地址通过的规则,从而创建安全防火墙策略
  • 有时我们希望根据源 IP 地址或子网拒绝特定连接,如知道服务器正在从某处遭受攻击
1
2
3
4
5
# 拒绝HTTP连接
$ sudo ufw deny http

# 拒绝来自IP的所有连接
$ sudo ufw deny from 203.0.113.4

8. 删除规则

  • 可以通过规则编号或通过规则本身来指定要删除的规则,这类似于规则在创建时的指定方式
  • 按规则编号
    • 需手动指定删除 IPv4 或 IPv6 规则
1
2
3
4
5
6
7
8
9
10
# 获取防火墙规则列表,使用`numbered`选项
$ sudo ufw status numbered
Status: active

To Action From
-- ------ ----
[ 1] 22 ALLOW IN 15.15.15.0/24
[ 2] 80 ALLOW IN Anywhere
# 删除规则`2`
$ sudo ufw delete 2
  • 按实际规则
    • 同时删除 IPv4 和 IPv6 规则(如果存在)
1
2
3
4
5
# 指定服务名称
$ sudo ufw delete allow http

# 指定端口号
$ sudo ufw delete allow 80

9. 禁用或重置 UFW

1
2
3
4
5
# 执行后之前定义的所有规则将不再生效
$ sudo ufw disable

# 执行后将禁用UFW并删除之前定义的所有规则
$ sudo ufw reset

参考