在CentOS 7及其后续版本中,firewalld(Dynamic Firewall Manager)已经取代了传统的iptables服务,成为默认的防火墙管理工具,它引入了“区域”和“服务”的概念,使得防火墙规则的配置更加灵活和动态,对于系统管理员而言,熟练掌握查看firewalld状态的方法是保障服务器安全的第一步,本文将详细介绍多种查看firewalld状态的命令和技巧,帮助您全面了解防火墙的当前配置。

基础状态检查
最直接、最常用的方法是使用firewall-cmd命令本身来查询防火墙的运行状态。
使用 firewall-cmd --state
这是最简洁的命令,用于快速判断firewalld服务是否正在运行。
firewall-cmd --state
执行后,终端会返回两种可能的结果:
running:表示firewalld服务正在运行,防火墙处于活动状态。not running:表示firewalld服务未运行,防火墙当前未生效。
使用 systemctl status firewalld
systemctl是CentOS 7+中用于管理服务的核心工具,通过它查看firewalld的状态,可以获得比firewall-cmd --state更丰富的信息。
systemctl status firewalld
该命令的输出信息非常详尽,主要包括以下几个关键部分:
- Loaded:显示服务单元文件是否已加载,以及是否设置为开机自启(
enabled)或禁用(disabled)。 - Active:明确指出服务当前的状态,如
active (running)(正在运行)、inactive (dead)(未运行)等。 - Main PID:显示主进程的ID。
- Tasks 和 Memory:显示服务占用的任务数量和内存资源。
- CGroup:显示控制组信息。
- 最近的日志:列出服务启动、停止或出现错误时的最新几条日志,这对于故障排查非常有用。
通过systemctl status,您不仅能知道防火墙是否在运行,还能了解其启动配置和最近的运行情况。
深入查看防火墙规则与区域
仅仅知道防火墙是否运行是远远不够的,了解其具体的规则配置,即哪些端口是开放的,哪些服务是被允许的,才是安全管理的核心。
查看当前活动的区域
firewalld使用“区域”来管理不同的信任级别,每个区域可以绑定到不同的网络接口,并应用一套独立的规则集。
firewall-cmd --get-active-zones
此命令会列出所有当前处于活动状态的区域,以及每个区域所关联的网络接口,输出可能如下:
public
interfaces: eth0 eth1
dmz
interfaces: eth2
这表示eth0和eth1网卡应用了public区域的规则,而eth2网卡则应用了dmz区域的规则。

查看默认区域
如果某个网络接口没有被明确分配到任何区域,它将使用默认区域的规则。
firewall-cmd --get-default-zone
默认区域是public。
查看指定区域的详细规则
这是最实用的命令之一,可以全面了解某个特定区域(如public)的所有防火墙规则。
firewall-cmd --zone=public --list-all
如果省略--zone参数,则默认显示默认区域的规则,该命令的输出结构清晰,通常包含以下信息:
| 项目 | 含义 |
|---|---|
| public | 区域名称 |
| target | 区域的默认处理策略(如DEFAULT, REJECT, DROP) |
| icmp-block-inversion | 是否阻止ICMP包 |
| interfaces | 绑定到该区域的网络接口 |
| sources | 允许连接的源地址 |
| services | 允许通过的服务列表(如ssh, dhcpv6-client, http) |
| ports | 允许通过的端口和协议列表(如8080/tcp, 53/udp) |
| protocols | 允许通过的协议(如icmp) |
| forward-ports | 端口转发规则 |
| source-ports | 允许的源端口 |
| icmp-blocks | 被阻止的ICMP类型 |
| rich rules | 更复杂的富语言规则 |
通过这个表格化的输出,您可以一目了然地看到当前区域允许了哪些服务和端口,如果您在services列表中看到了ssh,就意味着SSH服务的默认端口(22)是开放的。
快速查看全局允许的服务和端口
如果您不关心区域,只想快速查看整个防火墙允许了哪些服务和端口,可以使用以下命令:
# 查看所有允许的服务 firewall-cmd --list-services # 查看所有允许的端口 firewall-cmd --list-ports
防火墙服务管理
如果检查后发现firewalld未运行,但您需要启用它,可以通过systemctl进行管理。
-
启动防火墙服务:
sudo systemctl start firewalld
-
设置防火墙开机自启:
sudo systemctl enable firewalld
-
停止防火墙服务:

sudo systemctl stop firewalld
-
禁止防火墙开机自启:
sudo systemctl disable firewalld
在进行任何修改后,特别是添加或移除规则后,建议使用firewall-cmd --reload命令重新加载配置,使更改立即生效,且不会中断现有的连接。
相关问答
Q1:为什么我使用 firewall-cmd --state 显示 not running,但我的服务器仍然可以访问某些端口(例如80端口)?
A1: 这是一个非常常见的情况。firewall-cmd --state显示的not running仅表示操作系统层面的firewalld服务没有运行,您的服务器可能处于一个云环境中(如阿里云、腾讯云、AWS等),这些云服务商通常提供了一层额外的网络安全防护,称为“安全组”,安全组在云平台网络层面工作,独立于服务器内部的防火墙,即使服务器内部的firewalld关闭,只要安全组规则中允许了80端口的入站流量,外部用户依然可以访问,在排查网络连接问题时,需要同时检查firewalld和云平台的安全组设置。
Q2:firewall-cmd 和 iptables 有什么区别?我应该使用哪一个?
A2: iptables是Linux内核中传统的防火墙工具,它直接操作内核的netfilter框架,规则管理相对静态,每次修改都需要重新加载整个规则集,容易导致现有连接中断。firewalld是CentOS 7+引入的更高层级的防火墙管理工具,它作为iptables的前端存在,但提供了更友好的管理方式,其主要优势在于:
- 动态管理:支持动态添加、删除规则,无需重新加载整个防火墙,不会破坏现有连接。
- 区域和服务:引入了区域和服务概念,使得规则配置更符合逻辑,易于管理(将
http服务添加到public区域,而不是手动记忆80端口)。 - D-Bus接口:提供了D-Bus接口,允许其他应用程序或脚本与之交互。
对于CentOS 7及更高版本,强烈建议使用firewalld,它是系统默认的、被广泛支持和推荐的防火墙管理方案,只有在有特殊需求或需要管理旧系统时,才需要直接使用iptables。