Ubuntu 如何配置防火墙(UFW)
UFW(Uncomplicated Firewall)是 Ubuntu 官方推荐的防火墙管理工具,它是对底层 nftables(Ubuntu 22.04 及之后版本默认)或 iptables 的简化前端。设计目标就是“简单易用”,让普通用户和管理员能在几分钟内完成基本的端口控制,而不必直接编写复杂的 nft/iptables 规则。
在 2025–2026 年的 Ubuntu Server(尤其是 24.04 LTS 及后续版本)中,UFW 仍然是绝大多数场景下的首选防火墙管理方式。
一、UFW 的核心工作原理
UFW 的规则最终会被翻译成 nftables 规则(22.04+)或 iptables 规则(旧版本),并应用到内核的 netfilter 框架。
它的默认策略模型是:
- 默认拒绝所有入站连接(incoming policy = DENY)
- 默认允许所有出站连接(outgoing policy = ALLOW)
- 所有规则都是“显式允许”或“显式拒绝”,没有“隐式允许”的概念
这种设计符合现代服务器安全的最佳实践:最小暴露面。
二、UFW 基本状态与启用
大多数 Ubuntu Server 镜像在安装时 UFW 已经安装,但默认是关闭状态(inactive)。
查看当前状态:
sudo ufw status verbose第一次使用通常会看到:
Status: inactive启用 UFW(强烈建议在配置好 SSH 规则后再启用):
sudo ufw enable重要提醒:如果你是通过 SSH 远程管理服务器,必须先允许 SSH 端口,否则启用后会立刻断开连接。
三、最常见的第一步:允许 SSH
sudo ufw allow OpenSSH
# 或更明确地写
sudo ufw allow 22/tcp
# 如果你修改了 SSH 端口,例如改成了 5822
sudo ufw allow 5822/tcp允许后再次检查:
sudo ufw status numbered会看到类似输出:
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere四、常用规则写法对比
UFW 支持非常灵活的语法,以下是生产中最常用的几种写法:
| 场景 | 命令示例 | 说明 |
|---|---|---|
| 允许 HTTP + HTTPS | sudo ufw allow 'Nginx Full' 或 allow 80,443/tcp | Nginx/Apache 常用 profile |
| 只允许特定 IP 访问 3306 端口 | sudo ufw allow from 192.168.1.50 to any port 3306 | 数据库远程访问限制来源 |
| 允许某个子网访问所有端口 | sudo ufw allow from 10.0.0.0/16 | 内网全放行(慎用) |
| 拒绝某个 IP 访问 | sudo ufw deny from 203.0.113.88 | 黑名单单个 IP |
| 限制速率(防暴力破解) | sudo ufw limit OpenSSH | 每 30 秒最多 6 次连接尝试 |
| 删除某条规则 | sudo ufw delete 3 或 delete allow 80/tcp | 用编号或完整规则删除 |
| 重置所有规则(回到默认) | sudo ufw reset | 会清空所有自定义规则 |
五、推荐的生产环境最小规则集
一个典型的互联网暴露 Ubuntu Server(运行 Web + SSH)建议的规则组合:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH # 或你的自定义 SSH 端口
sudo ufw allow 'Nginx Full' # 或 80,443/tcp
# 如果有其他服务,按需添加,例如:
# sudo ufw allow 5432/tcp # PostgreSQL(建议限 IP)
# sudo ufw allow from 你的监控服务器IP to any port 9100 # node_exporter
sudo ufw enable
sudo ufw status六、进阶用法(nftables 原生规则补充)
当 UFW 的语法无法满足需求时,可以直接在 /etc/ufw/before.rules 或 /etc/ufw/user.rules 中写入原生 nftables/iptables 规则,UFW 会把它们包含进去。
更推荐的现代做法是:
- 让 UFW 管理主要端口
- 对于复杂需求(如限速、geoip 匹配、队列)直接用 nft 命令或创建独立的 nftables 配置文件(/etc/nftables.conf)
查看 UFW 实际翻译后的 nftables 规则:
sudo nft list ruleset七、常见问题与注意事项
- 启用 UFW 后 SSH 断开 原因:没先 allow SSH。解决:通过云厂商控制台、物理 KVM、本地串口等进入系统,执行 ufw allow ssh && ufw reload
- 规则不生效 常见原因:Docker 默认会修改 iptables/nftables 规则,导致 UFW 失效。解决:用 DOCKER-USER 链或把 Docker 网络设置为 bridge + ufw 兼容模式。
- 重载规则不中断连接sudo ufw reload 是安全的,不会踢掉现有连接。
- 查看日志 UFW 日志默认写到 /var/log/ufw.log,可通过 sudo tail -f /var/log/ufw.log 观察被阻断的连接。
八、总结:UFW 的定位与选择
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 个人 VPS、小型项目 | UFW | 极简、足够、安全性高 |
| 中大型生产环境 | UFW + nftables | UFW 管基础端口,nft 管复杂策略 |
| Kubernetes 集群节点 | nftables / cilium | 通常不依赖 UFW,由 CNI 接管 |
| 需要 geoip、DPI、队列 | nftables / firewalld / nftlb | UFW 功能有限 |
在 2026 年的 Ubuntu Server 生态中,UFW 仍然是 80%+ 场景下最务实的选择——它简单、可靠、文档丰富、与 Canonical 的生态深度集成。
记住一句话: 防火墙的第一原则不是“放行多少”,而是“默认拒绝 + 只放行必须的”。
