Ansible批量管理防火墙策略需先确认firewalld或iptables类型,再用对应模块统一配置:firewalld场景启用服务、开放端口、重载规则;iptables场景停firewalld、部署静态规则;操作后须验证并加固安全。

在 Linux 中用 Ansible 批量管理防火墙策略,核心是统一控制 firewalld(CentOS/RHEL 7+ 默认)或 iptables(旧系统),避免逐台登录操作。关键不在于写多少命令,而在于让每次执行都达到预期状态、不重复出错、可追溯可回退。
确认目标环境与防火墙类型
先明确被控节点实际使用的防火墙服务:
- CentOS 7/8、RHEL 7/8、AlmaLinux/Rocky Linux 默认用 firewalld,不是 iptables;iptables.service 通常被禁用或仅作兼容层
- 部分生产环境会主动关闭 firewalld,改用静态 iptables 规则(通过
/etc/sysconfig/iptables+iptables-restore) - Ansible 不直接操作底层 netfilter,而是调用对应服务模块——选对模块,事半功倍
批量启用并配置 firewalld
适用于默认启用 firewalld 的场景。以下 Playbook 可一键启动服务、设为开机自启、开放常用端口、重载生效:
- name: 统一配置 firewalld 策略
hosts: webservers
become: yes
tasks:
- name: 启动并启用 firewalld 服务
ansible.builtin.service:
name: firewalld
state: started
enabled: yes
<pre class="brush:php;toolbar:false;">- name: 开放 HTTP、HTTPS、SSH 端口(永久生效)
ansible.posix.firewalld:
port: "{{ item }}"
permanent: yes
state: enabled
loop:
- "80/tcp"
- "443/tcp"
- "22/tcp"
- name: 允许自定义服务(如 redis)
ansible.posix.firewalld:
service: redis
permanent: yes
state: enabled
- name: 重载防火墙使规则生效
ansible.builtin.command: firewall-cmd --reload
changed_when: false
注意:ansible.posix.firewalld 是推荐模块(需安装 pip install ansible-posix 或从 Ansible 2.10+ 自带),比老旧的 firewalld 模块更稳定、参数更清晰。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
批量停用 firewalld 并切换到 iptables 规则
若团队规范要求关闭 firewalld、使用传统 iptables 静态规则,可用如下方式批量停服、清空、加载预置规则:
- 先准备一个标准 iptables 规则文件(如
/tmp/iptables-rules),包含*filter和COMMIT结构 - Playbook 中分步执行:
- name: 停用 firewalld,启用 iptables
hosts: dbservers
become: yes
tasks:
- name: 停止并禁用 firewalld
ansible.builtin.service:
name: firewalld
state: stopped
enabled: no
<pre class="brush:php;toolbar:false;">- name: 安装 iptables-services(RHEL/CentOS)
ansible.builtin.yum:
name: iptables-services
state: present
- name: 分发预定义 iptables 规则文件
ansible.builtin.copy:
src: ./files/iptables-rules
dest: /etc/sysconfig/iptables
owner: root
mode: '0600'
- name: 启动 iptables 服务
ansible.builtin.service:
name: iptables
state: started
enabled: yes
该流程确保所有目标主机规则一致,且不会因手动 iptables -A 导致临时规则丢失。
验证与安全加固建议
批量操作后务必验证效果,并加入基础防护逻辑:
- 用
ansible webservers -m ansible.builtin.command -a "firewall-cmd --list-all"快速抽检规则 - 禁止开放高危端口(如 23/TELNET、139/445/SMB、3306/MySQL 外网暴露),可在 Playbook 中加
when条件判断环境标签 - 生产环境建议配合
handlers:只有规则真正变更时才 reload,减少无效操作 - 敏感操作(如清空所有规则)应加
vars_prompt交互确认,或限定只在staging组执行
不复杂但容易忽略:批量改防火墙前,确保 SSH 端口已放行且未被误删——否则可能集体失联。

















