概述

UFW(Uncomplicated Firewall) 是 Ubuntu 下默认的防火墙前端工具,设计理念如其名 —— "不复杂的防火墙"。它封装了底层 iptables/nftables 的复杂性,让你用自然语言般的命令就能配置防火墙规则。

ufw 不是一个新的防火墙框架,它只是一个 frontend(前端),底层可以自动适配 iptables 或 nftables。

适合人群:Linux 新手、需要快速配置防火墙的开发者、桌面用户、简单 VPS 防护。


核心概念

ufw 把防火墙抽象成几个简单的概念:

概念 说明
规则 允许(allow)或拒绝(deny)某种流量
方向 入站(incoming)或出站(outgoing)
服务/端口 直接用 ssh80/tcp443
默认策略 所有未明确允许的流量默认拒绝
配置文件 写入 /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

解决方法

  1. 通过 VPS 管理后台的 VNC/控制台登录
  2. 执行 sudo ufw disable 恢复连接
  3. 执行 sudo ufw allow ssh 后再 sudo ufw enable

Q:Docker + ufw 兼容吗?

Docker 会直接操作 iptables,可能绕过 ufw 的规则。两种常见解决方案:

  1. 让 Docker 使用 ufw 管理的网络(DOCKER_OPTS="--iptables=false"
  2. 接受 Docker 的默认行为,在应用层控制访问

Q:ufw 的规则存在哪里?

  • ufw allow/deny 添加的规则保存在 /etc/ufw/user.rules
  • 系统自动管理该文件,不要直接编辑
  • 需要自定义底层规则时编辑 /etc/ufw/before.rulesafter.rules

Q:如何检查 ufw 是否运行?

sudo ufw status
# Status: active     ← 正在运行
# Status: inactive   ← 未启用

# 查看服务状态
sudo systemctl status ufw

安全最佳实践

  1. 先放行 SSH,再启用 UFW — 这是黄金法则,牢记
  2. 使用 limit 替代 allow 保护 SSHsudo ufw limit ssh
  3. 最小化开放原则 — 只开放需要的端口
  4. 定期审计规则sudo ufw status numbered 检查有没有多余规则
  5. 日志日志日志sudo ufw logging on,出现异常时排查
  6. 备份配置/etc/ufw/ 目录定期备份
  7. 配合 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。