firewall-cmd --list-all 才是 firewalld 当前生效的逻辑视图,显示默认 zone 下开放端口、服务、富规则等;iptables -L 无法直观反映真实策略,因 firewalld 规则编译至 INPUT_direct 等自定义链中。

firewalld 的规则不直接暴露 iptables 链式结构,所以不能用 iptables -L 查“真实规则”——你看到的 firewall-cmd --list-all 才是它当前生效的逻辑视图。
怎么查当前生效的完整规则集
运行 firewall-cmd --list-all 就能看到当前默认 zone(通常是 public)下所有开放端口、允许的服务、富规则、伪装、转发等配置。它输出的是 firewalld 管理层的最终效果,不是底层 iptables 命令。
常见误区:有人会执行 iptables -L 想验证端口是否真开了,但 firewalld 动态生成的 iptables 规则藏在 INPUT_direct、FWDI_public 等自定义链里,肉眼难读。除非调试或排查冲突,否则没必要看。
- 想确认某个端口是否被放行:
firewall-cmd --query-port=80/tcp(返回yes或no) - 想查特定 zone(比如
trusted):firewall-cmd --zone=trusted --list-all - 想查所有活跃 zone 及其绑定接口:
firewall-cmd --get-active-zones
为什么 iptables -L 显示的和 firewall-cmd 不一致
firewalld 是 iptables 的封装层,它把用户操作翻译成一堆带前缀的自定义链(如 IN_public、PRE_public),再通过 iptables -t filter -S 才能看到原始规则。这些规则顺序、跳转逻辑复杂,且每次 --reload 都可能重排。
典型表现:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
-
firewall-cmd --add-port=22/tcp后,iptables -L INPUT里看不到新规则,但它实际在INPUT_direct链里 - 启用
masquerade后,NAT 表规则出现在POSTROUTING_ZONES,不在iptables -t nat -L POSTROUTING顶层 - rich rule 被编译为多条 iptables 条目,含
-m iprange、-m state等扩展匹配,人工还原成本高
需要导出或审计规则时该看哪个文件
firewalld 的持久化配置存在 XML 文件中,不是文本规则列表。真正起作用的是:
-
/etc/firewalld/zones/public.xml(对应 public zone 的端口/服务/富规则) -
/etc/firewalld/firewalld.conf(全局开关,如DefaultZone、Lockdown) -
/usr/lib/firewalld/services/下的预定义服务(如ssh.xml)
注意:修改 XML 后必须执行 firewall-cmd --reload 才生效;直接改文件不等于规则已加载。临时规则(没加 --permanent)不会写入任何文件,重启即丢。
排查连接不通时优先检查什么
别一上来就翻 iptables,先确认三层逻辑是否成立:
- 服务是否运行:
systemctl status firewalld(确保是active (running)) - 目标端口是否在
--list-all输出里明确列出(注意 protocol 是tcp还是udp) - 客户端 IP 是否命中某条 rich rule 的
source address限制 - 接口是否绑对了 zone:
firewall-cmd --get-zone-of-interface=eth0,避免规则在public而网卡实际属于internal
firewalld 的 zone 绑定和规则层级容易被忽略,比单条端口开关更影响结果。

















