UFW 防火墙:简单到极致的 Linux 防火墙
概述
UFW(Uncomplicated Firewall) 是 Ubuntu 下默认的防火墙前端工具,设计理念如其名 —— "不复杂的防火墙"。它封装了底层 iptables/nftables 的复杂性,让你用自然语言般的命令就能配置防火墙规则。
ufw 不是一个新的防火墙框架,它只是一个 frontend(前端),底层可以自动适配 iptables 或 nftables。
适合人群:Linux 新手、需要快速配置防火墙的开发者、桌面用户、简单 VPS 防护。
核心概念
ufw 把防火墙抽象成几个简单的概念:
| 概念 | 说明 |
|---|---|
| 规则 | 允许(allow)或拒绝(deny)某种流量 |
| 方向 | 入站(incoming)或出站(outgoing) |
| 服务/端口 | 直接用 ssh、80/tcp、443 等 |
| 默认策略 | 所有未明确允许的流量默认拒绝 |
| 配置文件 | 写入 /etc/ufw/ 目录下的规则文件 |
| 应用程序配置 | 通过 /etc/ufw/applications.d/ 预定义服务规则 |
安装
Ubuntu(默认已安装)
# Ubuntu 通常已自带 ufw,只需启用
sudo ufw enable
# 如果未安装
sudo apt update
sudo apt install ufw
Debian
sudo apt update
sudo apt install ufw
其他发行版
# Fedora / RHEL(不推荐,firewalld 才是默认)
sudo dnf install ufw
# Arch Linux
sudo pacman -S ufw
sudo systemctl enable ufw && sudo systemctl start ufw
验证安装
ufw --version
# ufw 0.36.2
快速上手
第一步:设置默认策略
# 默认拒绝所有入站(安全做法)
sudo ufw default deny incoming
# 默认允许所有出站(通常这么设)
sudo ufw default allow outgoing
第二步:开放必要端口
# 开放 SSH(远程服务器务必先做这一步!)
sudo ufw allow ssh
# 或
sudo ufw allow 22/tcp
# 开放 HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 允许 Ping(ICMP echo-request)
sudo ufw allow proto icmp
第三步:启用防火墙
# 启用防火墙(会提示是否影响 SSH,输入 y)
sudo ufw enable
# 查看状态
sudo ufw status verbose
第四步:检查状态
sudo ufw status
# 输出示例:
# Status: active
#
# To Action From
# -- ------ ----
# 22/tcp ALLOW Anywhere
# 80/tcp ALLOW Anywhere
# 443/tcp ALLOW Anywhere
# 22/tcp (v6) ALLOW Anywhere (v6)
# 80/tcp (v6) ALLOW Anywhere (v6)
# 443/tcp (v6) ALLOW Anywhere (v6)
⚠️ 关键操作顺序:先
allow ssh,再enable。如果先 enable,默认策略是 deny incoming,你的 SSH 连接会立刻断开。
常用命令速查
端口与服务管理
# 允许服务名
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
# 允许端口(TCP)
sudo ufw allow 8080/tcp
# 允许端口(UDP)
sudo ufw allow 53/udp
# 允许端口范围
sudo ufw allow 6000:6007/tcp
# 拒绝某端口
sudo ufw deny 23/tcp # 拒绝 Telnet
# 删除规则(通过编号,先用 status numbered 查看)
sudo ufw delete 3
# 删除规则(通过完整描述)
sudo ufw delete allow 8080/tcp
IP 地址控制
# 允许特定 IP 访问所有端口
sudo ufw allow from 192.168.1.100
# 允许特定 IP 访问特定端口
sudo ufw allow from 192.168.1.0/24 to any port 22
# 拒绝特定 IP
sudo ufw deny from 10.0.0.5
# 拒绝特定 IP 访问特定端口
sudo ufw deny from 203.0.113.4 to any port 80
# 只允许特定 IP 访问 SSH(其他 IP 一律拒绝)
sudo ufw allow from 192.168.1.0/24 to any port 22
方向控制
# 入站规则(默认)
sudo ufw allow 80/tcp
# 出站规则
sudo ufw allow out 53/udp
# 只允许特定 IP 出站
sudo ufw deny out to any
sudo ufw allow out to 8.8.8.8 port 53 proto udp
网卡控制
# 仅允许从 eth0 网卡访问 SSH
sudo ufw allow in on eth0 to any port 22
# 指定网卡和源 IP
sudo ufw allow in on eth1 from 10.0.0.0/8 to any port 3306
状态查看与监控
# 查看简洁状态
sudo ufw status
# 查看详细状态(含默认策略、日志级别)
sudo ufw status verbose
# 带编号查看(方便删除)
sudo ufw status numbered
# 输出示例(numbered):
# [ 1] 22/tcp ALLOW IN Anywhere
# [ 2] 80/tcp ALLOW IN Anywhere
# [ 3] 443/tcp ALLOW IN Anywhere
# [ 4] 192.168.1.0/24 22/tcp ALLOW IN 192.168.1.0/24
日志与调试
# 启用日志(默认是 low 级别)
sudo ufw logging on
sudo ufw logging medium # 可选 low/medium/high/full
# 查看日志
sudo tail -f /var/log/ufw.log
# 日志输出示例:
# Dec 15 10:30:15 server kernel: [UFW BLOCK] IN=eth0 OUT= MAC=... SRC=203.0.113.5 DST=... PROTO=TCP DPT=22
日志级别说明:
| 级别 | 说明 |
|---|---|
low |
仅记录被阻止的入站包 |
medium |
low + 被阻止的出站包 + 被允许的非匹配包 |
high |
medium + 全部匹配信息,限速 |
full |
所有包,不限速(慎用,会产生大量日志) |
配置文件管理
ufw 的所有配置保存在 /etc/ufw/ 目录下:
/etc/ufw/
├── after.rules # 用户自定义规则(在其他规则之后执行)
├── after6.rules # IPv6 版本
├── applications.d/ # 应用程序配置目录
│ ├── openssh-server # SSH 预定义规则
│ └── ... # 其他应用规则
├── before.rules # 用户自定义规则(在其他规则之前执行)
├── before6.rules # IPv6 版本
├── ufw.conf # 主配置文件
└── user.rules # 用户通过 ufw 命令添加的规则(自动生成)
编辑 before.rules 的典型场景
需要更底层控制时(如端口转发),可以直接编辑 before.rules:
# 在 /etc/ufw/before.rules 中添加 NAT 规则
# 在文件顶部,*filter 之前添加:
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# 端口转发:将 80 端口转发到内网 10.0.0.2:80
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2:80
# 源 NAT
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
编辑后重启 ufw:
sudo ufw disable && sudo ufw enable
应用配置管理
ufw 支持预定义的应用程序规则,通过 ufw app 管理:
# 列出所有可用的应用配置
sudo ufw app list
# 输出示例:
# Available applications:
# DNS
# IMAP
# OpenSSH
# POP3
# Postfix
# ...
# 查看某应用的规则详情
sudo ufw app info OpenSSH
# 允许某应用的所有端口
sudo ufw allow OpenSSH
# 创建自定义应用配置(/etc/ufw/applications.d/myapp)
sudo vim /etc/ufw/applications.d/myapp
# 内容示例:
[MyWebApp]
title=My Custom Web Application
description=My web app running on port 3000
ports=3000/tcp
实际场景
场景 1:Web 服务器(VPS)
# 1. 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. 开放服务
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
# 3. 启用
sudo ufw enable
# 4. 验证
sudo ufw status verbose
场景 2:只允许公司 IP 访问
# 公司公网 IP
COMPANY_IP="203.0.113.20"
# 默认拒绝所有入站
sudo ufw default deny incoming
# 只允许公司 IP 访问 SSH 和 Web 服务
sudo ufw allow from $COMPANY_IP to any port 22
sudo ufw allow from $COMPANY_IP to any port 80
sudo ufw allow from $COMPANY_IP to any port 443
# 启用
sudo ufw enable
场景 3:家庭 NAS + 内网访问
# 内网网段
LAN="192.168.1.0/24"
# 默认
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 内网访问全部允许
sudo ufw allow from $LAN
# 外网只允许 SSH(要改默认端口的话加上)
sudo ufw allow 22/tcp
# 禁用外网访问 NAS 管理面板
sudo ufw deny 5000/tcp # 群晖 DSM
sudo ufw deny 9091/tcp # Transmission
sudo ufw enable
场景 4:Docker 主机
Docker 会直接操作 iptables 规则,可能与 ufw 冲突:
# 方案一:禁用 Docker 的 iptables 管理(编辑 /etc/docker/daemon.json)
{
"iptables": false
}
# 方案二:让 ufw 在 Docker 之前加载
# 编辑 /etc/ufw/after.rules,添加 Docker 需要的规则
# 然后:
sudo systemctl restart docker
sudo ufw disable && sudo ufw enable
高级操作
限速(防止暴力破解)
# 限制 SSH 连接频率:30 秒内最多 6 次
sudo ufw limit ssh
# limit 规则的含义:如果某个 IP 在 30 秒内建立超过 6 次新连接,拒绝后续连接
重置防火墙
# 完全重置所有规则
sudo ufw reset
# 这会:
# - 禁用 ufw
# - 删除所有规则
# - 重置为默认配置
禁用与重新加载
# 禁用(临时关闭防火墙)
sudo ufw disable
# 重新加载配置(不中断已建立的连接)
sudo ufw reload
查看底层规则
ufw 生成的底层 iptables/nftables 规则:
# 查看 ufw 生成的 iptables 规则
sudo iptables -L -n -v | grep -E "ufw|UFW"
# 或查看完整的 filter 表
sudo iptables -L ufw-user-input -n -v
与其他工具配合
Nginx 反代后端服务
# 后端服务运行在 127.0.0.1:3000,只需暴露 Nginx
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 不需要打开 3000 端口
Fail2ban + UFW
# Fail2ban 可以自动添加 ufw 规则屏蔽恶意 IP
# 配置 /etc/fail2ban/jail.local:
[DEFAULT]
banaction = ufw
[sshd]
enabled = true
常见问题
Q:ufw 和 iptables 是什么关系?
ufw 是基于 iptables/nftables 的前端工具。你执行 ufw allow 80/tcp,ufw 会帮你翻译成对应的 iptables 或 nftables 规则并加载到内核中。
Q:ufw 和 firewalld 有什么区别?
| 特性 | ufw | firewalld |
|---|---|---|
| 默认发行版 | Ubuntu/Debian | RHEL/CentOS/Fedora |
| 配置方式 | 命令行手动规则 | 区域(zone)概念,动态管理 |
| 学习难度 | 低 | 中 |
| 语法风格 | ufw allow 80 |
firewall-cmd --add-port=80/tcp |
Q:ufw enable 后 SSH 断了怎么办?
原因:默认策略 deny incoming 生效,但你没有事先 allow ssh。
解决方法:
- 通过 VPS 管理后台的 VNC/控制台登录
- 执行
sudo ufw disable恢复连接 - 执行
sudo ufw allow ssh后再sudo ufw enable
Q:Docker + ufw 兼容吗?
Docker 会直接操作 iptables,可能绕过 ufw 的规则。两种常见解决方案:
- 让 Docker 使用 ufw 管理的网络(
DOCKER_OPTS="--iptables=false") - 接受 Docker 的默认行为,在应用层控制访问
Q:ufw 的规则存在哪里?
ufw allow/deny添加的规则保存在/etc/ufw/user.rules- 系统自动管理该文件,不要直接编辑
- 需要自定义底层规则时编辑
/etc/ufw/before.rules或after.rules
Q:如何检查 ufw 是否运行?
sudo ufw status
# Status: active ← 正在运行
# Status: inactive ← 未启用
# 查看服务状态
sudo systemctl status ufw
安全最佳实践
- 先放行 SSH,再启用 UFW — 这是黄金法则,牢记
- 使用 limit 替代 allow 保护 SSH —
sudo ufw limit ssh - 最小化开放原则 — 只开放需要的端口
- 定期审计规则 —
sudo ufw status numbered检查有没有多余规则 - 日志日志日志 —
sudo ufw logging on,出现异常时排查 - 备份配置 —
/etc/ufw/目录定期备份 - 配合 Fail2ban — 防护暴力破解
总结
| 操作 | 命令 |
|---|---|
| 启用防火墙 | sudo ufw enable |
| 禁用防火墙 | sudo ufw disable |
| 查看状态 | sudo ufw status verbose |
| 允许端口 | sudo ufw allow 80/tcp |
| 拒绝端口 | sudo ufw deny 23/tcp |
| 允许 IP | sudo ufw allow from 192.168.1.100 |
| 拒绝 IP | sudo ufw deny from 10.0.0.5 |
| 限速保护 | sudo ufw limit ssh |
| 删除规则 | sudo ufw delete 3 |
| 重置所有 | sudo ufw reset |
| 重新加载 | sudo ufw reload |
| 查看日志 | sudo tail -f /var/log/ufw.log |
ufw 是最好的"够用就好"防火墙。如果你不想花时间去学习 iptables 的四表五链、不想记复杂的参数、只想快速保护好你的服务器 —— ufw 就是最正确的选择。等你发现 ufw 不够用时(比如需要复杂 NAT、端口转发),再升级到 nftables。