非常好 👍
下面是一个完整的、系统化的笔记教程:
🔥 firewall-cmd
—— Linux 防火墙规则管理工具详解(CentOS / RHEL / Fedora 通用)
📘 一、工具简介
firewall-cmd
是 firewalld 服务的命令行管理工具,用于在 Linux 系统中配置防火墙规则。
与传统的 iptables
相比,它具备以下优点:
✅ 动态管理规则(无需重启防火墙)
✅ 支持区域(Zone)概念,按信任级别分层管理
✅ 支持服务(service)和端口(port)两种方式定义访问规则
✅ 语法更清晰,易于脚本化配置
⚙️ 二、基本命令结构
firewall-cmd [选项] [参数]
常见选项:
选项 | 含义 |
---|---|
--state | 查看防火墙是否运行 |
--zone | 指定区域(如 public、internal、trusted 等) |
--list-all | 显示当前区域的全部规则 |
--add-service | 添加放行服务(如 http、ssh) |
--add-port | 添加放行端口(如 80/tcp) |
--remove-service | 删除已放行服务 |
--remove-port | 删除已放行端口 |
--reload | 重新加载防火墙配置(不丢失运行状态) |
--permanent | 永久生效(写入配置文件) |
🚀 三、常用操作大全
1️⃣ 查看防火墙状态
firewall-cmd --state
返回结果:
running
:防火墙正在运行not running
:未运行
2️⃣ 启动 / 停止 / 重启防火墙服务
systemctl start firewalld # 启动
systemctl stop firewalld # 停止
systemctl restart firewalld # 重启
systemctl enable firewalld # 设置开机自启
3️⃣ 查看当前区域和活动接口
firewall-cmd --get-active-zones
返回示例:
public
interfaces: eth0
4️⃣ 查看当前区域的所有规则
firewall-cmd --list-all
输出示例:
public (active)
target: default
interfaces: eth0
services: ssh dhcpv6-client
ports: 80/tcp 443/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
5️⃣ 添加放行端口
临时放行(立即生效,重启失效)
firewall-cmd --zone=public --add-port=8080/tcp
永久放行(需 reload 才生效)
firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --reload
删除放行端口
firewall-cmd --zone=public --remove-port=8080/tcp
firewall-cmd --reload
6️⃣ 放行指定服务
firewalld
预定义了一些常见服务(ssh、http、https、mysql 等)
查看所有可用服务:
firewall-cmd --get-services
放行服务(如 HTTP):
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
删除服务:
firewall-cmd --permanent --remove-service=http
firewall-cmd --reload
7️⃣ 放行 IP 地址 / IP 段
允许特定 IP 访问:
firewall-cmd --permanent --add-source=192.168.1.100
firewall-cmd --reload
允许整个网段访问:
firewall-cmd --permanent --add-source=192.168.1.0/24
8️⃣ 拒绝特定 IP(阻止访问)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.105" reject'
firewall-cmd --reload
删除规则:
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.1.105" reject'
firewall-cmd --reload
9️⃣ 启用 NAT 转发(端口映射)
例如:把外部 8080 映射到内部 80 端口:
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80
firewall-cmd --reload
启用 IP 伪装(常用于 NAT)
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
🔟 临时与永久规则的区别
类型 | 是否立即生效 | 是否重启后保留 | 是否需要 reload |
---|---|---|---|
临时(默认) | ✅ 是 | ❌ 否 | ❌ |
永久(--permanent ) | ❌ 否 | ✅ 是 | ✅ 需 firewall-cmd --reload |
✅ 最佳实践:
添加规则时使用:
firewall-cmd --permanent ...
firewall-cmd --reload
🧩 十一、Zones(区域)说明
每个网络接口都属于一个区域,区域定义了该网络的信任级别。
区域 | 描述 |
---|---|
drop | 丢弃所有传入包(无回应) |
block | 拒绝所有连接(返回拒绝信息) |
public | 默认区域,信任低,仅放行指定服务 |
external | 外网区域,常用于 NAT 网关 |
internal | 内网区域,信任较高 |
trusted | 完全信任,允许所有流量 |
查看所有区域:
firewall-cmd --get-zones
设置接口所属区域:
firewall-cmd --zone=internal --change-interface=eth0 --permanent
firewall-cmd --reload
🧱 十二、规则备份与恢复
导出当前配置:
firewall-cmd --runtime-to-permanent
备份配置文件:
cp -r /etc/firewalld /etc/firewalld.backup
恢复配置:
cp -r /etc/firewalld.backup/* /etc/firewalld/
firewall-cmd --reload
🧾 十三、实用命令速查表
功能 | 命令 |
---|---|
查看状态 | firewall-cmd --state |
列出当前规则 | firewall-cmd --list-all |
添加端口 | firewall-cmd --permanent --add-port=80/tcp |
删除端口 | firewall-cmd --permanent --remove-port=80/tcp |
添加服务 | firewall-cmd --permanent --add-service=http |
添加 IP 白名单 | firewall-cmd --permanent --add-source=192.168.1.10 |
阻止 IP | firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="x.x.x.x" reject' |
查看区域接口 | firewall-cmd --get-active-zones |
重载配置 | firewall-cmd --reload |
🧠 十四、总结
特点 | firewalld (firewall-cmd ) | iptables |
---|---|---|
动态规则 | ✅ 支持动态修改 | ❌ 重载需中断连接 |
使用难度 | 简单 | 复杂 |
配置方式 | 基于区域与服务 | 基于链与表 |
常见于 | CentOS 7+ / RHEL 8+ | CentOS 6 / Ubuntu old |
💡 建议:生产环境使用
firewalld
,复杂场景(如容器编排)可结合iptables
或nftables
。
发表回复