写在前面
你是不是遇到过这样的情况:刚买的云服务器,想限制一下访问端口提高安全性,但面对复杂的 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:
允许 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
|
然后就可以使用:
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 连接服务器:
- 云服务器:通过云控制台的 VNC/控制台功能登录
- 物理服务器:通过 IPMI 或直连显示器登录
- 登录后执行:
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 服务器的日常安全维护。核心要点回顾:
- 启用前必须先放行 SSH,避免把自己锁在外面
- 遵循最小权限原则:默认拒绝入站,只开放必要的端口
- 规则有优先级:从上到下匹配,第一条匹配的规则生效
- 定期检查规则:使用
ufw status numbered 审查配置 - 配合日志使用:出问题时通过日志排查
对于大多数场景,UFW 已经足够用了。如果遇到特别复杂的需求,再考虑深入学习 iptables 或 nftables。记住,安全配置没有一劳永逸,要根据实际需求不断调整优化。