CentOS中firewalld该如何正确使用以完成能力验证?

代码编程 2025-08-24 862

引言:为什么需要firewalld?

最近帮朋友维护一台CentOS 7的服务器,发现他之前用iptables管理防火墙,结果配置文件写得乱七八糟,每次修改规则都要重启服务,还容易出错,后来我给他推荐了firewalld,结果他直呼“早该用这玩意儿了!”——确实,对于现代Linux系统来说,firewalld比传统iptables更灵活、更易用,尤其适合需要动态调整防火墙规则的场景,今天咱们就聊聊CentOS下firewalld的实战用法,从基础到进阶,保证你看完能上手操作。


firewalld是什么?和iptables有啥区别?

先简单科普下:firewalld是CentOS 7及之后版本默认的防火墙管理工具,它基于“区域(zone)”的概念来管理网络流量,每个区域可以定义不同的信任级别和规则,比如public区域默认只允许SSH和DHCP,而trusted区域则完全放行。

CentOS firewalld使用-能力验证-能力验证

和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装上。

启动与停止

CentOS 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终端,按照步骤操作一遍,防火墙是服务器的第一道防线,配置错误可能导致服务不可用或被攻击,所以一定要谨慎测试,如果遇到问题,可以留言讨论,咱们一起解决!

CentOS中iptables规则该如何配置?
« 上一篇 2025-08-23
如何正确配置CentOS中的nftables?
下一篇 » 2025-08-24

文章评论