ansible自动配置防火墙规则的核心是实现可复用、可验证、可回滚的自动化流程,关键在于动态识别防火墙类型、变量驱动规则、服务与规则同步生效、融入整体安全加固流程。

用 Ansible 自动配置防火墙规则,核心是让规则可复用、可验证、可回滚,而不是简单执行几条命令。重点在于适配不同系统、驱动规则靠变量、确保服务与规则同步生效。
自动识别防火墙类型
不同系统默认防火墙不同:RHEL/CentOS 8+ 用 firewalld,Ubuntu/Debian 常用 ufw,老系统可能直接用 iptables。硬写死模块会失败。
- 用 command + set_fact 检测运行中的服务,比如
systemctl is-active firewalld成功则设firewall_type: firewalld - 对 Ubuntu 主机优先用 ufw 模块,语义清晰且安全;RHEL 系列用 firewalld 模块更原生
- 避免用 shell 模块直接跑
iptables -A—— 不幂等,重复运行会叠加重复规则
用变量定义规则,不硬编码端口和服务
把规则变成结构化数据,方便按环境开关、灰度发布或审计比对。
- 定义
firewall_rules变量为列表,每项含type(port/service/rich_rule)、port、source、state(enabled/disabled) - 生产环境可关 SSH:
{ type: "port", port: "22", protocol: "tcp", state: "disabled" };测试环境保留state: "enabled" - 支持富规则,例如只允许某网段访问数据库:
rich_rule: 'rule family="ipv4" source address="10.10.0.0/16" port port="3306" protocol="tcp" accept'
确保服务状态与规则真正生效
加了规则但服务没启、没重载,等于白配。
- 显式控制服务:
service: name=firewalld state=started enabled=yes - firewalld 规则必须设
permanent: yes+immediate: yes,再通过 handler 或 command 执行firewall-cmd --reload - iptables 需持久化:RedHat 系列写入
/etc/sysconfig/iptables,Debian 系列用iptables-persistent保存 - 加校验任务:如
firewall-cmd --list-all或ufw status verbose抽样检查输出,异常时fail
融入整体安全加固流程
防火墙不是孤立操作,应和 SSH 加固、SELinux、内核参数统一编排。
- 复用成熟角色,比如
devsec.hardening集合,它已内置 firewall 角色并自动适配 OS 类型 - Playbook 中按顺序执行:用户创建 → SSH 密钥认证 → 系统更新 → 防火墙配置 → 内核调优 → SELinux 设置
- 所有步骤保持幂等性,反复运行结果一致,不会因多跑一次导致锁死 SSH 或规则重复叠加











