Rocky Linux 9/10 firewalld 企业级防火墙教程
欢迎你来读这篇博客,这篇博客主要是关于 Rocky Linux 9/10 firewalld 企业级防火墙实践。
很多 Linux 教程还停留在 CentOS 7 时代:装完系统第一件事就是 systemctl disable firewalld。这在生产环境里并不推荐。真正的企业级初始化,不是把安全组件全部关掉,而是知道它为什么拦你、怎么放行、怎么审计、怎么回滚。
本文会围绕 Rocky Linux 9/10、RHEL 系发行版、firewalld、zone、service、port、rich rule、source、forward、masquerade、nftables、企业端口策略、常见故障排查和安全 Checklist 展开。
序言
为什么单独写 firewalld
在 Rocky Linux、RHEL、AlmaLinux 等企业级 Linux 发行版中,firewalld 是非常重要的系统安全组件。
很多人第一次遇到它,是因为服务启动了,但外部访问不了:
1 | |
然后第一反应是:
1 | |
这确实能让服务“通了”,但问题也来了:
- SSH 暴露公网;
- Redis 暴露公网;
- MySQL / PostgreSQL 暴露公网;
- 内部管理端口暴露公网;
- 监控、调试、管理服务全部裸奔;
- 后续安全扫描一片红;
- 出问题后很难解释为什么当初把防火墙关了。
服务器不是海边度假,没必要穿这么少。
企业级做法应该是:
- 保持 firewalld 开启;
- 最小端口开放;
- 按来源 IP 限制访问;
- 按 zone 管理不同网络;
- 按 service 管理标准服务;
- 用 rich rule 表达复杂规则;
- 配合 SELinux、auditd、fail2ban、日志审计形成完整防线。
firewalld 与 iptables / nftables 的关系
简单理解:
1 | |
在 Rocky Linux 9/10 里,不建议继续以 iptables 作为主线写防火墙配置。Rocky 官方文档已经明确说明:Rocky Linux 9.0 开始,iptables 及相关工具被正式标记为 deprecated,当前版本推荐使用 firewalld。
本文适用范围
本文适用于:
- Rocky Linux 8 / 9 / 10;
- RHEL 8 / 9 / 10;
- AlmaLinux 8 / 9 / 10;
- 企业应用服务器;
- Java 后端服务器;
- Web 服务器;
- 数据库服务器;
- 容器宿主机;
- Kubernetes Node 预备环境;
- 内网运维服务器。
本文不把“关闭防火墙”作为推荐方案。除非你在实验环境里临时调试,否则生产环境应保持 firewalld 开启。
正文
第一章 firewalld 基础概念
1.1 firewalld 是什么
firewalld 是 Linux 上的动态防火墙管理服务。它提供了:
- zone;
- service;
- port;
- source;
- rich rule;
- forward;
- masquerade;
- runtime / permanent 配置分离;
- D-Bus 接口;
- 与 NetworkManager、Cockpit、Podman 等组件的集成能力。
它的核心特点是:
可以在不重启防火墙服务的情况下动态修改规则。
这点和老式手写 iptables 脚本不同。你可以先在 runtime 中测试规则,确认没问题后再保存为 permanent。
1.2 firewalld 解决什么问题
firewalld 主要解决“哪些流量可以进来、哪些流量应该被拒绝”的问题。
常见场景:
- 只允许内网访问 SSH;
- 只允许应用服务器访问数据库;
- 允许公网访问 80 / 443;
- 禁止公网访问 Redis;
- 允许监控服务器访问 node_exporter;
- 允许办公网段访问 Cockpit;
- 按来源 IP 限制管理后台;
- 给容器、虚拟化、内网网桥做转发和 NAT。
1.3 firewalld 与 SELinux 的区别
很多人会把 firewalld 和 SELinux 混在一起。
二者完全不是一回事。
| 组件 | 关注点 | 作用层面 |
|---|---|---|
| firewalld | 网络流量是否允许进入或转发 | 网络访问控制 |
| SELinux | 进程是否有权限访问文件、端口、资源 | 强制访问控制 |
举例:
- firewalld 允许外部访问 8080;
- 但 SELinux 不允许 Nginx 访问某个目录;
- 这时端口通了,服务仍然可能 403 或访问失败。
企业环境里两者都应该开启,而不是二选一。
1.4 firewalld、nftables、iptables 的关系
在 Rocky Linux 9/10 中,可以这么理解:
1 | |
iptables 是旧时代常用工具;nftables 是现代 Linux 包过滤框架;firewalld 是更高层的动态管理工具。
对于大多数服务器,建议优先使用 firewalld。只有在 firewalld 表达不了复杂网关、防火墙、转发、性能敏感规则时,再考虑直接写 nftables。
第二章 安装、启动与状态检查
2.1 安装 firewalld
Rocky Linux 默认通常已经安装 firewalld。如果是极简环境,可以手动安装:
1 | |
2.2 启动 firewalld
1 | |
2.3 查看服务状态
1 | |
常用判断:
1 | |
2.4 查看 firewalld 状态
1 | |
如果正常,会输出:
1 | |
2.5 查看版本
1 | |
2.6 查看默认 zone
1 | |
常见输出:
1 | |
2.7 查看当前激活 zone
1 | |
示例:
1 | |
2.8 查看完整配置
1 | |
指定 zone:
1 | |
第三章 runtime 与 permanent
3.1 runtime 配置
不加 --permanent 的规则是 runtime 配置。
例如:
1 | |
这条规则会立即生效,但重启 firewalld 或系统重启后会丢失。
3.2 permanent 配置
加上 --permanent 的规则是永久配置。
1 | |
注意:永久配置不会立即影响 runtime,需要 reload:
1 | |
3.3 推荐操作习惯
推荐先 runtime 测试:
1 | |
确认可访问后,再写入永久配置:
1 | |
或者直接永久添加再 reload:
1 | |
3.4 企业建议
生产环境中,建议采用如下流程:
1 | |
不要上来就永久写规则。尤其是远程 SSH 服务器,规则写错可能把自己关在门外。别问我怎么知道的,问就是机房夜风很冷。
第四章 zone 区域模型
4.1 zone 是什么
zone 是 firewalld 的核心概念。
你可以把 zone 理解为“网络信任等级”。不同网络、接口、来源 IP 可以放入不同 zone,然后给不同 zone 配置不同规则。
4.2 查看所有 zone
1 | |
常见 zone:
1 | |
不同版本可能略有差异。
4.3 常见 zone 含义
| zone | 含义 | 推荐场景 |
|---|---|---|
| trusted | 信任所有连接 | 极少使用,只用于完全可信网络 |
| home | 家庭网络 | 桌面场景较多 |
| work | 工作网络 | 办公网 |
| internal | 内部网络 | 企业内网 |
| public | 公共网络 | 默认外部网络 |
| external | 外部网络,常配合 NAT | 网关服务器 |
| dmz | 隔离区 | 对外服务区 |
| block | 拒绝进入,返回拒绝信息 | 明确拒绝 |
| drop | 直接丢弃,不响应 | 黑洞式拒绝 |
4.4 查看默认 zone
1 | |
4.5 修改默认 zone
1 | |
注意:这是立即生效的配置。
4.6 查看接口所属 zone
1 | |
4.7 把接口加入指定 zone
1 | |
永久配置:
1 | |
4.8 使用 NetworkManager 管理 zone
在 Rocky Linux 9/10 中,网络连接通常由 NetworkManager 管理。建议通过 nmcli 绑定 zone:
1 | |
查看:
1 | |
4.9 企业 zone 规划示例
| 网络 | zone | 网段 | 说明 |
|---|---|---|---|
| 公网 | public | 0.0.0.0/0 | 只开放 80/443 |
| 运维网 | internal | 192.168.9.0/24 | SSH、Cockpit、监控 |
| 业务网 | work | 192.168.8.0/24 | 应用访问 |
| 存储网 | trusted/internal | 192.168.7.0/24 | NFS、MinIO、备份 |
| DMZ | dmz | 10.10.10.0/24 | 对外服务区 |
企业里不要所有接口都丢到 public,这样后面规则会越来越乱。
第五章 service 服务管理
5.1 service 是什么
firewalld 的 service 是预定义服务规则。
例如:
- ssh;
- http;
- https;
- dns;
- dhcpv6-client;
- cockpit;
- samba;
- nfs。
service 的好处是可读性强,不需要记端口。
例如:
1 | |
比下面这样更清晰:
1 | |
5.2 查看可用 service
1 | |
5.3 查看当前开放服务
1 | |
指定 zone:
1 | |
5.4 开放服务
1 | |
5.5 删除服务
1 | |
5.6 查看 service 定义文件
系统内置 service 位于:
1 | |
用户自定义 service 位于:
1 | |
查看 ssh service:
1 | |
5.7 自定义 service
例如自定义一个 Java 应用服务:
1 | |
内容:
1 | |
重新加载 service 定义:
1 | |
开放自定义服务:
1 | |
5.8 企业建议
- 标准服务优先用 service;
- 临时或非标准端口可以用 port;
- 多端口业务建议自定义 service;
- 服务规则要配合端口矩阵文档;
- 不要看到端口不通就一口气开放
1-65535/tcp。
第六章 port 端口管理
6.1 查看开放端口
1 | |
指定 zone:
1 | |
6.2 开放 TCP 端口
1 | |
6.3 开放 UDP 端口
1 | |
6.4 开放端口范围
1 | |
6.5 删除端口
1 | |
6.6 检查端口是否开放
1 | |
输出:
1 | |
或者:
1 | |
6.7 端口开放不等于服务正常
开放端口只是第一步,还需要确认服务真的在监听。
1 | |
示例:
1 | |
如果服务只监听 127.0.0.1,外部也访问不了:
1 | |
这不是 firewalld 的问题,而是应用监听地址的问题。
第七章 source 来源限制
7.1 为什么要限制来源
很多服务不应该向全网开放:
- SSH;
- Cockpit;
- Redis;
- MySQL;
- PostgreSQL;
- Elasticsearch;
- Prometheus Exporter;
- 内部管理后台。
正确做法是限制来源 IP 或来源网段。
7.2 将来源网段加入 zone
例如将运维网段加入 internal zone:
1 | |
查看:
1 | |
7.3 在 internal zone 开放 SSH
1 | |
这样只有匹配 internal zone 的来源网段才能访问 SSH。
7.4 删除来源
1 | |
7.5 企业 SSH 来源限制示例
1 | |
含义:
- 运维网段
192.168.9.0/24可以访问 SSH; - public zone 不再开放 SSH;
- 公网无法直接 SSH。
7.6 企业建议
- SSH 只允许运维网段;
- 数据库只允许应用网段;
- Redis 只允许应用网段;
- 监控端口只允许监控网段;
- Cockpit 只允许运维网段;
- 管理后台最好再叠加应用层认证和 VPN。
第八章 rich rule 高级规则
8.1 rich rule 是什么
当 service、port、source 不够表达复杂规则时,可以使用 rich rule。
rich rule 支持:
- 来源地址;
- 目标地址;
- 服务;
- 端口;
- 协议;
- 日志;
- 限速;
- accept;
- reject;
- drop;
- priority。
8.2 rich rule 基本结构
1 | |
例如:
1 | |
8.3 允许指定 IP 访问端口
1 | |
8.4 允许指定网段访问端口
1 | |
8.5 拒绝指定 IP
1 | |
8.6 直接丢弃指定 IP
1 | |
reject 和 drop 的区别:
| 动作 | 行为 |
|---|---|
| reject | 拒绝并返回响应 |
| drop | 直接丢弃,不响应 |
8.7 日志记录
1 | |
查看日志:
1 | |
8.8 限速日志
1 | |
这类规则适合记录未被匹配的异常流量,但要谨慎使用,避免日志爆炸。
8.9 rich rule 优先级
rich rule 支持 priority。
- 数值越小,优先级越高;
- 可选范围通常是
-32768到32767; - 负数优先级更靠前;
- 正数优先级更靠后。
示例:
1 | |
8.10 删除 rich rule
删除时必须和添加时的规则内容一致:
1 | |
8.11 查看 rich rule
1 | |
指定 zone:
1 | |
8.12 企业建议
- 简单规则用 service / port / source;
- 复杂规则再用 rich rule;
- 能用 rich rule 就不要轻易用 direct rule;
- rich rule 要写清楚变更原因;
- 禁止规则和允许规则要注意优先级;
- 带日志的规则必须加限速。
第九章 direct rule 与为什么不推荐滥用
9.1 direct rule 是什么
direct rule 是 firewalld 提供的底层规则入口,可以更接近 iptables/nftables 层面操作。
9.2 为什么不建议优先使用 direct rule
在现代 Rocky Linux 中,firewalld 通常使用 nftables 后端。direct rule 在 nftables 后端下存在一些行为差异,尤其是 ACCEPT/DROP 优先级方面更容易让人误判。
firewalld 官方文档也建议:如果 rich rule 能解决,就优先使用 rich rule,而不是 direct rule。
9.3 什么时候考虑 direct rule
只有在这些场景下再考虑:
- firewalld 标准能力无法表达;
- rich rule 无法满足;
- 需要非常底层的匹配;
- 有明确的 nftables/iptables 背景;
- 有测试环境充分验证;
- 有回滚方案。
9.4 企业建议
direct rule 不是不能用,而是不要用它来掩盖自己对 zone、source、rich rule 的不熟悉。
大多数业务服务器完全不需要 direct rule。
第十章 ICMP 与 ping 管理
10.1 是否应该禁 ping
很多安全脚本会直接禁 ping:
1 | |
但企业环境不建议无脑禁用所有 ICMP。
原因:
- ping 是基础连通性排查工具;
- ICMP 对 Path MTU Discovery 有帮助;
- 全禁可能导致网络问题更难排查;
- 安全不是靠“假装机器不存在”。
10.2 查看 ICMP 类型
1 | |
10.3 禁止 echo-request
1 | |
10.4 允许特定来源 ping
更推荐用 rich rule 限定来源,而不是全禁:
1 | |
10.5 企业建议
- 公网机器可以限制 ICMP;
- 内网服务器建议允许运维网段 ICMP;
- 不要一刀切阻断所有 ICMP;
- 网络排障环境保留必要 ICMP。
第十一章 NAT、转发与 masquerade
11.1 什么是 masquerade
masquerade 可以理解为一种动态 SNAT。常用于:
- 内网服务器通过网关出网;
- 容器网络访问外网;
- 虚拟化桥接网络转发;
- LXD/Podman/KVM 网络场景。
11.2 开启 masquerade
1 | |
查看:
1 | |
11.3 关闭 masquerade
1 | |
11.4 端口转发
示例:将 80 转发到本机 8080:
1 | |
转发到其他主机:
1 | |
通常还需要开启 masquerade:
1 | |
11.5 内核 IP 转发
1 | |
永久配置:
1 | |
内容:
1 | |
生效:
1 | |
11.6 企业建议
- 普通应用服务器不应开启转发;
- 网关服务器、容器宿主机、虚拟化宿主机才需要;
- NAT 规则要写入网络架构文档;
- 不要在业务服务器上偷偷做网关。
第十二章 ipset 与大规模 IP 黑白名单
12.1 为什么需要 ipset
如果你要维护大量 IP 黑名单或白名单,不建议写几百条 rich rule。
这时可以使用 ipset。
12.2 创建 ipset
1 | |
12.3 添加 IP
1 | |
12.4 批量导入
1 | |
12.5 使用 ipset 拦截
1 | |
12.6 查看 ipset
1 | |
12.7 企业建议
- 大量黑名单用 ipset;
- 少量来源限制用 source/rich rule;
- 黑名单变更要自动化;
- 别把业务 IP 加进黑名单,误封自己人比被攻击还刺激。
第十三章 常见服务开放示例
13.1 开放 HTTP / HTTPS
1 | |
13.2 开放 SSH 给指定网段
1 | |
13.3 开放 Cockpit 给运维网段
1 | |
Cockpit 默认端口通常是 9090,但优先使用 service:
1 | |
13.4 开放 PostgreSQL 给应用网段
1 | |
13.5 开放 MySQL 给应用网段
1 | |
13.6 开放 Redis 给应用网段
1 | |
Redis 禁止公网开放。真的别开,开了就像把保险柜钥匙贴门口。
13.7 开放 Prometheus Node Exporter 给监控网段
1 | |
13.8 开放 Java 应用端口
1 | |
如果是内部服务:
1 | |
13.9 开放 NFS
1 | |
NFS 建议只在存储网段开放,不要向公网开放。
13.10 开放 DNS
1 | |
DNS 同时涉及 TCP/UDP 53,优先使用 service。
13.11 开放 Chrony / NTP
如果服务器作为 NTP Server:
1 | |
或者:
1 | |
第十四章 企业端口矩阵设计
14.1 为什么要有端口矩阵
企业里防火墙规则不能只存在于某个运维同学的命令历史里。
应该有明确端口矩阵:
- 服务名称;
- 端口;
- 协议;
- 来源;
- 目标;
- 用途;
- 是否公网;
- 负责人;
- 变更时间。
14.2 应用服务器端口矩阵示例
| 服务 | 端口 | 协议 | 来源 | 目标 | 是否公网 | 说明 |
|---|---|---|---|---|---|---|
| SSH | 22 | TCP | 运维网段 | 应用服务器 | 否 | 运维登录 |
| HTTP | 80 | TCP | 公网/LB | 应用服务器 | 是 | Web 访问 |
| HTTPS | 443 | TCP | 公网/LB | 应用服务器 | 是 | Web 访问 |
| Java App | 8080 | TCP | LB/网关 | 应用服务器 | 否 | 后端服务 |
| Actuator | 8081 | TCP | 监控网段 | 应用服务器 | 否 | 健康检查 |
| Node Exporter | 9100 | TCP | 监控网段 | 应用服务器 | 否 | 系统指标 |
14.3 数据库服务器端口矩阵示例
| 服务 | 端口 | 协议 | 来源 | 目标 | 是否公网 | 说明 |
|---|---|---|---|---|---|---|
| SSH | 22 | TCP | 运维网段 | DB 服务器 | 否 | 运维登录 |
| PostgreSQL | 5432 | TCP | 应用网段 | DB 服务器 | 否 | 数据库访问 |
| Node Exporter | 9100 | TCP | 监控网段 | DB 服务器 | 否 | 系统指标 |
| PostgreSQL Exporter | 9187 | TCP | 监控网段 | DB 服务器 | 否 | 数据库指标 |
14.4 中间件服务器端口矩阵示例
| 服务 | 端口 | 协议 | 来源 | 是否公网 | 说明 |
|---|---|---|---|---|---|
| Redis | 6379 | TCP | 应用网段 | 否 | 缓存 |
| Kafka | 9092 | TCP | 应用网段 | 否 | 消息队列 |
| RabbitMQ | 5672 | TCP | 应用网段 | 否 | AMQP |
| RabbitMQ UI | 15672 | TCP | 运维网段 | 否 | 管理台 |
| Nacos | 8848 | TCP | 应用网段/运维网段 | 否 | 注册配置 |
| MinIO API | 9000 | TCP | 应用网段 | 否/按需 | 对象存储 |
| MinIO Console | 9001 | TCP | 运维网段 | 否 | 管理台 |
14.5 企业建议
- 所有公网端口必须有业务理由;
- 所有管理端口必须限制来源;
- 所有数据库端口禁止公网;
- 所有中间件端口禁止公网;
- 所有 Exporter 端口只允许监控网段;
- 防火墙变更要同步端口矩阵。
第十五章 firewalld 与 NetworkManager
15.1 为什么要一起讲
Rocky Linux 9/10 中,网络连接由 NetworkManager 管理。接口属于哪个 firewalld zone,经常需要和 NetworkManager 一起配置。
15.2 查看连接
1 | |
15.3 查看设备
1 | |
15.4 设置连接 zone
1 | |
15.5 查看连接 zone
1 | |
15.6 多网卡 zone 规划
示例:
1 | |
15.7 企业建议
- 不要只靠接口名判断网络用途;
- NetworkManager 连接名要规范;
- zone 与网段用途保持一致;
- 多网卡服务器尤其要写清楚 zone 规划。
第十六章 firewalld 与 Cockpit
16.1 Cockpit 是什么
Cockpit 是 RHEL/Rocky 系统常用的 Web Console,可以管理:
- 服务;
- 日志;
- 用户;
- 存储;
- 网络;
- 防火墙;
- SELinux;
- 软件更新;
- 虚拟机;
- Podman 容器。
16.2 安装 Cockpit
1 | |
16.3 开放 Cockpit
不建议公网开放 Cockpit。
推荐只对运维网段开放:
1 | |
16.4 访问地址
1 | |
16.5 企业建议
- Cockpit 不暴露公网;
- 只允许运维网段访问;
- 开启 HTTPS;
- 账号权限最小化;
- 操作要纳入审计。
第十七章 firewalld 与 Podman / Docker
17.1 Podman 与 firewalld
Rocky/RHEL 生态中,Podman 是官方更推荐的容器工具。Podman 网络、rootless 容器、CNI/netavark、端口映射等都可能与 firewalld 交互。
17.2 容器端口映射
示例:
1 | |
这表示:
1 | |
如果外部访问不了,需要检查:
1 | |
开放端口:
1 | |
17.3 Docker 与 firewalld
Docker 常常会直接管理 iptables/nftables 规则。和 firewalld 同时使用时,需要特别注意:
- Docker 自己创建转发规则;
- firewalld reload 可能影响容器网络;
- 生产环境需要统一网络策略;
- 不要同时让多人/多个工具各管一套规则。
17.4 企业建议
- Rocky 原生环境优先理解 Podman;
- Docker 环境要统一 daemon 配置和 firewall 策略;
- 容器管理端口不要直接公网暴露;
- 容器内部服务是否暴露,要走端口矩阵审批;
- 使用 Kubernetes 时,防火墙规则要按 CNI 插件单独规划。
第十八章 firewalld 与 Kubernetes
18.1 Kubernetes 是否应该关闭 firewalld
很多 Kubernetes 教程会要求关闭 firewalld。
但企业环境要区分:
- 实验环境可以临时关闭简化问题;
- 生产环境不应无脑关闭;
- 需要结合 CNI、kube-proxy、nftables、iptables 模式规划;
- 需要明确 NodePort、Pod CIDR、Service CIDR、控制面端口、监控端口。
18.2 Kubernetes 常见端口
| 组件 | 端口 | 协议 | 说明 |
|---|---|---|---|
| kube-apiserver | 6443 | TCP | 控制面 API |
| etcd | 2379-2380 | TCP | etcd 通信 |
| kubelet | 10250 | TCP | 节点 kubelet |
| kube-scheduler | 10259 | TCP | 调度器 |
| kube-controller-manager | 10257 | TCP | 控制器 |
| NodePort | 30000-32767 | TCP/UDP | NodePort 服务 |
18.3 示例:开放 kube-apiserver
1 | |
18.4 示例:开放 NodePort 范围
1 | |
18.5 企业建议
- Kubernetes 防火墙规则必须根据集群方案单独设计;
- 不要复制网上一套端口就上线;
- 控制面端口不要向公网暴露;
- etcd 只允许控制面节点访问;
- 监控、日志、Ingress 端口要单独管理;
- CNI 插件文档优先级高于通用教程。
第十九章 firewalld 日志与排查
19.1 查看 firewalld 服务日志
1 | |
实时查看:
1 | |
19.2 查看内核防火墙日志
1 | |
19.3 开启拒绝日志
可以临时开启:
1 | |
查看:
1 | |
可选值包括:
1 | |
关闭:
1 | |
19.4 用 rich rule 记录日志
1 | |
查看:
1 | |
19.5 查看底层 nftables 规则
1 | |
查看 firewalld 相关表:
1 | |
19.6 常见排查命令
1 | |
第二十章 服务访问不了的排查流程
20.1 标准排查路径
当一个服务外部访问不了,不要第一反应关闭防火墙。
按这个流程查:
1 | |
20.2 检查服务是否启动
1 | |
或者:
1 | |
20.3 检查端口监听
1 | |
20.4 检查本机访问
1 | |
20.5 检查 firewalld
1 | |
20.6 检查 SELinux
1 | |
20.7 检查云安全组
云服务器还有一层安全组:
- 阿里云安全组;
- 腾讯云安全组;
- AWS Security Group;
- Azure NSG;
- GCP Firewall。
firewalld 放行了,不代表云安全组也放行。
20.8 排查口诀
1 | |
第二十一章 firewalld 配置文件
21.1 系统默认配置目录
1 | |
包含:
1 | |
21.2 用户配置目录
1 | |
包含:
1 | |
21.3 不建议直接改系统默认文件
不要直接修改:
1 | |
应该复制到:
1 | |
然后修改用户配置。
21.4 查看 public zone 配置
1 | |
21.5 reload 与 complete-reload
普通重载:
1 | |
完全重载:
1 | |
complete-reload 影响更大,可能中断已有连接。生产环境谨慎使用。
第二十二章 备份与恢复
22.1 为什么要备份
防火墙规则属于生产配置,不能只靠命令历史保存。
变更前建议备份:
1 | |
22.2 导出当前规则
1 | |
22.3 查看 nftables 规则
1 | |
22.4 恢复配置
1 | |
22.5 企业建议
- 重要变更前备份;
- 配置纳入 Git 管理;
- 变更单记录命令;
- 变更后保存
--list-all-zones输出; - 建立回滚命令。
第二十三章 与 fail2ban 集成
23.1 fail2ban 是什么
fail2ban 可以监控登录失败、异常请求等日志,根据规则自动封禁来源 IP。
它常和 firewalld 配合使用。
23.2 安装
1 | |
23.3 SSH jail 示例
1 | |
内容:
1 | |
启动:
1 | |
23.4 查看状态
1 | |
23.5 解封 IP
1 | |
23.6 企业建议
- SSH 暴露公网时必须使用 fail2ban 或等效方案;
- 更推荐 SSH 只开放给 VPN/堡垒机/运维网段;
- fail2ban 是补充,不是替代防火墙策略;
- 重要封禁行为要记录日志。
第二十四章 企业最佳实践
24.1 不要关闭 firewalld
不推荐:
1 | |
推荐:
1 | |
24.2 默认拒绝,按需开放
基本原则:
1 | |
24.3 公网服务器推荐策略
公网服务器通常只开放:
- 80/tcp;
- 443/tcp;
- 必要时开放 SSH,但必须限制来源;
- 不开放数据库;
- 不开放 Redis;
- 不开放内部管理后台。
24.4 内网服务器推荐策略
内网服务器也不能裸奔。
推荐:
- 运维端口只允许运维网段;
- 应用端口只允许负载均衡/网关;
- 数据库只允许应用服务器;
- 监控端口只允许监控服务器;
- 备份端口只允许备份服务器。
24.5 不要用 trusted 偷懒
trusted zone 会信任所有连接。
除非你非常确定这个网络完全可信,否则不要把业务接口丢进 trusted。
24.6 不要开放大范围端口
不推荐:
1 | |
这不叫配置防火墙,这叫给攻击面办欢迎仪式。
24.7 规则命名和文档化
每条规则最好能回答:
- 为什么开放?
- 开给谁?
- 开到哪里?
- 谁负责?
- 什么时候开的?
- 什么时候复查?
第二十五章 企业初始化 Checklist
25.1 基础检查
- firewalld 已安装;
- firewalld 已启动;
- firewalld 已设置开机自启;
- 默认 zone 已确认;
- active zone 已确认;
- 网卡与 zone 对应关系已确认;
- runtime / permanent 规则一致性已确认。
25.2 SSH 安全
- SSH 未暴露给全网;
- SSH 只允许运维网段;
- 禁止 root SSH 登录;
- 开启密钥登录;
- 禁止空密码;
- 配置 fail2ban;
- 保留云控制台或带外管理入口。
25.3 Web 服务
- 只开放 80/443;
- 应用后端端口不直接公网开放;
- 管理后台限制来源;
- 健康检查端口限制来源;
- 配置 HTTPS;
- 上游 LB / WAF 规则一致。
25.4 数据库与中间件
- MySQL 不暴露公网;
- PostgreSQL 不暴露公网;
- Redis 不暴露公网;
- Elasticsearch 不暴露公网;
- Kafka/RabbitMQ/Nacos/MinIO 端口限制来源;
- 管理控制台限制来源。
25.5 监控与审计
- Node Exporter 只允许监控网段;
- 应用监控端口只允许监控系统;
- firewalld 日志策略已确认;
- 重要拒绝规则有日志;
- 日志限速已配置;
- 规则变更有记录。
25.6 备份与回滚
-
/etc/firewalld已备份; -
firewall-cmd --list-all-zones已导出; - 变更前有回滚命令;
- 变更后有验证记录;
- 配置纳入 Git 或 CMDB。
第二十六章 企业服务器交付 Checklist
交付服务器时,建议输出如下内容:
26.1 基础信息
| 项目 | 内容 |
|---|---|
| 主机名 | |
| IP 地址 | |
| 系统版本 | |
| firewalld 状态 | |
| 默认 zone | |
| active zone | |
| 业务用途 | |
| 负责人 |
26.2 端口开放清单
| 服务 | 端口 | 协议 | zone | 来源 | 是否公网 | 说明 |
|---|---|---|---|---|---|---|
| SSH | 22 | TCP | internal | 运维网段 | 否 | 运维登录 |
| HTTP | 80 | TCP | public | 0.0.0.0/0 | 是 | Web |
| HTTPS | 443 | TCP | public | 0.0.0.0/0 | 是 | Web |
26.3 防火墙交付命令
1 | |
输出保存:
1 | |
第二十七章 常见问题 FAQ
Q1:为什么服务启动了但外部访问不了?
按顺序检查:
1 | |
如果是云服务器,还要检查安全组。
Q2:firewalld 放行了端口,为什么还是访问不了?
常见原因:
- 服务没有启动;
- 服务只监听
127.0.0.1; - SELinux 拦截;
- 云安全组没开放;
- 上游 LB 没配置;
- 路由不通;
- DNS 解析错误;
- 应用自己鉴权失败。
Q3:修改规则后为什么没生效?
可能是只写了 permanent,没有 reload:
1 | |
或者只写了 runtime,重启后丢失。
Q4:什么时候用 service,什么时候用 port?
- 标准服务用 service;
- 临时端口用 port;
- 多端口业务建议自定义 service;
- 复杂来源限制用 rich rule。
Q5:什么时候用 rich rule?
当你需要表达来源、端口、协议、日志、动作、优先级等复杂条件时,用 rich rule。
Q6:什么时候用 nftables?
大多数服务器不用直接写 nftables。
只有在这些场景考虑:
- 专用网关;
- 复杂 NAT;
- 高性能包过滤;
- firewalld 无法表达的规则;
- 有明确网络安全团队维护。
Q7:可以禁 ping 吗?
可以,但不建议无脑全禁。更推荐只限制公网 ICMP,保留运维网段 ICMP。
Q8:firewalld 和云安全组有什么区别?
| 项目 | 位置 | 作用 |
|---|---|---|
| 云安全组 | 云平台网络层 | 到达服务器前过滤 |
| firewalld | 操作系统内部 | 到达主机后过滤 |
两者都要配置。
Q9:可以把所有接口都放 trusted 吗?
不推荐。trusted 基本等于全放行,除非是完全可信网络,否则不要滥用。
Q10:生产环境可以关闭 firewalld 吗?
一般不推荐。除非你有替代方案,例如专用硬件防火墙、云安全组、主机安全 Agent、nftables 专用规则,并且有完整安全评审。
第二十八章 常用命令速查
28.1 服务状态
1 | |
28.2 zone
1 | |
28.3 service
1 | |
28.4 port
1 | |
28.5 source
1 | |
28.6 rich rule
1 | |
28.7 NAT / 转发
1 | |
28.8 日志
1 | |
28.9 备份
1 | |
参考资料
Rocky Linux Documentation:firewalld for Beginners
https://docs.rockylinux.org/10/guides/security/firewalld-beginners/Rocky Linux Documentation:LXD Server Firewall Setup
https://docs.rockylinux.org/10/books/lxd_server/04-firewall/firewalld 官方网站
https://firewalld.org/firewalld 官方文档:direct rules
https://firewalld.org/documentation/man-pages/firewalld.direct.htmlRed Hat Enterprise Linux 9:Using and configuring firewalld
https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/configuring_firewalls_and_packet_filters/using-and-configuring-firewalld_firewall-packet-filtersRed Hat Enterprise Linux 9:Getting started with nftables
https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/configuring_firewalls_and_packet_filters/getting-started-with-nftables_firewall-packet-filtersRed Hat Blog:A beginner’s guide to firewalld in Linux
https://www.redhat.com/en/blog/beginners-guide-firewalld
启示录
富贵岂由人,时会高志须酬。
能成功于千载者,必以近察远。
防火墙不是麻烦制造机,它只是把系统里那些“默认裸奔”的地方拦了下来。
企业级服务器的安全,不是靠一条神奇命令完成的,而是靠一套稳定、可解释、可审计、可回滚的规则体系。
如果你只是想让服务跑起来,关闭 firewalld 很快。
如果你想让服务长期稳定、安全、可交付,那就应该学会正确使用 firewalld。