从 CentOS 7 开始,Firewalld 已经取代 iptables 成为默认的防火墙管理服务。与 iptables 相比,Firewalld 的规则变更不需要清空旧规则再整体重载,而是支持动态更新策略。同时它还引入了网络防火墙中 区域(zone)的概念,你可以根据家庭、公共、受信任等不同场景快速切换合适的策略。
Firewalld 服务的主配置文件是 firewalld.conf,策略配置文件以 XML 格式为主,分布在两个目录:/etc/firewalld 存放用户配置,/usr/lib/firewalld 存放系统预定义配置。
[root@yyzcdb81 firewalld]# pwd
/etc/firewalld
[root@yyzcdb81 firewalld]# ll
总用量 8
-rw-r--r--. 1 root root 2706 10月 1 2020 firewalld.conf
drwxr-x---. 2 root root 6 10月 1 2020 helpers
drwxr-x---. 2 root root 6 10月 1 2020 icmptypes
drwxr-x---. 2 root root 6 10月 1 2020 ipsets
-rw-r--r--. 1 root root 272 10月 1 2020 lockdown-whitelist.xml
drwxr-x---. 2 root root 6 10月 1 2020 services
drwxr-x---. 2 root root 46 10月 14 2025 zones
[root@yyzcdb81 firewalld]#
# ---- 上方为用户配置目录,下方为系统预置目录 ----
[root@yyzcdb81 firewalld]# pwd
/usr/lib/firewalld
[root@yyzcdb81 firewalld]# ll
总用量 16
drwxr-xr-x. 2 root root 224 10月 14 2025 helpers
drwxr-xr-x. 2 root root 4096 10月 14 2025 icmptypes
drwxr-xr-x. 2 root root 20 10月 14 2025 ipsets
drwxr-xr-x. 2 root root 8192 10月 14 2025 services
drwxr-xr-x. 2 root root 163 10月 14 2025 zones
[root@yyzcdb81 firewalld]#
1. Firewalld 防火墙基本概念
区域的概念
“区域”是针对给定位置或场景(如家庭、公共、受信任区域等)预设的信任级别规则集。不同区域允许不同的网络服务和入站流量类型,同时拒绝其他流量。Firewalld 预先准备了几种常用区域,默认使用 public 区域。
| 网络区域名称 |
默认配置 |
| trusted(信任区域) |
可以接收所有的网络连接 |
| home(家庭区域) |
用于家庭网络,仅接收 SSH、MDNS、ipp-client、samba-client 与 dhcpv6-client 服务连接 |
| internal(内部区域) |
同上,用于内部区域 |
| work(工作区域) |
用于工作区域,仅接收 SSH、ipp-client 与 dhcpv6-client 服务连接 |
| public(公共区域) |
用于公共区域,仅接收 SSH 或 dhcpv6-client 服务连接 |
| external(外部区域) |
拒绝进入的流量,除非与出去的流量相关;如果流量与 SSH 服务相关,则允许进入 |
| dmz(非军事区域) |
仅接收 SSH 服务 |
| block(限制) |
拒绝所有网络连接 |
| drop(丢弃) |
任何接收的网络数据包都被丢弃,没有任何回复 |
2. Firewalld 防火墙的使用方法
Firewalld 提供两种管理方式:
图形界面配置在终端执行:
[root@yyzcdb81 firewalld]# firewall-config
即可打开图形配置界面:

下面主要说明命令行配置。命令行配置,使用 firewall-cmd 命令,它的常用参数如下表:
| 参数 |
作用 |
--get-default-zone |
获取默认区域名称 |
--set-default-zone=<区域名称> |
设置默认区域(永久生效) |
--get-zones |
获得所有可用区域名称 |
--get-services |
获得预先定义的服务 |
--get-active-zones |
获得当前正在使用的区域与网卡名称 |
--add-source= |
将源自此 IP 或子网的流量导向指定的区域 |
--remove-source= |
不再将源自此 IP 或子网的流量导向这个区域 |
--add-interface=<网卡名称> |
将源自该网卡的所有流量都导向某个指定区域 |
--change-interface=<网卡名称> |
将某个网卡与区域进行关联 |
--list-all |
显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
--list-all-zones |
显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
--add-service=<服务名> |
设置默认区域允许该服务的流量 |
--add-port=<端口号/协议> |
设置默认区域允许该端口的流量 |
--remove-service=<服务名> |
设置默认区域不再允许该服务的流量 |
--remove-port=<端口号/协议> |
设置默认区域不再允许该端口的流量 |
--reload |
让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
--panic-on |
开启应急状态模式 |
--panic-off |
关闭应急状态模式 |
Firewalld 配置的防火墙策略存在两种模式:运行时(Runtime)模式和永久(Permanent)模式。

具体对比如下:
| 对比维度 |
运行时模式 (Runtime) |
永久模式 (Permanent) |
| 是否为默认模式 |
是(Firewalld 默认) |
否 |
| 命令行标识 |
无特殊参数 |
需添加 --permanent 参数 |
| 生效速度 |
立即生效 |
默认需重启系统;或执行 firewall-cmd --reload 立即生效 |
| 持久性 |
重启系统失效 |
永久有效(保存至配置文件中) |
| 适用场景 |
临时测试、临时调整策略 |
正式配置、需长期保持的规则 |
3. Firewalld 防火墙配置举例
(1)查询当前主机区域
[root@yyzcdb81 ~]# firewall-cmd --get-default-zone
public
[root@yyzcdb81 ~]#
(2)查看当前主机的 ens33 网卡所属区域
[root@yyzcdb81 ~]# firewall-cmd --get-zone-of-interface=ens33
public
[root@yyzcdb81 ~]#
(3)查看 public 区域中是否允许 SSH 和 HTTP 服务
[root@yyzcdb81 ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@yyzcdb81 ~]# firewall-cmd --zone=public --query-service=http
yes
[root@yyzcdb81 ~]#
(4)设置默认区域为 dmz,并重载防火墙
[root@yyzcdb81 ~]# firewall-cmd --set-default-zone=dmz
success
[root@yyzcdb81 ~]# firewall-cmd --reload
success
[root@yyzcdb81 ~]#
(5)端口转发
端口转发功能可以将原本到某端口的数据包转发到其他端口。SSH 服务默认的启动端口是 22,将默认端口转发到该主机的其他端口用于连接,修改服务的默认端口有助于提升服务的安全性。
Firewalld 端口转发语法如下:
firewall-cmd --permanent --zone=区域 --add-forward-port=源端口:proto=协议:toport=目的端口:toaddr=目的ip
比如,将访问主机 172.16.250.81 的 888 端口请求转发到 22 端口,建立 SSH 连接:
[root@yyzcdb81 ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=172.16.250.81
success
[root@yyzcdb81 ~]#
然后重新加载 firewall 生效:
[root@yyzcdb81 ~]# firewall-cmd --reload
success
[root@yyzcdb81 ~]#
(6)允许 HTTPS 服务流量通过 public 区域,要求永久生效
[root@yyzcdb81 ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@yyzcdb81 ~]# firewall-cmd --reload
success
[root@yyzcdb81 ~]#
(7)不允许 HTTP 服务流量通过 public 区域,要求永久生效
[root@yyzcdb81 ~]# firewall-cmd --permanent --zone=public --remove-service=http
success
[root@yyzcdb81 ~]# firewall-cmd --reload
success
[root@yyzcdb81 ~]#
(8)允许 8080 与 8081 端口流量通过 public 区域,要求永久生效
[root@yyzcdb81 ~]# firewall-cmd --permanent --zone=public --add-port=8080-8081/tcp
success
# 接着查看开放的端口
[root@yyzcdb81 ~]# firewall-cmd --permanent --zone=public --list-ports
8080-8081/tcp
[root@yyzcdb81 ~]# firewall-cmd --reload
success
(9)不允许 HTTP 服务流量通过 public 区域,要求立即生效
[root@yyzcdb81 ~]# firewall-cmd --zone=public --remove-service=http
success
[root@yyzcdb81 ~]#
以上就是在 Linux 中管理 Firewalld 防火墙的基础操作。更多 Linux 运维与安全配置实战,可以到 云栈社区 继续交流。