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)。

查看当前状态:

Bash
sudo ufw status verbose

第一次使用通常会看到:

text
Status: inactive

启用 UFW(强烈建议在配置好 SSH 规则后再启用):

Bash
sudo ufw enable

重要提醒:如果你是通过 SSH 远程管理服务器,必须先允许 SSH 端口,否则启用后会立刻断开连接。

三、最常见的第一步:允许 SSH

Bash
sudo ufw allow OpenSSH
# 或更明确地写
sudo ufw allow 22/tcp
# 如果你修改了 SSH 端口,例如改成了 5822
sudo ufw allow 5822/tcp

允许后再次检查:

Bash
sudo ufw status numbered

会看到类似输出:

text
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                    ALLOW IN    Anywhere

四、常用规则写法对比

UFW 支持非常灵活的语法,以下是生产中最常用的几种写法:

场景命令示例说明
允许 HTTP + HTTPSsudo ufw allow 'Nginx Full' 或 allow 80,443/tcpNginx/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)建议的规则组合:

Bash
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 会把它们包含进去。

更推荐的现代做法是:

  1. 让 UFW 管理主要端口
  2. 对于复杂需求(如限速、geoip 匹配、队列)直接用 nft 命令或创建独立的 nftables 配置文件(/etc/nftables.conf)

查看 UFW 实际翻译后的 nftables 规则:

Bash
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 + nftablesUFW 管基础端口,nft 管复杂策略
Kubernetes 集群节点nftables / cilium通常不依赖 UFW,由 CNI 接管
需要 geoip、DPI、队列nftables / firewalld / nftlbUFW 功能有限

在 2026 年的 Ubuntu Server 生态中,UFW 仍然是 80%+ 场景下最务实的选择——它简单、可靠、文档丰富、与 Canonical 的生态深度集成。

记住一句话: 防火墙的第一原则不是“放行多少”,而是“默认拒绝 + 只放行必须的”

THE END