CentOS中firewalld该如何正确使用以完成能力验证?
引言:为什么需要firewalld?
最近帮朋友维护一台CentOS 7的服务器,发现他之前用iptables管理防火墙,结果配置文件写得乱七八糟,每次修改规则都要重启服务,还容易出错,后来我给他推荐了firewalld,结果他直呼“早该用这玩意儿了!”——确实,对于现代Linux系统来说,firewalld比传统iptables更灵活、更易用,尤其适合需要动态调整防火墙规则的场景,今天咱们就聊聊CentOS下firewalld的实战用法,从基础到进阶,保证你看完能上手操作。
firewalld是什么?和iptables有啥区别?
先简单科普下:firewalld是CentOS 7及之后版本默认的防火墙管理工具,它基于“区域(zone)”的概念来管理网络流量,每个区域可以定义不同的信任级别和规则,比如public区域默认只允许SSH和DHCP,而trusted区域则完全放行。

和iptables的区别:
- 动态管理:firewalld可以直接修改规则而无需重启服务(iptables需要
service iptables restart
)。 - 区域概念:通过区域隔离不同网络环境(比如内网、外网、DMZ),规则更清晰。
- 服务支持:内置常见服务(如HTTP、MySQL)的预定义规则,不用手动写端口。
举个例子:之前用iptables开放80端口,得写-A INPUT -p tcp --dport 80 -j ACCEPT
,还得注意规则顺序;用firewalld直接firewall-cmd --add-service=http
就搞定,简单多了。
firewalld基础操作:安装、启动、状态查看
检查是否安装
CentOS 7/8默认已安装,但如果不确定,可以运行:
rpm -q firewalld
如果没安装,用yum install firewalld
装上。
启动与停止

systemctl start firewalld # 启动 systemctl stop firewalld # 停止 systemctl enable firewalld # 开机自启 systemctl disable firewalld # 取消自启
查看状态
firewall-cmd --state # 显示running/not running systemctl status firewalld # 更详细的状态信息
查看当前规则
firewall-cmd --list-all # 显示所有区域和规则 firewall-cmd --list-services # 显示已开放的服务 firewall-cmd --list-ports # 显示已开放的端口
核心操作:管理区域和服务
理解区域(Zone)
firewalld有9个预定义区域,常用的是:
- public:默认区域,用于不可信的公共网络(只允许SSH和DHCP)。
- trusted:完全信任的网络(所有流量放行)。
- internal:内部网络(允许更多服务)。
- dmz:非军事区(仅允许特定服务)。
查看所有区域:
firewall-cmd --get-zones
修改默认区域
默认区域是public,如果想改成internal:
firewall-cmd --set-default-zone=internal
添加/删除服务
服务是预定义的规则集合(比如http对应80端口,mysql对应3306)。
开放HTTP服务:
firewall-cmd --add-service=http # 临时生效(重启后失效) firewall-cmd --permanent --add-service=http # 永久生效 firewall-cmd --reload # 重新加载配置
删除服务:
firewall-cmd --remove-service=http firewall-cmd --permanent --remove-service=http firewall-cmd --reload
自定义端口
如果服务不在预定义列表里(比如自定义的8080端口),可以直接开放端口:
firewall-cmd --add-port=8080/tcp # 临时 firewall-cmd --permanent --add-port=8080/tcp # 永久 firewall-cmd --reload
删除端口:
firewall-cmd --remove-port=8080/tcp
进阶操作:富规则(Rich Rules)
有时候需要更精细的控制,比如只允许某个IP访问SSH,这时候可以用富规则。
示例1:允许192.168.1.100访问SSH
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept'
示例2:拒绝其他IP访问SSH
firewall-cmd --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port protocol="tcp" port="22" reject'
永久生效:加上--permanent
后记得firewall-cmd --reload
。
实战案例:搭建Web服务器防火墙
假设你要在一台CentOS服务器上跑Nginx,需要开放80和443端口,同时限制SSH只能从内网访问。
步骤1:开放Web服务
firewall-cmd --permanent --add-service={http,https}
步骤2:限制SSH访问
先删除默认的SSH规则(如果存在):
firewall-cmd --permanent --remove-service=ssh
然后添加富规则,只允许内网IP(比如192.168.1.0/24):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port protocol="tcp" port="22" reject'
步骤3:重新加载配置
firewall-cmd --reload
验证:
- 用
curl http://你的IP
测试Web服务是否可访问。 - 从外网尝试SSH连接,应该被拒绝;从内网可以连接。
常见问题与排错
修改后不生效?
- 检查是否加了
--permanent
(临时规则重启后失效)。 - 运行
firewall-cmd --reload
重新加载。 - 用
firewall-cmd --list-all
确认规则是否已添加。
端口冲突怎么办?
比如同时开放了80端口的服务和80/tcp端口,firewalld会按顺序匹配规则,如果冲突,建议用服务名(如http)而不是直接写端口。
如何备份规则?
firewall-cmd --list-all > firewall_rules.txt
恢复时手动添加或写脚本。
firewalld的优缺点
优点:
- 动态管理,无需重启。
- 区域概念清晰,适合多网络环境。
- 服务预定义,减少手动配置错误。
缺点:
- 富规则语法稍复杂,需要学习。
- 旧版系统(如CentOS 6)不支持,需用iptables。
适用场景:
- 需要频繁修改防火墙规则的服务器。
- 多网络环境(如同时连接内网、外网、DMZ)。
- 初学者或不想深入学习iptables的用户。
动手试试吧!
看完这篇文章,你是不是已经跃跃欲试了?赶紧打开你的CentOS终端,按照步骤操作一遍,防火墙是服务器的第一道防线,配置错误可能导致服务不可用或被攻击,所以一定要谨慎测试,如果遇到问题,可以留言讨论,咱们一起解决!
文章评论