在CentOS 7/8/Stream以及Fedora等主流Linux发行版中,管理防火墙是系统管理员的核心任务之一。许多用户习惯使用systemctl命令来启动或停止firewalld服务,并通过firewall-cmd --state来检查其运行状态。然而,一个至关重要的细节常被忽视:当配置永久性防火墙规则时,必须遵循“先添加--permanent参数,后执行--reload重载”的正确流程。同时,务必确认服务器的网络接口(网卡)已被正确分配到相应的防火墙区域(zone),否则精心配置的规则可能完全无法生效,导致服务无法访问。

firewalld 服务的启动、停止与状态深度检查
在CentOS 7及后续版本中,firewalld作为默认的动态防火墙管理器,采用了运行时配置与永久配置分离的双层架构。这意味着,简单地执行systemctl stop firewalld只会清除当前内存中的规则并停止服务进程,而存储在/etc/firewalld/目录下的配置文件则保持不变。若未禁用其开机自启,系统重启后,服务将自动恢复并加载原有的配置。
- 要准确判断防火墙是否真正在工作,关键在于执行
firewall-cmd --state并确认其返回结果为running。仅依赖systemctl status firewalld显示“active (running)”是不够的,因为可能出现规则集为空或区域绑定错误的情况。 - 在关闭
firewalld服务前,必须评估是否有其他安全应用(如fail2ban入侵防御系统)依赖其功能。这些工具通常通过firewalld的机制来动态封禁IP,贸然停止服务可能导致安全防护失效。 - 如需永久禁用
firewalld,必须执行两个步骤:首先systemctl stop firewalld停止当前服务,然后systemctl disable firewalld移除开机启动项。遗漏第二步将导致防火墙在下次重启后自动激活。
切换至 iptables 防火墙的详细步骤与注意事项
部分用户出于习惯或兼容性考虑,希望将系统防火墙切换回传统的iptables。需要注意的是,在CentOS 7/8等新版本中,通过yum安装的iptables-services包实际上是一个兼容层,其底层默认调用的是nftables框架(除非显式切换至iptables-legacy)。因此,在启用iptables服务前,务必确保firewalld已完全停止并禁用,否则两者冲突可能导致规则混乱,出现iptables -L显示为空而防火墙功能异常的局面。
- 正确的安装命令是
yum install -y iptables-services,它包含了必要的Systemd服务单元。仅安装iptables包无法实现服务管理。 - 安装后,启用服务并设置开机启动的命令是
systemctl enable iptables。仅使用iptables-save命令将规则写入/etc/sysconfig/iptables文件,并不会自动在启动时加载。 - 通过命令行临时添加的规则(例如
iptables -I INPUT -p tcp --dport 22 -j ACCEPT开放SSH端口),在重启后会丢失。必须执行service iptables save或iptables-save > /etc/sysconfig/iptables来永久保存。
firewall-cmd 开放端口的正确顺序:--permanent 与 --reload 解析
使用firewall-cmd配置端口时,理解--permanent和--reload的作用与顺序是避免配置失效的关键。--permanent参数仅将规则写入磁盘的配置文件,不影响当前运行的防火墙策略;而--reload命令的作用,正是将磁盘上的永久配置加载到运行时的内核空间中。顺序错误是导致“规则已添加但端口仍无法访问”的常见原因。
- 标准操作流程应为:首先执行
firewall-cmd --permanent --add-port=80/tcp,然后执行firewall-cmd --reload使配置立即生效。 - 一个典型的错误操作是先执行
--reload,再添加规则。这样添加的规则仅存在于内存中,一旦再次重载或服务重启便会消失。 firewall-cmd --query-port=80/tcp命令查询的是运行时状态,而非磁盘配置。因此,即使它返回“no”,也不代表你没有将该端口的规则写入永久配置文件。- 在脚本中批量开放多个端口时,建议对所有操作统一使用
--permanent参数,待所有规则添加完毕后,再执行一次--reload,以减少频繁重载对系统性能的影响。
iptables 与 firewalld 共存的风险与冲突排查
iptables与firewalld本质上都是Netfilter防火墙的用户态管理工具,不应同时用于管理同一套规则表。firewalld默认使用nftables作为其后端,而新系统中的iptables命令通常是iptables-nft的符号链接。如果同时启用两者,或混用iptables-legacy与firewalld,极易造成规则互相覆盖、查询结果矛盾,甚至引发网络中断。
- 检查当前系统使用的底层驱动:执行
ls /proc/sys/net/netfilter/,若有文件列表输出,则表明nftables正在被使用;执行iptables -V,若输出信息包含“nf_tables”,则确认其运行在nft后端之上。 - 若因特殊需求必须混用,需明确指定命令路径,例如使用
/usr/sbin/iptables-legacy -L与/usr/sbin/iptables-nft -L进行区分。但强烈不建议在生产环境中如此操作。 - 在生产环境切换防火墙方案前,务必在测试环境中充分验证。除了检查命令输出,更应使用
ss -tlnp或netstat -tlnp结合实际的telnet或nc命令测试端口连通性。
在实际运维中,另一个极易被忽略的要点是firewalld的区域(zone)绑定。即使你正确执行了firewall-cmd --add-port=80/tcp,如果服务器的网络接口(如eth0)未被分配到正确的zone(例如默认的public区域),或者被误分配到了drop(丢弃)区域,所有流量仍将被阻止。你可以使用firewall-cmd --get-active-zones查看活跃区域,并通过firewall-cmd --zone=public --change-interface=eth0 --permanent后重载服务来修改接口的区域归属,确保防火墙策略能应用到正确的网络路径上。
