在CentOS环境中,防火墙配置常常会遇到iptables和firewalld两个名词,它们并不是同一层级的概念。iptables是直接与内核netfilter子系统交互的用户态工具,通过向内核提交规则来过滤、转发或修改数据包。firewalld则是一个动态防火墙管理守护进程,它在iptables或nftables之上构建了更高级的抽象模型,用区域和服务的概念来简化规则管理。因此,把二者简单理解为非此即彼并不准确,它们更像是一个底层实现与上层管理框架的关系。

对于CentOS 7及之后的版本,系统默认使用firewalld作为防火墙管理工具,但iptables服务仍然可以安装并独立运行。弄清楚二者的差异,对于日常端口开放、安全策略调整以及自动化脚本编写都有实际意义。下面从架构、配置方法和动态性三个层面进行深入比较。
核心架构与规则处理方式的差异
iptables的工作方式非常直接:它维护了多个内置规则表,包括filter、nat、mangle、raw等,每个表中又包含若干链,例如INPUT、OUTPUT、FORWARD。管理员通过命令将规则按顺序追加到链中,数据包经过时依次匹配,命中后执行ACCEPT、DROP、REJECT或跳转到其他链。这种模型清晰但偏底层,当规则数量增多时,维护顺序和依赖关系会变得复杂。例如要开放一个端口,需要明确指定协议、目标端口、连接状态以及默认策略。
firewalld则引入了区域(zone)和服务(service)的概念。区域代表不同的信任级别,比如public、internal、home、trusted等,每个区域可以独立配置允许的端口、服务、源地址和接口绑定。服务是对一组端口和协议的封装,比如http服务对应TCP 80端口,ssh服务对应TCP 22端口。管理员只需要将某个服务添加到某个区域即可完成放行,无需手动拼接iptables参数。这种抽象使得配置更加直观,也减少了因规则顺序错误导致的安全漏洞。
从数据包处理流程看,firewalld并不直接在内核中维护规则,而是通过DBus接口接收配置变更,再转换成iptables或nftables的命令下发给内核。这意味着firewalld在运行时可以动态调整规则,而iptables传统方式每次修改都需要重新构建整条链并刷新,或者通过iptables-restore一次性加载。
配置命令与持久化机制对比
使用iptables配置临时规则非常快捷,例如允许来自192.168.1.0/24网段访问SSH服务,可以执行以下命令:
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP
但iptables本身并不保存规则,重启后这些规则会丢失。在CentOS 6及更早版本中,通常需要配合iptables-save和iptables-restore命令,或者将规则写入/etc/sysconfig/iptables配置文件,由服务启动时加载。到了CentOS 7,虽然可以通过systemctl启用iptables服务,但该服务默认也会读取配置文件中的规则,且与firewalld服务存在冲突,不能同时运行。
firewalld的命令风格则以firewall-cmd为主,规则修改后可以立即生效,并支持永久保存。例如开放TCP 8080端口到public区域:
firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload
如果不加--permanent参数,规则只会写入运行时配置,重启或重载后消失;加上--permanent后规则会保存到/etc/firewalld/zones目录下的区域文件中,通过reload重新加载生效。这种运行时与永久配置分离的设计,让防火墙调整更安全,可以随时回滚而不影响磁盘上的持久化规则。
动态管理能力与共存策略
firewalld最大的优势在于动态性。当使用firewall-cmd添加或删除规则时,已经建立的连接通常不会中断,因为它会通过iptables的模块化接口增量更新规则,而不是整表刷新。这一点对于需要长期运行的生产服务器尤为重要,比如在运行过程中临时开放一个调试端口,用完后移除,不需要重启网络服务或中断现有会话。iptables虽然在CentOS 7上也可以通过iptables-restore实现不刷新整个表的部分更新,但操作复杂度明显更高,需要手动维护规则文件并计算链位置。
另外,firewalld支持丰富的直接接口和富规则(rich rules),可以在保持高层抽象的同时实现复杂匹配。例如只允许特定IP在特定时间段访问数据库端口,可以通过富规则完成,而无需退回到底层iptables命令。不过,对于熟悉iptables语法的管理员来说,firewalld的抽象也可能带来一定的学习成本,尤其是在调试时,需要理解区域、服务、接口绑定和源地址之间的优先级关系。
在实际部署中,如果系统已经使用firewalld,建议不要同时启动iptables服务,因为两者都会向内核提交netfilter规则,容易产生冲突。对于必须使用iptables原生规则的场景,可以选择关闭firewalld并启用iptables服务;或者利用firewalld的直接配置功能,在/etc/firewalld/direct.xml中嵌入iptables规则,由firewalld统一管理。对于新部署的CentOS服务器,除非有明确的兼容性需求,否则推荐使用firewalld,以获得更友好的配置体验和更可靠的动态管理能力。