生产环境防火墙核心是“管得清、控得住、出得去、查得明”,关键在区域分层、服务封装、永久生效、日志可溯四点:按网卡角色划分区域,服务优先于端口开放,所有变更须永久+重载+留痕,并与fail2ban、连接跟踪、siem联动。

生产环境用防火墙,核心不是“堵得严”,而是“管得清、控得住、出得去、查得明”。firewalld 是主流选择,关键在区域分层、服务封装、永久生效、日志可溯这四点。
按网络角色划分区域,不混用
不同网卡对应不同信任等级,不能全塞进 public:
- 对外服务网卡(如 eth0)设为 public 区域:只开必要端口(80/443/2222),禁用 DNS、SNMP 等非业务服务
- 内网管理网卡(如 eth1)设为 internal 或 trusted:允许 SSH、Ansible 端口、监控探针(如 9100)、配置同步端口
- 数据库专用网卡(如 eth2)绑定 internal 区域,并用富规则限制仅允许应用服务器 IP 访问 3306/5432
- DMZ 区 Web 服务器的外网接口用 dmz 区域,内网接口用 internal,禁止跨区直连
服务管理优先于端口开放
别直接开 8080/tcp,先确认是否已有对应服务定义:
宝塔面板11.3.0是一款针对Linux服务器设计的可视化管理工具,通过重构核心模块实现资源占用显著降低,尤其适合低配置服务器环境。它将复杂的命令行操作转化为直观的图形界面,帮助开发者快速完成网站部署、环境配置及日常运维工作,无需专业技术背景即可高效管理服务器。
- 查系统内置服务:
firewall-cmd --get-services | grep -E 'http|https|redis|mongodb' - 开标准服务(永久生效):
firewall-cmd --zone=public --add-service=https --permanent - 自定义服务(如 Node.js 后端):写
/etc/firewalld/services/api.xml,定义端口+协议+描述,再 reload - 临时调试端口?用运行时命令(不加
--permanent),操作完立刻删掉,避免遗忘
所有变更必须永久+重载,且留痕
生产环境严禁只用运行时命令,否则重启即失效:
- 每条
--add-*命令都必须带--permanent - 执行完批量操作后,统一执行
firewall-cmd --reload - 把每次修改记录到配置管理工具(Ansible Playbook / Salt State)或运维日志中,包含时间、操作人、原因
- 定期校验:
firewall-cmd --list-all-zones对比预期,用diff检查/etc/firewalld/zones/下文件变更
配合监控与防御闭环
防火墙不是孤岛,要和 Fail2Ban、conntrack、审计日志联动:
- 给 SSH 改非标端口(如 2222),并启用 Fail2Ban,
bantime = 86400防暴力破解 - 开启连接跟踪日志:
firewall-cmd --set-log-denied=all,日志落进/var/log/messages,供 SIEM 分析 - 限制并发连接数(用 rich rule):
--add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="22" protocol="tcp" limit value="5/m" accept' - 定期导出当前规则:
firewall-cmd --list-all-zones > /backup/firewall-$(date +%F).log










