DDoS攻击和CC攻击是目前最常见的网络攻击,是站长们最头痛的恶意威胁之一,特别是中小型网站:个人博客,小企业站,开发者项目站。
一般站长们在网络防御方面意识较薄弱,一旦遭遇黑客入侵或竞争对手/同行恶意攻击,网站将会受到很大的影响,甚至导致服务器崩溃,网络服务中断。
一些靠搜索引擎排名流量吃饭的网站更是生死攸关:网站被CC攻击长时间无法正常访问(L3/4流量攻击则一般达到阈值IDC会空路由自保),导致好不容易上来的关键词排名逐渐消失,网站访问量减少,最终导致网站消失在搜索引擎中。
山雨欲来风满楼
服务器IP暴露的情况下每天收到各种扫描,弱口令以及莫名DDoS攻击不堪其扰,作为个人博客无力抵抗DDoS的情况下,乖乖切换到了Cloudflare这个提供免费 DNS、免费 CDN、免费无限(不计量不计价) DDoS防御的业界良心怀抱。藏好服务器IP安逸过小日子。
好景不长啊,在使用满配Cloudflare乞丐(Free)版后遇到了死磕CC攻击的大佬,可怜站长目前挂博客这垃圾配置(1H512MB)的VPS性能不好也就算,大并发CC攻击的情况下居然不是因为CPU/内存高占,而是对外QPS达到了IDC流量阈值被IDC空路由导致博客无法访问了,邮件通知24小时恢复。这还玩个锤子。发TK发邮件死皮赖脸提前给解了。
一瞧瞧访问日志,乖乖大侠不给活路。秒秒钟大几万的并发请求打过来。小时内 1W+IP 来了20KW请求(峰值7KW/分钟)。有自知之明的站长知道咱这小透明博客(上次更新是在三年前)打死一天访客IP没破过万不是。这掺水/加料太明显太坏了。机器日志+后续开启CF入站防火墙后的日志可以看到IP地址都是些海外莫名奇妙地区的IP/URL没有明显地区特征。可能是网上搜刮的公共代理IP,可能是“土豪”不知道哪里“买来的量”要教育一下。
怎么办?如何解决?还能不能抢救一下?在线等,急!
我正在被攻击!

基于Cloudflare防火墙API的四步CC流量清洗方案
第一步:在确定源站IP没有泄露的情况,果断上Cloudflare报了警(告诉防火墙:我正在被攻击!)。随即5s盾应声开启网站所有请求全部进行JS验证。流量负载刷刷往下降。
第二步:分析网站日志提取攻击者IP:一句话从日志中统计相同IP的访问次数并按从小到大排序输出一窝怼的最凶的IP地址到/tmp/attack/ips.txt
第三步:作为Free版用户很明显只有看API文档写脚本才能微笑着活下去,批量提交IP到Cloudflare防火墙黑名单,BASH SHELL代码实现如下:

#!/bin/bash
# Author: Zhys
# Date  : 2018

# 填Cloudflare Email邮箱
CFEMAIL=""
# 填Cloudflare API key
CFAPIKEY=""
# 填Cloudflare Zones ID 域名对应的ID
ZONESID=""

# /tmp/attack/ips.txt存放发起CC攻击的IP列表
# IP一行一个。由之前AWK日志分析得到,IPv4/IPv6不少呢
IPADDR=$(</tmp/attack/ips.txt)

# 循环提交 IPs 到 Cloudflare  防火墙黑名单
# 模式(mode)有 block(屏蔽), challenge(reCAPTCHA验证码), whitelist(白名单), js_challenge(js人机验证,俗称:5秒盾)
for IPADDR in ${IPADDR[@]}; do
echo $IPADDR
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" \
  -H "X-Auth-Email: $CFEMAIL" \
  -H "X-Auth-Key: $CFAPIKEY" \
  -H "Content-Type: application/json" \
  --data '{"mode":"challenge","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'
done

# 删除 IPs 文件收拾干净
rm -rf /tmp/attack/ips.txt
说明: 因Cloudflare有关IP防火墙规则的API暂未对外开放批量提交管理功能,在短期大批量提交更新时将受限,请酌情根据自身需要基于Cloudflare API自主开发定制使用,此API依旧正常可用,但博客目前已弃用此方法

第四步:解除Cloudflare的5秒盾全站防御状态,恢复搜索引擎对网站的正常访问抓取。
活下来
Ps:在极端情况下(攻击者损失一部分性能针对Cloudflare的通用5秒盾搞了绕过:解析js执行完成人机验证)可以切换开启人机验证:谷歌验证码模式

以上就是网站遇到CC攻击临时救急的半自动流量清洗的完整思路,后续看是否发个基于Cloudflare+Openresty的实时流量统计分析自动IP过滤。
So,开心一点,本站又多活了几天。

相关注释与说明
本文区分DDoS攻击与CC攻击,实际上,这里的DDoS攻击是代指以网络L3/4层为主的流量攻击(俗称:打IP,打服务器),CC攻击代指以L7应用层为主的攻击(俗称:打网站)
正确解释,DDoS攻击应该代指互联网中所有形式的分布式拒绝服务攻击,流量攻击/CC攻击都归属为其子集,但在一般口语化沟通交流时为了区分两者差异默认提到DDoS一般是指分布式网络L3/4层的流量攻击(原因是它最先流行并广为人知)

后记:
emm,虽然CF的API文档很标准且齐活,看得出来很多站长朋友对于Cloudflare的API文档很烦(全英文,加载慢)陆续有人反馈:觉得脚本用的不方便、全局API KEY不知道乍找、能不能来个批量添加域名解析的脚本、怎么开CF的验证码模式?英文很难受搞成中文对用户更友好些,可不可以改一下(自定义)5秒盾页面?…
事头有点多,行吧,Cloudflare现成的API用起来就是一把梭,一口气申请了CF合作伙伴/优化商,然后咱搞了个:SuCloud宿云基于Cloudflare的免费在线CDN管理面板 · CF.宿云:基于Cloudflare API实现的在线CDN/DNS中文管理面板
创建的目的是:Cloudflare可以用的更方便一点,功能可以更多一点,对Cloudflare国内用户更友好一点
功能上:支持CNAME接入(基于CloudFlare Partner(合作伙伴)计划)
在线交互体验上:尽量全面吸收Cloudflare官方管理面板好的交互,陆续加上之前用户社区反馈的DIY功能。
苦恼Cloudflare脚本用着难受且不方便的朋友可以去试试看,关于CF的使用欢迎站长在TG上实时反馈问题,提出使用建议。

comment-author avatars

Zhys

Cherish the time! Don't waste even nine seconds to remember the past, live in the present and for the future planning.

猜你喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

邮件通知