自动化部署linux防火墙需坚持“一次写好、多次复用、持久生效、安全可控”,优先用firewalld(zone/service/rich rule)或ufw,脚本须含策略确认、服务开放、源限制、防暴力、默认拒绝、重载、自检与快照机制。

用脚本自动化部署生产环境 Linux 防火墙规则,核心是“一次写好、多次复用、持久生效、安全可控”。不靠手动敲命令,而是把明确的策略固化成可执行、可审计、可回滚的脚本。
明确策略再写脚本
脚本不是万能胶,它执行的是你已确认的安全策略。动笔前先回答几个问题:
- 哪些服务必须开放?(如 https、ssh、mysql)
- 哪些端口只允许内网访问?(如管理端口 9000/tcp 仅限 10.10.0.0/16)
- 是否禁 ping?是否限制 SSH 连接频率?是否默认拒绝入站?
- 使用 firewalld 还是 ufw?系统版本是否支持
--permanent?
策略定清楚,脚本才不会成为安全隐患的放大器。
firewalld 场景:推荐用 zone + service + rich rule 组合
CentOS/RHEL/Rocky/AlmaLinux 等主流生产系统默认用 firewalld。脚本应优先利用其抽象能力,避免硬写端口号。
- 设置默认区域为
public,并清空临时规则:firewall-cmd --set-default-zone=public && firewall-cmd --remove-service=cockpit - 开放标准服务(自动适配端口+协议):
firewall-cmd --permanent --add-service=https --add-service=ssh - 为内部管理单独建 zone,并绑定源网段:
firewall-cmd --permanent --new-zone=mgmt && firewall-cmd --permanent --zone=mgmt --add-source=10.10.0.0/16 && firewall-cmd --permanent --zone=mgmt --add-port=22/tcp --add-port=9100/tcp - 加一条富规则防暴力破解:
firewall-cmd --permanent --add-rich-rule='rule service name="ssh" limit value="3/m" accept' - 最后统一重载:
firewall-cmd --reload
所有带 --permanent 的操作,重启后依然有效;不加该参数的仅本次运行生效,适合调试。
ufw 场景:适合 Ubuntu/Debian,语法更直白
若用 ufw,脚本重点在顺序与默认策略。注意:ufw 默认策略影响极大,务必最后设置。
- 先允许必要服务:
ufw allow OpenSSH && ufw allow "Nginx Full" - 再按需开放端口:
ufw allow 8443/tcp && ufw allow from 172.16.0.0/12 to any port 5432 proto tcp - 禁 ping(可选):
echo 'DEFAULT_INPUT_POLICY="DROP"' >> /etc/default/ufw && echo 'IPT_MODULES="nf_conntrack_ftp nf_nat_ftp nf_conntrack_irc nf_nat_irc"' >> /etc/default/ufw,再执行ufw limit 22 - 最后启用:
ufw --force enable(--force避免交互提示)
ufw 规则自动持久化,无需额外保存步骤。
验证与防护机制必须内置
脚本跑完不代表万事大吉。生产脚本必须自带“自检”和“熔断”逻辑:
- 检查 firewalld 是否运行:
systemctl is-active --quiet firewalld || { echo "firewalld not running"; exit 1; } - 验证关键端口是否真被放行:
firewall-cmd --list-ports | grep -q "443/tcp" || { echo "HTTPS port not open"; exit 1; } - 添加超时保护:脚本开头加
timeout 60s,防止卡死;关键命令后加|| exit 1 - 保留上一版规则快照:
firewall-cmd --list-all > /etc/firewall/rules-backup-$(date +%Y%m%d).log
没有验证的自动化,等于把控制权交给运气。











