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

用 Ansible 批量配置防火墙规则,核心是把人工操作变成可复用、可验证、可回滚的自动化流程。关键不在“能不能配”,而在于“配得准、配得稳、配得一致”——尤其在多系统(firewalld/iptables)、多环境(测试/生产)、多规则类型(端口/服务/源IP)混合场景下。
一、先识别目标系统的防火墙类型
不同 Linux 发行版默认防火墙不同:CentOS/RHEL 8+ 默认 firewalld,Ubuntu/Debian 常用 ufw,老系统可能用 iptables。硬写死模块会失败。
- 用 command + set_fact 检测运行中的服务,动态设置变量:
systemctl is-active firewalld成功则firewall_type: firewalld,否则查iptables-services或ufw - 避免用 shell 模块直接执行
iptables -A等命令——这类操作不幂等,重复运行会叠加重复规则 - 对 Ubuntu 主机,优先用
ufw模块(更安全易读);对 RHEL/CentOS,用firewalld模块更原生可靠
二、用变量驱动规则,而非硬编码
把规则抽象成数据,便于按环境开关、灰度发布或审计比对。例如:
- 定义
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),比如只允许某 IP 段访问数据库端口:
firewalld: 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,再加firewall-cmd --reload(用 handler 更规范) - iptables 需持久化:RedHat 系列写入
/etc/sysconfig/iptables,Debian 系列用iptables-persistent保存 - 加个兜底任务:执行后用
firewall-cmd --list-all或ufw status verbose抽样校验输出,异常时 fail
四、融入整体安全加固流程
防火墙只是终端加固一环。建议和 SSH 加固、SELinux 策略、内核参数统一编排:
- 用
devsec.hardening这类成熟集合,它已内置 firewall 角色,并自动适配 OS 类型 - Playbook 中按顺序执行:先禁用高危服务 → 再设默认拒绝策略 → 最后放行必要端口,避免中间态敞口
- 对关键业务组(如
[db_servers]),单独定义更严规则变量,避免“一刀切”误伤 - 所有变更加
tags: firewall,方便后期只重跑防火墙部分:ansible-playbook site.yml --tags firewall











