Firewalld 是 RHEL9 默认的动态防火墙,底层 nftables。
一、Firewalld 概述
Firewalld 是动态可定制的防火墙守护进程,改规则无需重启服务。两个核心概念:
- Zone:预定义规则集,接口可分配到不同 Zone
- Service:预定义规则,覆盖服务所需端口和协议
# 查看当前后端
grep FirewallBackend /etc/firewalld/firewalld.conf
# FirewallBackend=nftables (默认)
二、Zone 区域管理
预定义区域
| 区域 | 说明 |
|---|---|
block | 拒绝所有入站连接,返回 ICMP 拒绝消息 |
dmz | 非军事区,有限访问内部网络 |
drop | 丢弃所有入站数据包,无任何通知 |
external | 外部网络,用于路由器,启用伪装 |
home | 家庭网络,信任其他计算机 |
internal | 内部网络,主要信任其他计算机 |
public | 公共区域(默认),不信任其他计算机 |
trusted | 信任区,接受所有网络连接 |
work | 工作区域,基本信任其他计算机 |
区域操作
# 查看所有区域
firewall-cmd --get-zones
# 查看默认区域
firewall-cmd --get-default-zone
# 查看当前区域所有设置
firewall-cmd --list-all
# 查看指定区域
firewall-cmd --list-all --zone=home
# 修改默认区域
firewall-cmd --set-default-zone=dmz
# 创建自定义区域
firewall-cmd --new-zone=testzone --permanent
firewall-cmd --reload
三、Service 服务管理
服务是端口、协议、目标地址的集合,添加即自动开端口。
# 查看所有预定义服务
firewall-cmd --get-services
# 查看当前区域允许的服务
firewall-cmd --list-services
# 添加服务
firewall-cmd --add-service=http
firewall-cmd --add-service=https --permanent
# 移除服务
firewall-cmd --remove-service=ftp
# 使运行时设置永久生效
firewall-cmd --runtime-to-permanent
# 重新加载
firewall-cmd --reload
自定义服务
# 创建新服务
firewall-cmd --new-service=myapp --permanent
# 编辑服务配置文件
vim /etc/firewalld/services/myapp.xml
服务 XML 示例:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>MyApp</short>
<description>Custom Application Service</description>
<port protocol="tcp" port="8080"/>
<port protocol="udp" port="8081"/>
</service>
四、Port 端口管理
# 查看已开放端口
firewall-cmd --list-ports
# 开放端口
firewall-cmd --add-port=8080/tcp
firewall-cmd --add-port=3306/tcp --permanent
# 开放端口范围
firewall-cmd --add-port=8000-8100/tcp
# 关闭端口
firewall-cmd --remove-port=8080/tcp
五、紧急 Panic 模式
遭攻击时立即切断所有流量:
# 启用紧急模式(所有网络流量停止)
firewall-cmd --panic-on
# 关闭紧急模式(恢复永久设置)
firewall-cmd --panic-off
# 查看紧急模式状态
firewall-cmd --query-panic
警告:Panic 开启后只能靠物理访问或串行控制台恢复!
六、Rich Rules 富规则
富规则提供更精细的控制:
# 允许特定 IP 访问特定端口
firewall-cmd --add-rich-rule='
rule family="ipv4"
source address="192.168.1.100"
port protocol="tcp" port="22" accept'
# 限制连接速率
firewall-cmd --add-rich-rule='
rule family="ipv4"
service name="ssh"
limit value="5/m"
accept'
# 记录并丢弃
firewall-cmd --add-rich-rule='
rule family="ipv4"
source address="10.0.0.0/8"
log prefix="DROP_NET: " level="info"
drop'
七、端口转发与伪装
# 启用伪装(NAT)
firewall-cmd --add-masquerade --permanent
# 端口转发:外部 8080 → 内部 80
firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80
# 转发到其他主机
firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.10
八、服务控制命令
# 启动/停止/重启
systemctl start firewalld
systemctl stop firewalld
systemctl restart firewalld
# 开机自启
systemctl enable firewalld
systemctl disable firewalld
# 屏蔽服务(禁止启动)
systemctl mask firewalld
systemctl unmask firewalld
# 查看状态
systemctl status firewalld
firewall-cmd --state
九、最佳实践
- 最小权限:只开必需的服务和端口
- 定期审计:
firewall-cmd --list-all - 持久化:
--runtime-to-permanent或--permanent - 配合 SELinux:双重防护,
setenforce 1 - 默认 Zone:生产建议
public/dmz