UFW 与 firewalld 对比:两大 Linux 防火墙管理器怎么选
UFW 统治 Debian/Ubuntu 世界,firewalld 是 RHEL 系标准:前者简单直白命令如英语,后者以区域(zone)组织规则适配复杂网络。本文从模型、语法、持久化到发行版选型逐项对比。
直接回答:UFW 与 firewalld 管的是同一个 netfilter,分歧在抽象模型——UFW 扁平直白(ufw allow 22),适合单角色服务器;firewalld 按区域(public/trusted/dmz)组织规则,接口划入不同 zone 应用不同策略,适合多网段复杂环境。选型第一原则:跟随发行版默认(Ubuntu 常用 UFW,RHEL/CentOS→firewalld)。
模型差异
- UFW:扁平规则列表,默认策略 + 放行/拒绝条目。思维负担极小
- firewalld:zone 制——接口归属区域(public/internal/dmz/trusted),规则按 zone 应用。笔记本在公司网和咖啡馆切不同 zone,可与 NetworkManager 连接配置关联,并非未配置时自动切换
远程变更安全
修改默认策略、启停管理器或重载前,备份当前规则并记录实际 SSH 端口和管理来源,保留当前会话并确认带外/云控制台可用。先放行管理连接、回环与已建立连接,再从第二个终端新建 SSH 会话验证,成功后才收紧旧规则。准备经验证的限时回退,不要远程清空规则或盲目 reset。IPv4、IPv6、安全组及 Docker 转发路径需分别验证,告警不能替代防锁定措施。
验证放行规则时,也可从用户访问路径持续检查业务入口。在观测云 HTTP 拨测中选择节点并设置响应断言,对照防火墙变更时间查看失败请求;禁止来源、新 SSH 会话和带外回退仍按上面的步骤单独验证。
语法对比
# UFW
# 先确认实际 SSH 管理端口与来源已放行
sudo ufw allow 80/tcp
# firewalld
# 先检查接口所属 zone,临时规则 300 秒后撤销
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --zone=public --add-service=http --timeout=300
验证新 SSH 会话和业务后,再另将审核过的规则写入永久配置。firewalld 的 --permanent 与运行时分离——改永久配置要 reload 才生效,新手常在这里困惑;好处是可以先改运行时测试,确认无误再固化。
服务定义与高级场景
firewalld 内置服务定义(xml 描述端口/协议组),--add-service=mysql 一条搞定;自定义服务也可扩展。rich rule 支持细粒度条件——复杂网络环境下表达力明显强于 UFW。
发行版与现实建议
Ubuntu 常用 UFW,Debian 镜像配置各异,RHEL/Rocky/Alma 默认 firewalld——跟着默认走,社区文档与排障资源都围绕默认工具。跨发行版团队建议两套都会基础操作。
常见问题(FAQ)
Q:firewalld 的 zone 怎么选?
A:服务器单一公网接口放 public 即可;多网卡机器按信任级别划分(内网同样按最小权限选择 zone;trusted 接受所有连接,不应因为内网就默认采用;公网通常 public)。zone 的价值在多接口才显现。
Q:能同时装两个吗?
A:不能同时启用——两者都管 netfilter 规则会互相覆盖。切换前停用一个再启另一个。
Q:docker 和防火墙的关系?
A:Docker 直接改 iptables 规则,与 UFW/firewalld 存在不同转发集成行为,不能只检查主机 INPUT——生产上需专门配置(iptables 后端可检查 DOCKER-USER,原生 nftables 后端需对应配置)约束容器端口暴露。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。