Linux防火墙怎样实现自动化运维
小樊
35
2025-12-28 04:49:08
Linux防火墙自动化运维实践
一、总体思路与工具选型
- 选择统一的管理栈:在 RHEL/CentOS 7+/Fedora 优先用 firewalld;在 Debian/Ubuntu 常见 UFW 或直接用 iptables;大规模环境建议引入 Ansible 做编排与合规审计。
- 区分运行时与永久配置:firewalld 的配置有 运行时(立即生效、重启失效)与 永久(重启仍有效)之分,永久变更需 –reload 或设置 immediate=yes 才会立即生效。
- 变更可回滚与幂等:脚本与编排需具备“检查-变更-验证”闭环,避免重复添加、支持回滚与差异对比。
- 安全与可用性:远程操作务必保留 SSH 22/TCP 的应急通道,变更前先备份、分批灰度、变更后即时校验。
二、本地自动化方法
-
firewalld 一键批量与幂等
- 批量开放服务与端口,并立即生效:
- services=“http https ssh”
- for s in $services; do firewall-cmd --permanent --zone=public --add-service=$s; done
- firewall-cmd --permanent --zone=public --add-port=8080-8090/tcp
- firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“192.168.1.0/24” accept’
- firewall-cmd --reload
- 幂等与回滚:用 –query-service/–query-port 先判断是否存在,再决定 add/remove,变更后用 –list-all 校验。
-
UFW 简化管理
- 启用与规则管理:
- ufw enable
- ufw allow 22/tcp, 80/tcp, 443/tcp
- ufw allow from 192.168.1.0/24 to any port 22
- ufw delete allow 22/tcp
- ufw status verbose
- 自动化:将常用命令写入脚本,结合参数化与日志,便于批量执行与审计。
-
iptables 与持久化
- 使用 iptables-persistent/netfilter-persistent 保存与恢复:
- 保存:sudo netfilter-persistent save
- 恢复:sudo netfilter-persistent reload
- 开机自动加载:可配置 /etc/network/if-pre-up.d/iptables 调用恢复命令并赋权,确保重启后规则恢复。
三、批量与编排自动化
-
Ansible firewalld 模块(推荐)
- 典型任务:
- 开放服务/端口(幂等):
- ansible all -m firewalld -a “zone=public service=http state=enabled permanent=yes”
- ansible all -m firewalld -a “zone=public port=8080/tcp state=enabled permanent=yes immediate=yes”
- 关闭规则:
- ansible all -m firewalld -a “zone=public service=ftp state=disabled permanent=yes immediate=yes”
- 优势:声明式、幂等、可并发、可做灰度与回滚,适合 数十至数千台 主机的统一治理。
-
跨平台统一脚本
- 在混合环境(如 CentOS/Ubuntu/macOS)中,先检测 OS 类型 与防火墙后端(firewalld/ufw/pf),再调用对应命令实现“一键查询/启停/放行端口/关闭端口”,并对 timeout 与交互式删除做容错处理,适合做临时应急与小规模标准化。
四、可落地的最小实践
- 场景:为新上线的 Web 主机批量开放 80/443/TCP,仅允许 192.168.1.0/24 访问 22/TCP,其余默认拒绝;变更可回滚、可审计。
- firewalld 方案(幂等)
- 备份与基线
- cp /etc/firewalld/zones/public.xml /root/backups/public.xml.$(date +%F_%T)
- firewall-cmd --list-all > /root/backups/firewall-$(date +%F_%T).txt
- 变更(立即生效且永久)
- for s in http https; do firewall-cmd --permanent --zone=public --add-service=$s; done
- firewall-cmd --permanent --zone=public --add-port=443/tcp
- firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“192.168.1.0/24” port port=“22” protocol=“tcp” accept’
- firewall-cmd --reload
- 校验
- firewall-cmd --list-services | egrep ‘http|https’
- firewall-cmd --query-rich-rule=‘rule family=“ipv4” source address=“192.168.1.0/24” port port=“22” protocol=“tcp” accept’ && echo OK
- 回滚(示例)
- firewall-cmd --permanent --zone=public --remove-rich-rule=‘rule family=“ipv4” source address=“192.168.1.0/24” port port=“22” protocol=“tcp” accept’
- firewall-cmd --permanent --zone=public --remove-service=https
- firewall-cmd --permanent --zone=public --remove-port=443/tcp
- firewall-cmd --reload
- Ansible 方案(并发与一致性)
- 新建 playbook firewall_web.yml:
- hosts: webservers
become: yes
tasks:
- name: 允许 http/https
ansible.builtin.firewalld:
zone: public
service: “{{ item }}”
state: enabled
permanent: yes
immediate: yes
loop: [http, https]
- name: 放行 443/TCP
ansible.builtin.firewalld:
zone: public
port: 443/tcp
state: enabled
permanent: yes
immediate: yes
- name: 仅内网访问 22/TCP
ansible.builtin.firewalld:
zone: public
rich_rule: ‘rule family=ipv4 source address=192.168.1.0/24 port port=22 protocol=tcp accept’
state: enabled
permanent: yes
immediate: yes
- 执行:ansible-playbook -i inventory firewall_web.yml。
五、变更安全与运维建议
- 保留应急通道:任何变更前确认 SSH 22/TCP 可达;必要时设置 维护窗口 与 回滚预案。
- 双写与备份:firewalld 用 –permanent 写入,再 –reload;iptables 用 netfilter-persistent save 备份到 /etc/iptables/;变更前先备份规则文件与当前状态。
- 幂等与可观测:脚本/Playbook 先 query 再 add/remove;变更后用 list/status 校验;关键操作写入 syslog/journald 并保留审计记录。
- 分批灰度与回滚:先小批量验证,再扩大范围;出现异常按备份与回滚步骤快速恢复。