firewall-cmd --list-ports仅显示通过firewall-cmd在public zone中永久添加(--permanent)并重载(--reload)的tcp/udp端口规则,不包含服务、富规则、直接规则或临时规则,且默认不显示非public zone端口。

firewall-cmd --list-ports 能看到哪些端口
这条命令只显示通过 firewall-cmd 添加的、且已执行 firewall-cmd --reload 的 TCP/UDP 端口规则,不包括服务(如 http)、富规则(rich rules)或直接链(direct rules)里的端口。
常见误区是以为它能列出所有监听端口——其实它只反映 firewalld 的“端口白名单”配置,和 netstat -lnpt 或 ss -tuln 显示的实际监听状态无关。
- 必须加
--permanent才会被--list-ports持久显示;临时添加(没加--permanent)的端口重启防火墙后就消失,也不会出现在该列表里 - 如果用了
--zone=work等非默认 zone,--list-ports默认查的是publiczone,得显式写成firewall-cmd --zone=work --list-ports - UDP 端口要写成
53/udp,不能漏掉协议类型,否则查不到
为什么 firewall-cmd --query-port=8080/tcp 返回 no 却能访问
说明端口在 firewalld 层面没放行,但实际能通,通常有三种可能:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
- 防火墙根本没开:
firewall-cmd --state返回not running,此时系统走的是内核默认策略(通常是 ACCEPT) - 用了
iptables直接规则(比如通过iptables -I INPUT -p tcp --dport 8080 -j ACCEPT),绕过了 firewalld 管理 - 服务监听在
127.0.0.1而不是0.0.0.0,外部根本连不上——这时--query-port是 no,但本地 curl 又能通,容易误判
netstat 和 ss 查到的监听端口 ≠ 防火墙放行端口
netstat -tuln 或 ss -tuln 显示的是进程正在监听的地址+端口,属于“服务侧”状态;而 firewalld 控制的是“网络入口侧”的过滤逻辑。两者完全独立。
- 即使
ss -tuln | grep :8080有输出,如果 firewalld 没放行,外网依然连不上 - 反过来,firewalld 放行了
9000/tcp,但没人监听这个端口,外网连接会直接被拒绝(Connection refused),不是 timeout - 查监听时建议用
ss -tuln(更轻量),若提示 command not found,装yum install -y iproute;netstat需要net-tools
firewall-cmd --list-all 输出太多,怎么快速定位端口
firewall-cmd --list-all 会打印 zone、service、port、rich rule 全部内容,容易淹没关键信息。真正要看端口,优先用:
-
firewall-cmd --list-ports—— 最简洁,只列port/protocol对 -
firewall-cmd --list-services—— 查预定义服务(如ssh、http),它们内部也映射端口 - 想确认某端口是否在生效规则里:
firewall-cmd --query-port=2888/tcp,返回yes或no,无歧义
注意:所有 --permanent 操作后,必须 firewall-cmd --reload 才真正生效,这点最容易漏。










