Firewalld防火墙是Linux系统上动态管理网络规则的利器,相比iptables更直观易用,尤其适合CentOS/RHEL 7及以上环境。
Firewalld引入区域(zone)概念,将网络接口与规则集绑定,告别了iptables那套繁琐的链式操作,日常运维中,你只需要通过firewall-cmd命令就能快速开放端口、配置服务,无需重启服务即可生效,对于新手和运维老手来说,它都算得上是一种更贴近现代网络管理需求的方案。
Firewalld防火墙和iptables对比:谁更适合你的场景?
很多人在入门Linux防火墙时,都会纠结该选Firewalld还是iptables,两者底层都依赖Netfilter,但管理方式和设计理念差异明显。
核心区别:动态管理 vs 静态规则
- Firewalld:采用动态规则,修改后无需重启防火墙,直接生效(除非你加了
--permanent参数),规则基于区域,你可以把不同网络接口(如eth0、wlan0)划入不同信任级别,比如把内网接口放入trusted区域,公网接口放入public区域。 - iptables:属于静态规则,每次修改后必须手动保存并重启服务,否则重启后丢失,规则是扁平化的链式处理,所有流量都得按顺序匹配,管理起来不够直观。
应用场景选择
- 如果你的服务器主要跑在CentOS 7/8、RHEL 7+、Fedora这些现代发行版上,行业共识认为Firewalld是默认推荐,因为它能更轻松地处理动态网络环境,比如虚拟机网桥、Docker端口映射。
- 如果你在维护老旧系统(如CentOS 6),或者需要极其精细的NAT/流量整形规则,iptables可能更直接,但绝大多数情况下,Firewalld通过
firewall-cmd也能完成这些工作,只是命令写法略有不同。
表格对比:快速决策
| 对比维度 | Firewalld | iptables |
|---|---|---|
| 管理方式 | 动态规则,即时生效 | 静态规则,需重启 |
| 规则组织 | 基于区域(zone) | 基于链(chain) |
| 命令工具 | firewall-cmd(推荐) | iptables命令行 |
| 学习曲线 | 较低,概念清晰 | 较高,链和表复杂 |
| 适用场景 | 日常服务器管理、容器环境 | 高级网络策略、嵌入系统 |
| 默认支持 | CentOS 7+、RHEL 7+、Fedora | 所有Linux发行版 |
如果你的场景是CentOS Firewalld防火墙设置,直接上手Firewalld即可,现代文档和社区支持都更丰富。
Firewalld防火墙配置实战:从安装到放行端口
这部分聚焦Firewalld防火墙配置的具体操作,以CentOS 7/8为例,展示如何快速上手。
安装与基础状态检查
- 确认Firewalld是否安装:
rpm -qa | grep firewalld,如果未安装,执行yum install firewalld(CentOS 7)或dnf install firewalld(CentOS 8)。 - 启动并设置开机自启:
systemctl start firewalld systemctl enable firewalld
- 查看当前状态:
firewall-cmd --state,输出running表示正常。
开放端口与运行时规则
常见需求是开放某个TCP端口,比如Web服务的80端口:
- 临时开放(仅当前会话有效,重启防火墙后失效):
firewall-cmd --add-port=80/tcp
- 永久开放(需要重载防火墙):
firewall-cmd --add-port=80/tcp --permanent firewall-cmd --reload
- 验证端口是否已加入规则:
firewall-cmd --list-ports,会看到类似80/tcp的输出。
使用服务名替代端口号
Firewalld内置了常见服务的定义,比如http、https、ssh,直接使用服务名更简洁:
- 开放http服务:
firewall-cmd --add-service=http --permanent -
查看所有可用服务:
firewall-cmd --get-services,列表很长,涵盖大部分标准服务。
区域管理:让规则更精细
查看默认区域:
firewall-cmd --get-default-zone,通常是public。-
将网络接口绑定到指定区域(比如内网卡eth0绑定到trusted):
firewall-cmd --zone=trusted --add-interface=eth0 --permanent firewall-cmd --reload
trusted区域默认允许所有流量,适合内网。public区域则只允许少量服务,适合公网。 -
查询某个接口的当前区域:
firewall-cmd --get-zone-of-interface=eth0
Firewalld防火墙规则管理进阶:复杂策略与端口转发
掌握了基础开放端口后,你可能需要配置更复杂的场景,比如端口转发、富规则(rich-rule)以及限制特定IP。
端口转发:将本地端口映射到其他端口或主机
- 将本机80端口转发到8080端口(假设本地有服务在8080监听):
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent firewall-cmd --reload
- 转发到其他主机(比如192.168.1.100的8080端口):
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100:toport=8080 --permanent
注意:端口转发需要开启IP转发,执行
sysctl -w net.ipv4.ip_forward=1并写入/etc/sysctl.conf。
富规则:灵活控制来源IP和连接数
富规则语法更接近iptables,但受Firewalld管理,只允许192.168.1.0/24网段访问SSH:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --permanent
限制某个IP的并发连接数(防止滥用):
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.1" limit value="10/m" accept' --permanent
规则备份与恢复
- 导出当前规则:
firewall-cmd --direct --get-all-rules(直接规则)或直接备份/etc/firewalld/目录。 - 恢复时,覆盖
/etc/firewalld/目录并执行firewall-cmd --reload或重启服务。
Firewalld防火墙常见问题解答
Firewalld开放端口后不生效,可能是什么原因?
- 检查是否忘了加
--permanent参数,导致规则只在运行时生效,重启后丢失。 - 确认端口协议是否正确(tcp/udp常见错误)。
- 查看防火墙是否运行在
panic模式(firewall-cmd --query-panic),如果开启会阻断所有流量,用firewall-cmd --panic-off关闭。 - 检查是否被其他规则(如输入链的REJECT)覆盖,使用
firewall-cmd --list-all查看区域完整规则集。
Firewalld和iptables可以共存吗?
两者底层都是Netfilter,但管理工具会冲突,如果Firewalld正在运行,它接管了iptables规则,直接使用iptables命令添加的规则会在Firewalld重载时被覆盖,官方建议二选一:要么停用Firewalld,使用iptables服务;要么坚持用firewall-cmd管理,不要混用。业内专家指出,混用会导致规则混乱,排查困难,绝大多数场景下只需使用Firewalld即可。
如何查看Firewalld当前区域的所有规则?
使用firewall-cmd --list-all --zone=public(public可替换为具体区域),输出会显示该区域下绑定的接口、允许的服务、端口、富规则、masquerade状态等,如果想查看所有区域的规则,可以遍历firewall-cmd --get-zones然后逐个查询。
Firewalld防火墙的设计初衷是让网络管理变得更直观、更动态,降低运维复杂度,从基础开放端口到高级的端口转发和富规则,它都能胜任,如果你正在使用CentOS或RHEL系列,Firewalld就是默认且最值得信赖的选择,花半小时把常用命令跑一遍,后续维护会轻松很多。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/515083.html



