CentOS 7默认采用firewalld作为网络防火墙管理工具,其核心配置文件位于/etc/firewalld/目录,主要包括主配置文件firewalld.conf及zones子目录下的区域策略文件(如public.xml),管理上可通过firewall-cmd命令实现动态配置,支持实时生效与持久化规则,如开放端口(--add-port)、服务(--add-service)及自定义策略,实战中需结合安全需求调整区域信任级别,例如将Web服务(80/443端口)加入public区域,并通过--reload应用变更,确保系统访问安全可控。
CentOS 7作为企业级Linux发行版的代表,其网络防火墙默认采用firewalld而非传统的iptables。firewalld支持动态管理、区域(Zone)策略和丰富的服务定义,核心配置文件位于/etc/firewalld/目录下,本文将详细解析CentOS 7防火墙配置文件的位置、结构、常用操作及实战案例,帮助读者掌握防火墙的底层配置逻辑。
CentOS 7防火墙配置文件概述
firewalld是动态防火墙管理工具,采用“区域”划分网络信任级别,每个区域对应一套规则集(如开放端口、允许服务等),其配置文件分为两类:
- 主配置文件:定义防火墙的全局行为(如运行模式、日志级别);
- 区域/服务配置文件:具体区域的规则定义(如开放端口、允许的服务)。
1 核心配置文件位置
firewalld的所有配置文件均位于/etc/firewalld/目录下,主要文件及作用如下:

| 文件/目录 | 作用说明 |
|---|---|
/etc/firewalld/firewalld.conf |
防火墙主配置文件,定义全局参数(如运行模式、默认区域、日志级别) |
/etc/firewalld/zones/ |
区域配置文件目录,存放各区域的规则定义(如public.xml、dmz.xml) |
/etc/firewalld/services/ |
服务配置文件目录,存放预定义服务的规则(如http.xml、ssh.xml) |
/etc/firewalld/policies/ |
策略配置文件目录,用于管理区域间的默认策略 |
/usr/lib/firewalld/ |
系统默认配置文件目录(不建议修改,修改后可能被覆盖) |
2 区域(Zone)与服务(Service)概念
-
区域:根据网络环境划分的信任级别,默认区域为
public(公共网络),常用区域包括:trusted:信任所有流量(完全开放);public:公共网络(仅开放必要服务);dmz:隔离区(仅允许特定访问);drop:丢弃所有流量(最高安全级别)。
-
服务:预定义的端口与协议组合(如
http对应80端口/TCP,https对应443端口/TCP),服务定义在/etc/firewalld/services/或/usr/lib/firewalld/services/中,以.xml文件形式存储。
主要配置文件解析
1 主配置文件:/etc/firewalld/firewalld.conf
该文件控制防火墙的全局行为,核心参数如下:
[Firewall] DefaultZone=public # 默认区域(默认为public) IPv6Filtering=yes # 是否启用IPv6过滤(默认启用) CleanupOnExit=yes # 退出时清理临时规则(默认启用) Lockdown=no # 是否启用锁定模式(锁定后禁止修改规则) LogLevel=INFO # 日志级别(OFF/NOTICE/WARNING/ERR/INFO/DEBUG)
示例:若需修改默认区域为trusted,编辑DefaultZone=trusted并重启防火墙(或使用firewall-cmd --set-default-zone=trusted)。
2 区域配置文件:/etc/firewalld/zones/
区域配置文件以.xml命名,如public.xml(公共区域)、home.xml(家庭网络区域),文件结构包含区域属性和服务/端口规则。
示例:/etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks but may allow selected incoming connections.</description> <service name="ssh"/> <!-- 允许SSH服务(默认开放) --> <service name="dhcpv6-client"/> <!-- 允许DHCPv6客户端 --> <port protocol="tcp" port="8080"/> <!-- 开放8080端口/TCP --> <icmp-block name="source-quench"/> <!-- 禁止source-quench ICMP报文 --> </zone>
核心标签说明:
<short>:区域简称(如Public);<description>:区域描述;<service name="xxx"/>:允许预定义服务(如ssh、http);<port protocol="tcp/udp" port="xxx"/>:开放指定端口(如8080/tcp);<icmp-block name="xxx"/>:禁止指定ICMP类型(如source-quench);<masquerade>:启用IP地址伪装(NAT)。
3 服务配置文件:/etc/firewalld/services/
服务定义了端口号、协议及可选的源地址限制。http.xml(HTTP服务)定义如下:
<?xml version="1.0" encoding="utf-8"?> <service> <short>HTTP</short> <description>HyperText Transfer Protocol (HTTP)</description> <port protocol="tcp" port="80"/> </service>
自定义服务:若需定义新服务(如myapp监听9090/tcp),可:
- 在
/etc/firewalld/services/下创建myapp.xml同上,修改port和short); - 使用
firewall-cmd --reload加载新服务。
常用配置操作(文件与命令结合)
1 查看当前配置
- 查看默认区域:
firewall-cmd --get-default-zone - 查看所有区域:
firewall-cmd --get-active-zones - 查看区域规则:
firewall-cmd --zone=public --list-all - 查看服务定义:
cat /etc/firewalld/services/http.xml
2 修改区域配置(文件方式)
以public区域为例,开放8080/tcp端口并允许myapp服务:
-
编辑
/etc/firewalld/zones/public.xml,添加以下内容:<service name="myapp"/> <port protocol="tcp" port="8080"/>
-
重新加载防火墙使配置生效:
firewall-cmd --reload
3 修改区域配置(命令方式)
若需临时开放8080/tcp(不持久化):
firewall-cmd --zone=public --add-port=8080/tcp
若需永久开放8080/tcp(重启后生效):
firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload
4 端口转发配置
假设将80端口转发至8080(需启用IP伪装):
-
编辑
/etc/firewalld/zones/public.xml,添加<masquerade/>:<masquerade/>
-
使用命令添加转发规则:
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent firewall-cmd --reload
实战案例:配置Web服务器防火墙规则
场景需求
- 允许HTTP(80端口)和HTTPS(443端口)访问;
- 允许SSH(22端口)远程管理;
- 禁用其他所有端口;
- 仅允许IP
168.1.100访问SSH服务。
操作步骤
-
确认默认区域为
public:firewall-cmd --get-default-zone
-
开放HTTP和HTTPS服务:
firewall-cmd --zone=public --add-service=http --permanent firewall-cmd --zone=public --add-service=https --permanent
-
开放SSH服务并限制IP:
- 方法1:通过富规则(Rich Rule)限制IP
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' --permanent
- 方法2:直接修改区域配置文件
编辑/etc/firewalld/zones/public.xml,添加:<rule family="ipv4"> <source address="192.168.1.100"/> <service name="ssh"/> <accept/> </rule>
- 方法1:通过富规则(Rich Rule)限制IP
-
禁用其他服务(可选):
firewall-cmd --zone=public --set-target=DROP --permanent
-
重新加载防火墙:
firewall-cmd --reload
-
验证规则:
firewall-cmd --zone=public --list-all
输出应包含:
services: http https ssh、rich rules: rule family="ipv4" source address="192.168.1.100" service name="ssh" accept。
常见问题及解决
1 防火墙启动失败
- 原因:配置文件语法错误(如XML标签未闭合)。
- 解决:检查
/etc/firewalld/zones/下XML文件语法,使用xmllint --noout /etc/firewalld/zones/public.xml验证。
2 端口开放后仍无法访问
- 排查步骤:
- 检查防火墙规则:
firewall-cmd --zone=public --list-ports(确认端口已添加); - 检查服务监听:
netstat -tuln | grep 80(确认服务监听0.0.0.0或特定IP); - 检查SELinux:
getsebool -a | grep httpd_can_network_connect(若为off,需setsebool -P httpd_can_network_connect=1)。
- 检查防火墙规则:
3 配置文件修改不生效
- 原因:未使用
--permanent或未重新加载。 - 解决:修改配置文件后,必须执行
firewall-cmd --reload(临时规则无需--permanent,但重启后失效)。
CentOS 7防火墙(firewalld)的核心配置文件位于/etc/firewalld/,通过区域和服务规则实现精细化的网络访问控制,理解主配置文件、区域配置文件和服务配置文件的结构,结合firewall-cmd命令与文件修改,可以灵活满足不同场景的安全需求,在实际操作中,需注意“临时规则”与“永久规则”的区别,并定期检查规则有效性,确保防火墙策略既安全且高效。


