RHEL 7默认采用firewalld作为防火墙管理工具,支持动态规则配置,替代了传统iptables,核心功能包括区域管理(如public、trusted等,决定网络信任级别)、服务与端口控制(通过firewall-cmd命令添加/删除http、https等服务或自定义端口),以及持久化设置(--permanent参数确保重启后规则生效),常用命令涵盖启动/停止服务(systemctl start/stop firewalld)、查看状态(firewall-cmd --state)、重新加载规则(firewall-cmd --reload)等,其动态管理特性可实时调整策略,兼顾安全性与灵活性,适用于企业级服务器环境的安全防护。
RHEL 7防火墙基础概述
在RHEL 7及后续版本中,默认的防火墙管理工具从传统的iptables升级为firewalld。firewalld采用动态管理方式,支持运行时规则修改和区域(Zone)策略隔离,能够更灵活地应对复杂的网络环境,它通过netfilter内核框架实现包过滤,同时提供了丰富的命令行和图形化配置接口,适合企业级服务器和桌面环境的网络安全管理。
firewalld核心概念
在配置前,需先理解firewalld的几个核心概念:
区域(Zone)
区域是firewalld的网络策略集合,根据网络信任程度划分,每个区域定义了一组允许/拒绝的服务、端口和规则,RHEL 7预定义了以下区域:

public:默认区域,适用于公共网络(如互联网),仅允许必要的服务(如SSH)。trusted:完全信任区域,允许所有流量。block:拒绝所有 incoming 流量, outgoing 流量允许。drop:丢弃所有流量(无任何响应)。dmz:隔离区域,用于部署对外服务(如Web服务器),限制内部访问。home/internal:家庭/内部网络区域,信任程度较高,允许常见服务(如Samba)。work:工作区域,适用于办公环境,限制部分服务。
服务(Service)
服务是预定义的端口和协议组合(如http对应80端口/TCP,ssh对应22端口/TCP),用户可直接通过服务名称管理规则,无需记忆端口。
富规则(Rich Rule)
富规则是更精细的规则,支持基于源地址、目标端口、协议、动作(允许/拒绝)等条件的高级过滤,可实现复杂场景的访问控制。
运行时与永久配置
firewalld的配置分为“运行时”(runtime)和“永久”(permanent)两种模式:
- 运行时配置:立即生效,但重启后失效,适合临时测试。
- 永久配置:需重载或重启firewalld生效,适合生产环境。
firewalld安装与启动
检查是否已安装
rpm -q firewalld
若未安装,使用yum安装:
yum install firewalld -y
启动并启用firewalld
# 启动服务 systemctl start firewalld # 设置开机自启 systemctl enable firewalld # 查看服务状态 systemctl status firewalld
关闭或禁用firewalld(不推荐生产环境)
# 停止服务 systemctl stop firewalld # 禁用开机自启 systemctl disable firewalld
防火墙区域管理
查看当前区域
# 查看默认区域 firewall-cmd --get-default-zone # 查看活跃区域(已绑定接口的区域) firewall-cmd --get-active-zones
修改默认区域
# 设置默认区域为public(常用) firewall-cmd --set-default-zone=public # 验证 firewall-cmd --get-default-zone
将接口绑定到指定区域
若服务器有多个网卡(如eth0连接外网,eth1连接内网),可将其绑定到不同区域:
# 将eth0绑定到public区域(永久生效) firewall-cmd --zone=public --add-interface=eth0 --permanent # 将eth1绑定到internal区域 firewall-cmd --zone=internal --add-interface=eth1 --permanent # 重载配置使永久生效 firewall-cmd --reload # 验证接口绑定 firewall-cmd --get-active-zones
服务管理
查看预定义服务
# 列出所有预定义服务 firewall-cmd --get-services # 查看public区域当前允许的服务 firewall-cmd --zone=public --list-services
添加/移除服务
# 临时添加http服务(立即生效,重启失效) firewall-cmd --zone=public --add-service=http # 永久添加https服务(需重载生效) firewall-cmd --zone=public --add-service=https --permanent # 重载配置(永久规则生效) firewall-cmd --reload # 移除服务(示例:永久移除ssh) firewall-cmd --zone=public --remove-service=ssh --permanent firewall-cmd --reload # 验证服务列表 firewall-cmd --zone=public --list-services
端口与协议管理
若需开放未预定义的端口(如自定义应用的8080端口),可直接操作端口:
添加端口
# 临时开放TCP 8080端口 firewall-cmd --zone=public --add-port=8080/tcp # 永久开放UDP 53端口(DNS) firewall-cmd --zone=public --add-port=53/udp --permanent firewall-cmd --reload
查看端口
# 查看public区域开放的端口 firewall-cmd --zone=public --list-ports
移除端口
# 永久移除8080端口 firewall-cmd --zone=public --remove-port=8080/tcp --permanent firewall-cmd --reload
富规则配置
富规则可实现更精细的控制,仅允许特定IP访问SSH服务,拒绝其他所有连接。
添加富规则
# 示例:允许192.168.1.100访问SSH,拒绝其他IP的SSH连接 firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' --permanent firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" service name="ssh" reject' --permanent # 重载生效 firewall-cmd --reload
查看富规则
firewall-cmd --zone=public --list-rich-rules
移除富规则
需指定完整规则内容:
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' --permanent firewall-cmd --reload
防火墙高级配置
端口转发
将本机的80端口流量转发到8080端口(需启用IP转发):
# 启用IP转发 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p # 添加端口转发(永久) firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent firewall-cmd --reload
端口伪装(MASQUERADE,类似SNAT)
适用于内网服务器通过RHEL主机上网的场景:
# 启用伪装(永久) firewall-cmd --zone=public --add-masquerade --permanent firewall-cmd --reload
日志记录
记录被拒绝的连接(便于排查问题):
# 设置拒绝流量日志级别(all:记录所有拒绝;unicast:记录单播拒绝) firewall-cmd --set-log-denied=all # 查看firewalld日志 journalctl -u firewalld -f
常用操作与排查
查看防火墙状态
# 查看运行时配置(默认区域) firewall-cmd --list-all # 查看所有区域配置 firewall-cmd --list-all-zones
重载与重启
# 重载配置(永久规则生效,不中断连接) firewall-cmd --reload # 完全重启(中断连接,慎用) firewall-cmd --complete-reload
常见问题排查
- 规则不生效:检查是否添加
--permanent,是否执行firewall-cmd --reload。 - 连接被拒绝:使用
firewall-cmd --list-all检查区域是否开放对应服务/端口,或通过journalctl -u firewalld查看日志。 - 接口未绑定区域:确认接口是否已激活(
ip a),且正确绑定区域(firewall-cmd --get-active-zones)。
firewalld作为RHEL 7的默认防火墙工具,通过区域、服务、富规则等概念实现了灵活的网络安全管理,其动态配置特性(运行时/永久分离)和丰富的功能(端口转发、NAT、日志记录)使其适合企业级应用,掌握firewalld的配置方法,不仅能有效提升服务器安全性,还能满足复杂的网络访问控制需求,在实际使用中,建议先在测试环境验证规则,再部署到生产环境,避免因配置错误导致服务中断。


