Featured image of post Ubuntu/Debian 防火墙 UFW 完全使用指南

Ubuntu/Debian 防火墙 UFW 完全使用指南

从零开始学习 Ubuntu/Debian 系统防火墙工具 UFW,涵盖安装配置、规则管理、端口控制等实用技巧,帮助你轻松保护服务器安全

-- 次浏览
-- 条评论

写在前面

你是不是遇到过这样的情况:刚买的云服务器,想限制一下访问端口提高安全性,但面对复杂的 iptables 命令却无从下手?或者配置了半天防火墙规则,一不小心把自己的 SSH 连接也给封掉了,只能重启服务器恢复?

UFW(Uncomplicated Firewall)就是为了解决这个痛点而生的。它是 Ubuntu 官方推荐的防火墙工具,把复杂的 iptables 命令封装成简单易懂的语法,让普通用户也能轻松管理防火墙规则。

这篇文章将带你从零开始掌握 UFW,不仅教你基本的命令操作,还会分享实际场景中的配置技巧和常见问题的解决方案。

UFW 是什么

与 iptables 的关系

可以把 iptables 想象成汽车的手动挡,功能强大但操作复杂;而 UFW 就是自动挡,底层还是同一套系统,但使用起来简单多了。

  • iptables:Linux 内核级别的防火墙,功能强大但命令复杂
  • UFW:对 iptables 的友好封装,提供简单的命令行界面
  • 关系:UFW 的每条规则最终都会转换成 iptables 规则执行

适用场景

  • ✅ Ubuntu/Debian 服务器的日常防火墙管理
  • ✅ 简单的端口开放和访问控制
  • ✅ 快速配置常见服务(SSH、HTTP、HTTPS 等)
  • ❌ 极其复杂的网络策略(建议直接用 iptables)
  • ❌ 需要高级 NAT 转发的场景

安装与初始配置

检查安装状态

Ubuntu 16.04 及以后版本默认已安装 UFW,可以先检查一下:

1
2
3
4
5
# 检查是否安装
which ufw

# 查看版本
ufw version

安装 UFW

如果没有安装,使用以下命令:

1
2
3
4
5
# Debian/Ubuntu
sudo apt update
sudo apt install ufw

# 其他发行版可能需要从源码编译

首次启用前的安全配置

重要提醒:如果你是通过 SSH 远程连接服务器,在启用 UFW 之前必须先放行 SSH 端口,否则会把自己锁在门外!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 第一步:设置默认策略(拒绝所有入站,允许所有出站)
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 第二步:放行 SSH(默认 22 端口)
sudo ufw allow ssh
# 或者如果你改了 SSH 端口(假设改成 2222)
sudo ufw allow 2222/tcp

# 第三步:启用防火墙
sudo ufw enable

启用后会提示可能中断现有连接,输入 y 确认即可。

查看状态

1
2
3
4
5
6
7
8
# 查看防火墙状态
sudo ufw status

# 查看详细状态(包含规则编号)
sudo ufw status numbered

# 查看详细信息(包含原始 iptables 规则)
sudo ufw status verbose

基本规则管理

允许和拒绝端口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 允许指定端口
sudo ufw allow 80          # 允许 80 端口(TCP 和 UDP)
sudo ufw allow 443/tcp     # 只允许 443 端口的 TCP 流量
sudo ufw allow 53/udp      # 只允许 53 端口的 UDP 流量

# 允许端口范围
sudo ufw allow 6000:6007/tcp    # 允许 6000-6007 端口

# 拒绝指定端口
sudo ufw deny 3306         # 拒绝 MySQL 端口
sudo ufw deny 3306/tcp     # 只拒绝 TCP 连接

使用服务名称

UFW 预定义了常见服务的端口,可以直接使用服务名:

1
2
3
4
5
6
7
8
# 允许常见服务
sudo ufw allow ssh         # 22 端口
sudo ufw allow http        # 80 端口
sudo ufw allow https       # 443 端口
sudo ufw allow ftp         # 21 端口

# 查看所有可用的服务名称
less /etc/services

IP 地址访问控制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 允许特定 IP 访问
sudo ufw allow from 192.168.1.100

# 允许特定 IP 访问特定端口
sudo ufw allow from 192.168.1.100 to any port 22

# 允许整个子网
sudo ufw allow from 192.168.1.0/24

# 拒绝特定 IP
sudo ufw deny from 203.0.113.100

基于网卡的规则

1
2
3
4
5
# 允许特定网卡的流量
sudo ufw allow in on eth0 to any port 80

# 允许从 eth1 进入的 MySQL 连接(内网访问数据库)
sudo ufw allow in on eth1 to any port 3306

删除和修改规则

删除规则的方法

方法一:使用规则编号(推荐)

1
2
3
4
5
# 查看规则编号
sudo ufw status numbered

# 删除指定编号的规则
sudo ufw delete 3

方法二:重复添加规则的命令

1
2
3
# 如果之前添加了:sudo ufw allow 80
# 删除时使用:
sudo ufw delete allow 80

重置所有规则

1
2
3
4
5
# 禁用防火墙
sudo ufw disable

# 重置所有规则(会删除所有自定义规则)
sudo ufw reset

实际场景配置

Web 服务器配置

假设你要部署一个网站服务器,需要开放 HTTP、HTTPS 和 SSH:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 重置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 允许 SSH(远程管理)
sudo ufw allow ssh

# 允许 HTTP 和 HTTPS(网站访问)
sudo ufw allow http
sudo ufw allow https

# 启用防火墙
sudo ufw enable

# 验证配置
sudo ufw status verbose

数据库服务器配置

数据库服务器通常不应该对外开放,只允许特定应用服务器访问:

1
2
3
4
5
# 假设应用服务器 IP 是 192.168.1.50
sudo ufw allow from 192.168.1.50 to any port 3306

# 或者允许整个内网段
sudo ufw allow from 192.168.1.0/24 to any port 3306

SSH 暴力破解防护

虽然 UFW 本身不支持动态封禁,但可以配合限速功能:

1
2
3
4
# 限制 SSH 连接频率(防止暴力破解)
sudo ufw limit ssh

# 这会限制同一 IP 在 30 秒内最多 6 次连接尝试

Docker 容器端口映射

如果你使用 Docker,可能会发现 Docker 会绕过 UFW 规则。解决方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 编辑 UFW 配置文件
sudo nano /etc/ufw/after.rules

# 在文件末尾添加(假设 Docker 使用 172.17.0.0/16 网段)
*filter
:ufw-user-forward - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward
-A DOCKER-USER -j RETURN
COMMIT

然后重启 UFW:

1
sudo ufw reload

允许 Ping(ICMP)

默认情况下 UFW 允许 ping,如果你手动禁用了,可以这样恢复:

1
2
3
4
5
# 编辑配置文件
sudo nano /etc/ufw/before.rules

# 确保有以下规则(通常默认就有)
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

高级功能

日志记录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 开启日志(默认级别)
sudo ufw logging on

# 设置日志级别
sudo ufw logging low     # 低
sudo ufw logging medium  # 中(默认)
sudo ufw logging high    # 高
sudo ufw logging full    # 完整

# 关闭日志
sudo ufw logging off

# 查看日志
sudo tail -f /var/log/ufw.log

应用配置文件

UFW 支持创建应用配置文件,方便管理复杂的规则组合:

1
2
3
4
5
6
7
8
# 查看已有的应用配置
sudo ufw app list

# 查看应用详情
sudo ufw app info 'Nginx Full'

# 允许应用
sudo ufw allow 'Nginx Full'

创建自定义应用配置:

1
2
3
4
5
6
7
8
# 创建配置文件
sudo nano /etc/ufw/applications.d/myapp

# 内容示例:
[MyApp]
title=My Application
description=Custom app with multiple ports
ports=8080,8443/tcp

然后就可以使用:

1
sudo ufw allow 'MyApp'

IPv6 支持

UFW 默认支持 IPv6,确保配置文件中已启用:

1
2
3
4
5
6
7
8
9
# 编辑配置
sudo nano /etc/default/ufw

# 确保有这一行
IPV6=yes

# 重启 UFW
sudo ufw disable
sudo ufw enable

常见问题与解决方案

规则不生效怎么办?

检查以下几点:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 确认 UFW 已启用
sudo ufw status

# 查看规则顺序(UFW 从上到下匹配)
sudo ufw status numbered

# 重新加载规则
sudo ufw reload

# 查看底层 iptables 规则(排查问题)
sudo iptables -L -n -v

误把自己锁在外面了怎么办?

如果你无法 SSH 连接服务器:

  1. 云服务器:通过云控制台的 VNC/控制台功能登录
  2. 物理服务器:通过 IPMI 或直连显示器登录
  3. 登录后执行:
    1
    2
    3
    
    sudo ufw disable
    sudo ufw allow ssh
    sudo ufw enable
    

Docker 容器端口无法访问

Docker 默认会修改 iptables 规则,可能绕过 UFW。解决方案参考前面的"Docker 容器端口映射"章节。

如何查看被阻止的连接?

1
2
3
4
5
6
7
8
# 开启日志
sudo ufw logging medium

# 实时查看被拒绝的连接
sudo tail -f /var/log/ufw.log | grep BLOCK

# 分析特定 IP 的访问
sudo grep "192.168.1.100" /var/log/ufw.log

UFW 和其他防火墙工具冲突

如果你同时使用了 firewalld、nftables 等工具,可能会冲突:

1
2
3
4
5
6
# 停用其他防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# 只使用 UFW
sudo ufw enable

端口转发怎么做?

UFW 本身不直接支持端口转发,需要修改配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 编辑配置
sudo nano /etc/ufw/before.rules

# 在 *filter 之前添加 NAT 规则
*nat
:PREROUTING ACCEPT [0:0]
# 将外部 8080 端口转发到内部 192.168.1.100:80
-A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
COMMIT

# 启用转发
sudo nano /etc/ufw/sysctl.conf
# 取消注释:
net/ipv4/ip_forward=1

# 重启 UFW
sudo ufw disable
sudo ufw enable

常用命令速查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 状态管理
sudo ufw status                    # 查看状态
sudo ufw enable                    # 启用防火墙
sudo ufw disable                   # 禁用防火墙
sudo ufw reload                    # 重新加载规则
sudo ufw reset                     # 重置所有规则

# 规则管理
sudo ufw allow 80                  # 允许端口
sudo ufw deny 3306                 # 拒绝端口
sudo ufw limit ssh                 # 限速(防暴力破解)
sudo ufw delete allow 80           # 删除规则
sudo ufw status numbered           # 显示规则编号
sudo ufw delete 3                  # 删除指定编号的规则

# 高级规则
sudo ufw allow from 192.168.1.100                      # 允许 IP
sudo ufw allow from 192.168.1.0/24 to any port 22     # 子网访问特定端口
sudo ufw allow in on eth0 to any port 80              # 指定网卡

# 默认策略
sudo ufw default deny incoming     # 默认拒绝入站
sudo ufw default allow outgoing    # 默认允许出站

# 日志管理
sudo ufw logging on                # 开启日志
sudo ufw logging medium            # 设置日志级别
sudo tail -f /var/log/ufw.log      # 查看日志

总结

UFW 把复杂的防火墙管理变得简单直观,特别适合 Ubuntu/Debian 服务器的日常安全维护。核心要点回顾:

  1. 启用前必须先放行 SSH,避免把自己锁在外面
  2. 遵循最小权限原则:默认拒绝入站,只开放必要的端口
  3. 规则有优先级:从上到下匹配,第一条匹配的规则生效
  4. 定期检查规则:使用 ufw status numbered 审查配置
  5. 配合日志使用:出问题时通过日志排查

对于大多数场景,UFW 已经足够用了。如果遇到特别复杂的需求,再考虑深入学习 iptables 或 nftables。记住,安全配置没有一劳永逸,要根据实际需求不断调整优化。