用 Bash 脚本自动开关 Cloudflare DDoS 防护:基于 Introduction to Bash Scripting 的实战演练
【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting
本篇技术指南以开源电子书Introduction to Bash Scripting(仓库路径 ebook/pt_br/content/019-working-with-cloudflare-api-with-bash.md)中的「Working with Cloudflare API with Bash」一章为主体,讲解如何用 Bash 脚本监控服务器 CPU 负载,并在遭遇攻击(CPU 飙升)时通过 Cloudflare API 自动启用"Under Attack"(DDoS 防护)模式、负载恢复后自动关闭。读完本文,你将掌握 Cloudflare API 鉴权要素、curl 调用方式、脚本落地与 crontab 定时调度的完整实战方案。
一、章节背景:为什么用 Cloudflare API + Bash
在真实生产环境中,许多个人站长和中小团队会把网站托管在云服务器(如 DigitalOcean Droplets)上,同时用 Cloudflare 作为 CDN 提供商。Cloudflare 的核心价值有两点:
- 降低回源流量:用户请求由 Cloudflare 边缘节点就近响应,源站带宽压力大幅下降;
- 隐藏源站 IP:源服务器真实 IP 被 CDN 屏蔽在背后,降低被直接攻击的风险。
本章作者特别强调,Cloudflare 免费提供的DDoS 防护是最实用的功能之一,曾多次在真实攻击中保护服务器。而 Cloudflare 提供了完善的 HTTP API,可以编程式地开启 / 关闭防护模式——这正是 Bash 脚本发挥作用的场景。
本章以"挑战(Challenge)"形式呈现:不直接给出完整脚本,而是要求读者先自己动手写一个能自动开关 DDoS 防护的脚本,再与参考实现对照。
二、前置条件:账号、密钥与 Zone ID
在编写脚本前,需要准备以下三样东西(原文档 中已列出):
- 一个 Cloudflare 账号(并已把网站接入 Cloudflare,即添加了 Zone);
- Cloudflare API Key:用于 API 鉴权的密钥;
- Cloudflare Zone ID:对应网站区域的唯一标识,Cloudflare 仪表盘中对应域名概览页可找到。
确认 curl 已安装
脚本通过 curl 调用 Cloudflare REST API,因此服务器上必须装有 curl。先用版本号验证:
curl --version若未安装,按发行版选择安装命令:
- RedHat / CentOS 系列:
yum install curl- Debian / Ubuntu 系列:
apt-get install curl三、挑战需求:CPU 负载驱动的自动防护
本章的脚本需求非常明确,可以拆解为三条核心功能(原文档 原文):
- 监控服务器 CPU 负载:定期读取系统负载,并与 vCPU 核数对比判断是否"过高";
- CPU 飙升时自动启用防护:一旦检测到异常尖峰,立即调用 Cloudflare API,为指定 Zone 开启 DDoS 防护("I'm under attack" 模式);
- 负载恢复后自动关闭:当 CPU 负载回归正常,再次调用 API 把安全级别恢复到正常模式。
设计思路的合理性在于:DDoS 攻击(如流量洪泛)通常会导致服务器 CPU 负载瞬间飙高;反过来,用负载作为攻击信号的"代理指标",无需额外监控服务即可实现一定程度的自动防御。
从实现角度,一个典型的判定逻辑是将系统负载平均值与 vCPU 核数比较:负载持续高于核数说明系统过载,脚本就触发防护开关。这也是本章选择"根据 vCPU 数量判断 CPU 使用率高低"(原文:if the CPU usage gets high based on the number vCPU)的原因。
四、参考脚本:下载、配置与授权
原文档作者准备了一份演示脚本protection.sh,用于对照学习。建议先自己动手写,写不出来再参考——这是本章刻意设置的练习节奏。
4.1 下载脚本
wget https://raw.githubusercontent.com/bobbyiliev/cloudflare-ddos-protection/main/protection.sh4.2 编辑并填入 Cloudflare 凭据
用任意文本编辑器打开:
nano protection.sh将文件顶部的三个占位变量替换成你自己的 Cloudflare 信息(注意原文档中变量名CF_CONE_ID系 Zone ID 的拼写,实际含义即CF_ZONE_ID):
CF_CONE_ID=YOUR_CF_ZONE_ID CF_EMAIL_ADDRESS=YOUR_CF_EMAIL_ADDRESS CF_API_KEY=YOUR_CF_API_KEY三个变量的作用:
| 变量 | 说明 |
|---|---|
CF_CONE_ID | 目标网站的 Zone ID,决定 API 操作作用于哪个站点 |
CF_EMAIL_ADDRESS | Cloudflare 账号邮箱,API 鉴权所需 |
CF_API_KEY | API 密钥,与邮箱一起用于身份验证 |
安全提示:API Key 等同于账号的部分操作权限,脚本中建议以环境变量或受限权限的 Token 方式注入,避免明文写入后随仓库泄露。
4.3 赋予可执行权限
chmod +x ~/protection.sh五、定时调度:用两条 cron 实现 30 秒检查间隔
cron 最小粒度是 1 分钟,但 DDoS 防御需要更快的响应。原文档给出的技巧是用两条 cron 任务错开 30 秒:
crontab -e加入以下内容:
* * * * * /path-to-the-script/cloudflare/protection.sh * * * * * ( sleep 30 ; /path-to-the-script/cloudflare/protection.sh )原理拆解:
- 第一条在每分钟第 0 秒执行一次脚本;
- 第二条同样在每分钟执行,但先用
sleep 30阻塞 30 秒再运行脚本; - 两条任务合在一起,等效于每 30 秒检查一次服务器负载。
注意将/path-to-the-script/cloudflare/protection.sh替换为脚本实际存放的绝对路径(原文档明确提示了这一点)。
六、局限性与演进方向
原文档在结论部分非常坦诚地指出了该方案的两个关键边界:
- 攻击导致服务器无响应时脚本可能无法触发:如果 DDoS 已经打满带宽或使系统卡死,本机 cron 与脚本根本来不及运行,防御就失效了;
- 更稳妥的方案是接入外部监控系统:例如 Nagios 这类独立于被攻击服务器的监控平台,由它根据统计指标远程触发脚本(或直接调用 Cloudflare API)。
因此,本文方案定位是"轻量、零成本、适合学习与个人站点"的过渡方案,而非面向高可用生产环境的最终答案。它最大的价值在于:把 Bash 脚本、cron 调度、外部 REST API 鉴权调用这几个能力串成了一个完整的自动化闭环。
七、仓库佐证:这本书如何保证脚本质量
本文所在仓库introduction-to-bash-scripting对书中所有 bash 代码块有严格的质量校验机制,这从侧面印证了本章脚本的可信度:
- 仓库提供了 scripts/shellcheck-ebook.sh,它会从英文版各章节 markdown 文件中提取所有
bash代码块,逐块运行 shellcheck 静态检查; - 该脚本对教育场景做了针对性豁免(如
SC2034变量未使用、SC2154变量未赋值等,因为片段教学需要跨示例定义变量),并自动跳过 crontab 语法行与故意展示的错误示例——这正是本章第 5 节两条 cron 任务不会被误报为 shellcheck 错误的原因(脚本第 33 行注释明确提到SC2211 - glob used as command (crontab syntax lines)); - 检查未通过时脚本返回退出码 1 并输出具体告警,通过则提示
All blocks pass shellcheck.,确保全书示例"可复制、可运行"。
此外,本章属于电子书的"实战章节"序列:前一章 018-working-with-json-in-bash-using-jq.md 已经演示了curl ... | jq解析 REST API JSON 响应的方法——处理 Cloudflare API 返回的 JSON 结果时同样可以沿用这一套路。电子书章节清单见 README.md,构建配置(书名、作者、样本页范围)见 ebook/pt_br/ibis.php。
八、总结
回顾本章核心要点:
- 准备工作:Cloudflare 账号、API Key、Zone ID,以及服务器上的 curl;
- 脚本逻辑:定期读取 CPU 负载并与 vCPU 核数比较,异常时通过 Cloudflare API 开启 "Under Attack" 防护,恢复后关闭;
- 落地方式:
wget下载参考脚本 → 填入凭据 →chmod +x→ 用两条 cron 错开 30 秒实现每 30 秒一轮检查; - 认知边界:本机方案在服务器完全无响应时会失效,生产环境应结合 Nagios 等外部监控平台。
对学习者而言,动手实现本章脚本,等于完成了一次"Bash + 外部 REST API + 系统资源监控 + 定时任务"的综合训练——这正是 Bash 脚本自动化 SysOps / DevOps 日常工作的典型缩影。
【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考