Firewalld 防火墙管理
Firewalld 防火墙管理
简介
Firewalld 是 CentOS 7 及以上版本中默认的防火墙管理工具,用于替代传统的 iptables。它提供了动态管理的防火墙,支持网络/防火墙区域(zone)的概念,可以在不重启防火墙服务的情况下更改配置。Firewalld 底层仍然使用 netfilter(即 iptables 内核模块)作为数据包过滤引擎,但提供了更加友好的管理接口和更灵活的配置方式。
Firewalld 的核心设计理念是将网络接口和防火墙规则通过 zone 进行关联管理,每个 zone 定义了不同级别的信任关系和规则集合。管理员可以根据网络环境的变化,动态地切换 zone 或调整规则,而无需中断现有的网络连接。
| 对比项 | Firewalld | iptables |
|---|---|---|
| 配置方式 | 动态配置,无需重启 | 静态配置,需重载 |
| 管理接口 | firewall-cmd(CLI)、firewall-config(GUI) | iptables 命令 |
| 规则组织 | 基于 zone 的分区域管理 | 基于链(chain)和表(table) |
| 持久化 | runtime 和 permanent 分离 | 需手动保存规则 |
| 默认系统 | CentOS 7+ | CentOS 6 及更早版本 |
特点
优点
缺点
一、安装与基本操作
安装 Firewalld
# 安装 firewalld 和图形配置工具
yum install -y firewalld firewalld-config
# 查看是否已安装
rpm -qa | grep firewalld服务管理
# 启动防火墙
systemctl start firewalld
# 停止防火墙
systemctl stop firewalld
# 重启防火墙
systemctl restart firewalld
# 重载防火墙配置(不中断现有连接)
firewall-cmd --reload
# 或者
service firewalld restart
# 查看防火墙状态
systemctl status firewalld
# 或者
firewall-cmd --state
# 设置开机启动
systemctl enable firewalld
# 停止并禁用开机启动
systemctl disable firewalld
# 查看是否开机启动
systemctl is-enabled firewalld查看防火墙基本信息
# 查看防火墙状态
firewall-cmd --state
# 查看当前默认 zone
firewall-cmd --get-default-zone
# 查看当前激活的 zone
firewall-cmd --get-active-zones
# 查看所有可用的 zone
firewall-cmd --get-zones
# 查看某个 zone 的所有配置信息
firewall-cmd --zone=public --list-all
# 查看所有 zone 的配置信息
firewall-cmd --list-all-zones二、Zone(区域)管理
Zone 是 Firewalld 的核心概念。每个 zone 定义了一组规则集,用于处理来自特定网络接口或源的流量。不同的 zone 代表不同的信任级别。
内置 Zone 说明
| Zone 名称 | 默认规则 | 适用场景 |
|---|---|---|
| trusted | 允许所有流量 | 完全可信的内部网络 |
| home | 拒绝入站,允许出站 | 家庭网络环境 |
| internal | 拒绝入站,允许出站 | 内部网络,与 home 类似 |
| work | 拒绝入站,允许出站 | 工作网络环境 |
| public | 拒绝入站,允许出站 | 公共网络(默认 zone) |
| external | 拒绝入站,允许出站,支持 masquerading | 外部网络,NAT 网关 |
| dmz | 拒绝入站,允许出站,仅接受 SSH | DMZ 隔离区域 |
| block | 拒绝所有入站 | 高安全隔离 |
| drop | 丢弃所有入站(无响应) | 最高安全隔离 |
Zone 操作命令
# 查看默认 zone
firewall-cmd --get-default-zone
# 设置默认 zone
firewall-cmd --set-default-zone=home
# 查看某个网卡绑定的 zone
firewall-cmd --get-zone-of-interface=eth0
# 将网卡绑定到指定 zone(永久生效)
firewall-cmd --zone=public --change-interface=eth0 --permanent
# 将网卡添加到指定 zone
firewall-cmd --zone=public --add-interface=eth0
# 从 zone 中移除网卡
firewall-cmd --zone=public --remove-interface=eth0
# 查看某个 zone 绑定的所有网卡
firewall-cmd --zone=public --list-interfaces
# 查看当前激活的 zone 及其绑定的网卡
firewall-cmd --get-active-zones基于源地址的 Zone 绑定
除了基于网卡接口绑定 zone,还可以基于源 IP 地址来绑定 zone,这样可以针对不同的 IP 范围应用不同的规则。
# 将源 IP 范围绑定到 trusted zone
firewall-cmd --zone=trusted --add-source=192.168.1.0/24
# 查看某个 zone 绑定的源地址
firewall-cmd --zone=trusted --list-sources
# 移除源地址绑定
firewall-cmd --zone=trusted --remove-source=192.168.1.0/24
# 查看某个 IP 地址属于哪个 zone
firewall-cmd --get-zone-of-source=192.168.1.100三、端口管理
开放和关闭端口
# 开放单个端口(永久生效)
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --zone=public --add-port=22/tcp --permanent
firewall-cmd --zone=public --add-port=21/tcp --permanent
firewall-cmd --zone=public --add-port=53/udp --permanent
# 关闭单个端口(永久生效)
firewall-cmd --zone=public --remove-port=80/tcp --permanent
firewall-cmd --zone=public --remove-port=443/tcp --permanent
# 批量添加区间端口
firewall-cmd --zone=public --add-port=4400-4600/udp --permanent
firewall-cmd --zone=public --add-port=4400-4600/tcp --permanent
# 重载配置使其生效
firewall-cmd --reload
# 查看已开放的端口列表
firewall-cmd --permanent --list-port
firewall-cmd --zone=public --list-ports
# 查询某个端口是否已开放
firewall-cmd --zone=public --query-port=80/tcp运行时与永久配置的区别
Firewalld 有两种配置模式:runtime(运行时)和 permanent(永久)。默认情况下,firewall-cmd 的操作只影响运行时配置,重启后会丢失。使用 --permanent 参数可以将配置持久化。
# 仅运行时生效(重启后失效)
firewall-cmd --zone=public --add-port=8080/tcp
# 永久生效(需要 reload 后才能生效)
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
# 同时修改运行时和永久配置
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=8080/tcp四、Service(服务)管理
Service 是 Firewalld 对常用服务的端口抽象,不需要记住具体的端口号,直接使用服务名即可管理。
查看服务相关命令
# 查看所有可用的 service
firewall-cmd --get-services
# 查看当前 zone 已开放的 service
firewall-cmd --zone=public --list-services
# 查看某个 service 的详细配置
firewall-cmd --info-service=http常用内置 Service 列表
| Service 名称 | 端口 | 说明 |
|---|---|---|
| http | 80/tcp | HTTP Web 服务 |
| https | 443/tcp | HTTPS Web 服务 |
| ssh | 22/tcp | SSH 远程登录 |
| ftp | 21/tcp | FTP 文件传输 |
| dns | 53/tcp, 53/udp | DNS 域名解析 |
| mysql | 3306/tcp | MySQL 数据库 |
| postgresql | 5432/tcp | PostgreSQL 数据库 |
| smtp | 25/tcp | 邮件发送 |
| dhcp | 67/udp, 68/udp | DHCP 地址分配 |
| nfs | 2049/tcp | NFS 网络文件系统 |
| samba | 139/tcp, 445/tcp | Samba 文件共享 |
| dhcpv6-client | 546/udp | DHCPv6 客户端 |
| mssql | 1433/tcp | SQL Server 数据库 |
Service 操作命令
# 开放 service
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent
firewall-cmd --zone=public --add-service=mysql --permanent
# 移除 service
firewall-cmd --zone=public --remove-service=http --permanent
# 查询 service 是否已开放
firewall-cmd --zone=public --query-service=http
# 重载配置
firewall-cmd --reload自定义 Service
当内置 service 不满足需求时,可以创建自定义 service 文件。
# 创建自定义 service 的 XML 文件
cat > /etc/firewalld/services/myapp.xml << 'EOF'
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>MyApp</short>
<description>My .NET Web Application</description>
<port protocol="tcp" port="8080"/>
<port protocol="tcp" port="8081"/>
</service>
EOF
# 重载防火墙使新 service 可用
firewall-cmd --reload
# 使用自定义 service
firewall-cmd --zone=public --add-service=myapp --permanent
firewall-cmd --reload五、Rich Rules(富规则)
Rich Rules 是 Firewalld 提供的高级规则语法,可以实现比简单端口/服务管理更复杂的过滤规则,包括源地址过滤、目的地址过滤、端口转发、日志记录、限速等功能。
Rich Rule 语法结构
# 基本语法格式
rule [family="<ipv4|ipv6>"]
[source address="<address>[/<mask>]" [invert="True"]]
[destination address="<address>[/<mask>]" [invert="True"]]
[service name="<service name>"]
[port port="<port value>" protocol="<tcp|udp>"]
[protocol value="<protocol value>"]
[icmp-block name="<icmp type name>"]
[masquerade]
[forward-port port="<port value>" protocol="<tcp|udp>" to-port="<port value>" to-addr="<address>"]
[log [prefix="<prefix text>"] [level="<log level>"] [limit value="<rate/duration>"]]
[audit]
[accept|reject|drop]常用 Rich Rule 示例
# 允许指定 IP 访问指定端口
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="80" accept' --permanent
# 拒绝指定 IP 段访问 SSH
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" service name="ssh" reject' --permanent
# 允许指定 IP 段访问某个服务,并记录日志
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" log prefix="http_access" level="info" accept' --permanent
# 限制 SSH 连接速率为每分钟最多 10 次新连接
firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" log prefix="ssh_rate_limit" level="warning" accept limit value="10/m"' --permanent
# 拒绝某个 IP 的所有流量
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.200" reject' --permanent
# 允许某个 IP 访问所有端口
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.50" accept' --permanent
# 丢弃来自某个 IP 的 ICMP 包(ping)
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.200" icmp-block name="echo-request" drop' --permanentRich Rule 管理命令
# 查看所有 rich rules
firewall-cmd --zone=public --list-rich-rules
# 移除指定的 rich rule
firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="80" accept' --permanent
# 查询某个 rich rule 是否存在
firewall-cmd --zone=public --query-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="80" accept'
# 重载配置
firewall-cmd --reload六、端口转发(Port Forwarding)
端口转发可以将到达本机某个端口的流量转发到本机另一个端口或者另一台机器的端口。
本地端口转发
# 将 80 端口转发到 8080 端口
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
# 将 80 端口转发到 8080 端口,并限制来源 IP
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" forward-port port="80" protocol="tcp" to-port="8080"' --permanent
# 移除端口转发
firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080 --permanent远程端口转发
# 将本机 80 端口转发到 192.168.1.200 的 8080 端口(需要先开启 masquerading)
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.200 --permanent
# 使用 rich rule 实现更精细的转发
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" forward-port port="8080" protocol="tcp" to-port="80" to-addr="192.168.1.100"' --permanent
# 重载配置
firewall-cmd --reload七、Masquerading(地址伪装/NAT)
Masquerading 即源地址转换(SNAT),通常用于将内部网络的流量通过 NAT 方式转发到外部网络,类似于路由器的 NAT 功能。
# 开启 masquerading
firewall-cmd --zone=public --add-masquerade --permanent
# 关闭 masquerading
firewall-cmd --zone=public --remove-masquerade --permanent
# 查询是否已开启 masquerading
firewall-cmd --zone=public --query-masquerade
# 重载配置
firewall-cmd --reloadNAT 网关配置示例
假设服务器有两个网卡:eth0(外网,192.168.100.10)和 eth1(内网,10.0.0.1),需要将内网流量转发到外网。
# 外网接口绑定到 public zone
firewall-cmd --zone=public --change-interface=eth0 --permanent
# 内网接口绑定到 trusted zone
firewall-cmd --zone=trusted --change-interface=eth1 --permanent
# 在 public zone 开启 masquerading
firewall-cmd --zone=public --add-masquerade --permanent
# 开启内核转发
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
# 重载配置
firewall-cmd --reload八、ICMP 管理
ICMP 协议用于网络诊断(如 ping),可以在防火墙中控制 ICMP 包的过滤。
# 查看支持的 ICMP 类型
firewall-cmd --get-icmptypes
# 阻止所有 ICMP 请求(禁止 ping)
firewall-cmd --zone=public --add-icmp-block=echo-request --permanent
# 允许特定 IP 的 ping
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" icmp-type name="echo-request" accept' --permanent
# 移除 ICMP 阻止
firewall-cmd --zone=public --remove-icmp-block=echo-request --permanent
# 重载配置
firewall-cmd --reload九、常见应用场景
场景1:Web 服务器防火墙配置
# 开放 HTTP 和 HTTPS
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent
# 开放 SSH(建议修改默认端口)
firewall-cmd --zone=public --add-port=2222/tcp --permanent
# 仅允许管理 IP 访问 SSH
firewall-cmd --zone=public --remove-service=ssh --permanent
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.50" port protocol="tcp" port="2222" accept' --permanent
# 重载配置
firewall-cmd --reload场景2:数据库服务器防火墙配置
# 仅允许应用服务器访问数据库端口
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port protocol="tcp" port="1433" accept' --permanent
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.11" port protocol="tcp" port="1433" accept' --permanent
# 开放 SSH
firewall-cmd --zone=public --add-service=ssh --permanent
# 重载配置
firewall-cmd --reload场景3:.NET 应用服务器配置
# 开放应用端口
firewall-cmd --zone=public --add-port=5000/tcp --permanent
firewall-cmd --zone=public --add-port=5001/tcp --permanent
# 如果使用 Nginx 反向代理
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent
# 开放 Supervisor web UI(如果使用)
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9001" accept' --permanent
# 重载配置
firewall-cmd --reload场景4:Kafka 集群防火墙配置
# 开放 Kafka 端口
firewall-cmd --zone=public --add-port=9092/tcp --permanent
# 开放 ZooKeeper 端口(仅集群内部访问)
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="2181" accept' --permanent
# Kafka 集群间通信端口
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="2888" accept' --permanent
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3888" accept' --permanent
# 重载配置
firewall-cmd --reload十、配置文件说明
Firewalld 的配置文件存放在以下目录中:
| 路径 | 说明 |
|---|---|
| /etc/firewalld/ | 用户自定义配置(优先级高) |
| /etc/firewalld/zones/ | 用户自定义 zone 配置 |
| /etc/firewalld/services/ | 用户自定义 service 配置 |
| /usr/lib/firewalld/ | 系统默认配置(不要直接修改) |
| /usr/lib/firewalld/zones/ | 系统默认 zone 配置 |
| /usr/lib/firewalld/services/ | 系统默认 service 配置 |
直接编辑配置文件示例
# 查看 public zone 配置文件
cat /etc/firewalld/zones/public.xml<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
<port protocol="tcp" port="80"/>
<port protocol="tcp" port="443"/>
</zone>十一、故障排查与调试
# 查看防火墙详细状态
firewall-cmd --state
# 查看某个 zone 的完整配置
firewall-cmd --zone=public --list-all
# 查看所有已开放的端口
firewall-cmd --list-ports
# 查看所有已开放的 service
firewall-cmd --list-services
# 查看所有 rich rules
firewall-cmd --list-rich-rules
# 查看 firewalld 日志
journalctl -u firewalld -f
# 如果 firewalld 启动失败,检查配置文件语法
firewall-cmd --check-config
# 查看当前 iptables 规则(确认 firewalld 是否生效)
iptables -L -n -v
# 调试模式启动
firewall-cmd --debug=10十二、Firewalld 与 Docker 兼容性
Docker 运行时会直接操作 iptables,可能会与 firewalld 产生冲突。以下是常见的处理方式:
# 方式1:使用 firewalld 的 direct 规则
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -i docker0 -j ACCEPT
firewall-cmd --reload
# 方式2:在 Docker 配置中指定使用 firewalld
# 编辑 /etc/docker/daemon.json{
"iptables": false
}# 重启 Docker
systemctl restart docker
# 方式3:为 Docker 创建专门的 zone
firewall-cmd --permanent --new-zone=docker
firewall-cmd --permanent --zone=docker --add-interface=docker0
firewall-cmd --permanent --zone=docker --add-masquerade
firewall-cmd --reload总结
firewalld 是 CentOS7 默认防火墙,通过 zone 和 service 概念简化了防火墙管理。生产环境建议只开放必要端口,定期审计规则。
关键知识点
- 部署类主题的核心不是“装成功”,而是“稳定运行、可排障、可回滚”。
- 同一个服务通常至少要关注版本、目录、端口、权限、数据、日志和备份。
- Linux 问题经常跨越系统层、网络层、服务层和应用层。
项目落地视角
- 把安装步骤补成可重复执行的清单,必要时写成脚本或配置文件。
- 把配置目录、数据目录、日志目录和挂载点明确拆开。
- 上线前检查防火墙、SELinux、时区、磁盘、系统服务和健康检查。
常见误区
- 使用 latest 或未固定版本,导致环境不可复现。
- 只验证启动成功,不验证持久化、开机自启和故障恢复。
- 遇到问题先改配置而不是先看日志和依赖链路。
进阶路线
- 继续补齐 systemd、性能监控、安全加固和备份恢复。
- 把单机操作升级成 Docker、Kubernetes 或 IaC 方案。
- 建立标准化运维手册,包括巡检、扩容、回滚和灾备演练。
适用场景
- 当你准备把《Firewalld 防火墙管理》真正落到项目里时,最适合先在一个独立模块或最小样例里验证关键路径。
- 适合单机环境初始化、中间件快速搭建、测试环境验证和生产部署前准备。
- 当服务稳定性依赖端口、权限、目录、网络和系统参数时,这类主题会直接影响成败。
落地建议
- 固定版本号与镜像标签,避免“latest”带来的不可预期变化。
- 把配置、数据、日志目录拆开管理,并记录恢复步骤。
- 上线前确认端口、防火墙、SELinux、时区和磁盘空间。
排错清单
- 先查 systemctl、容器日志和应用日志,确认失败发生在哪一层。
- 检查端口占用、目录权限、挂载路径和网络连通性。
- 如果是新环境问题,优先对比与已知正常环境的差异。
复盘问题
- 如果把《Firewalld 防火墙管理》放进你的当前项目,最先要验证的输入、输出和失败路径分别是什么?
- 《Firewalld 防火墙管理》最容易在什么规模、什么边界条件下暴露问题?你会用什么指标或日志去确认?
- 相比默认实现或替代方案,采用《Firewalld 防火墙管理》最大的收益和代价分别是什么?
