前言 / 叠甲
我反对任何使用 DDoS 勒索人,或者干一些违法的事情。就算没有勒索,请确保当你在实验的时候,你已经获取到当事人的同意。
本人也不是什么专业的人,因此,本文章说的可能有些错误,本人也虚心学习,这个才是论坛应该有良好的环境。
DDoS 攻击和 CC 攻击的分别
严格来说,CC 是在 DDoS 之下的,也就说 CC 是实现 ddos 攻击的方法之一。但是广义上来说,DDoS 一般指的是使用 Level 3 或者是 Level 4 的攻击,比如说属于 Level 3 的攻击就有 ICMP Flood、IP Fragment Flood,属于 Level 4 如 SYN Flood、UDP Flood 这些。而 CC 攻击基本上都是说 Level 7, Application layer 的攻击,最常见的就是 HTTP(S) Flood。
所以从现在开始,我将使用 DDoS 表示 l3/l4 的攻击,cc 表示 l7 的攻击
我买了一台厂商宣传有高达 xxx Gbps/Tbps 的 DDoS Protection 的 VPS,我建站是不是就可以高枕无忧了?
一般来说,除非厂商有特别说明,要不然一般默认就是只有 Level 3 / Level 4 的清洗。甚至是高防 VPS,也不一定能防御 DDoS 的流量,因为本质上对抗 DDoS 的攻击,就是如何确认你是好人,你是坏人,这个规则不可能完全 100% 区分出来,所以就是看厂商如何取舍。比如说 OVH 也是能绕过,听说他的原理,是使用小包的方式,来绕过 OVH 的清洗规则,直接把你给打死。原理虽然不是很清楚,但是道高一尺魔高一丈,世界上任何清洗的规则都不是完美的,只是看如何取舍。
我的 VPS 正在被 DDoS ,有什么方法可以防御吗?
没有,建议加钱
我的网站,套了 Cloudflare 是不是就完全 100% 打不死了?
不,如果你的网站没有任何的规则,呢么 cf 的作用就不是帮你抵御 cc 的攻击,而是帮你节省流量的 cdn 而已。
CDN ≠ 可以抵御 cc 攻击,部分 CDN,抵御 cc 的攻击甚至是要加钱的,相对来说 Cloudflare 已经是很良心了。
Cloudflare / CDN 不是能隐藏原站IP吗?怎么还能打死?
是,但是他打你是 cc 攻击,而这类的攻击方式重点不是在你的 IP,而是在你的 IO,CPU,内存上。因此,他并不能完全保护你
Cloudflare 不是说可以防御 DDoS / CC 吗?怎么还能打死
这个就是重点了。
首先,Cloudflare 是一个为全球服务的一个 CDN。这就是什么意思呢,意思是任何基于 Level 7 的东西,都可以用 cf 来保护。因此,cf 默认的规则可以说是没用的,默认的如果我没记错就只有一些 0day 和 sql inject 的防御。这种防御因为是高位的,而且肯定是只有坏人才会使用的所以默认的规则就可以针对这些直接断开连接。
但是,以上说的和防御 ddos/cc 没有任何关系。首先关于 ddos 这类 l3 l4 的攻击。如果你是确定你套了 cf 并且源站没有泄露,呢么你就不用担心了。但是对于 cc 攻击针对 l7 的,情况就有点复杂了。
首先,你要知道缓存是如何实现。
本质上就是首先要有一个人,先访问了这个页面,你的源站处理了后,返回给 cdn,cdn 记得了,cdn 返回给用户。大概的示意图就是这个样子。(大致是这个样子,有点抽象)

这就是缓存的基本原理,有人访问过,一般网站就那几个路径是有内容的,因此,cf 就能记得上整个网页,然后节省你源的流量。
随即路径攻击法 (Random Path Attack)
现在聪明的你发现了什么问题了吗?没错,就是要有人访问先,只要我一直访问一些 cf 没缓存的内容,那不就可以绕过 cf ,直接到达源吗?没错,这个就是 Random Path Attack。 而你的源,如果没有很好的处理这种情况,就会导致一直要请求数据库来确认这个是不是 404,从而达到拖累 CPU ,进而导致其他人的请求无法访问。比如说 wordpress 这类很臃肿的东西,基本上只要这种情况下,他就爆死了。
| 缓存了 | 没缓存 |
|---|---|
![]() |
![]() |
Cookie Injection 绕缓存
好,现在你已经了解了 Random Path Attack。那我们就来学习一个新的东西。
回到去那张图,你有没有发现到什么还可以攻击的地方?没错,登入状态。比如说,大家都是访问谷歌,你登入了你的账号,呢么你的东西指定是和我的不一样。而登入状态通常都是使用 cookie 来验证的,因此带 cookie 的请求通常会绕过缓存,返回个性化内容。理论上,如果攻击者频繁发带随机生成的 cookie 来请求页面,可能导致缓存失效,增加后端压力。但是,还要看具体架构和防护策略。而现代系统多为前后端分离,前端页面一般是通用模板,通过 API 拉取动态数据,所以这个有点玄学。
Query String 绕缓存
如果使用 wordpress 搭建网站,应该有注意过,默认 wp 的搜索是使用 /?s={搜索的内容} 吧。没错 /?s= 这个就是 query string。这个对于 cdn 来说,就是 query string 可能会返回不同的内容,比如说,a 访问了 https://example.com/ ,而 example.com 是一个 wordpress 站点,然后 a 在这个 wp 站点上搜索了 a 这个。因此这个页面的 url 就变成了 https://example.com/?s=a ,然后显示搜索结果。这个请求对于 cf 来说,path 还是 / 但是因为有 query string,因此 / 的缓存就不能用在带有 query string 的请求上。因此就成了绕缓存。这个只是对于 wp 的情况,攻击搜索,但是其他非 wp 的,情况又不一样了。
很简单,cf 认为有 query string 的缓存和不带 query string 的缓存是不一样的东西,呢么,只要我请求上本站容量最大的东西,比如一个 .img 可能有 2mb ,他的路径是 https://example.tuchuang.com/tupian.img ,对于一般的访客来说,他只是请求这个,但是对于攻击者来说,每一次请求的时候,带个随机的 query string 比如说 https://example.tuchuang.com/tupian.img?id=1001 这类的请求,cf 就会认为他也是一个动态的页面,从而绕过缓存。这下子,问题就大了。你的后端如果没有处理好,也就是默认的状态,会忽略掉 query string 的东西。从而一直发送这个图片,但是攻击者一次过都是几千上万的并发,这个时候,你的带宽就会满了,然后你的站点就 GG 了。
Cloudflare 不是还有 HTTP DDoS attack protection 我开了不就没事了?
这玩意,对于 Cloudflare 套餐是 Free,只能说有用但不多,因为很多规则都是只提供给 Pro, Buisness 等等的付费套餐。而且,这个玩意在 rps (rate per second) 小于 600 的情况下,是很难被触发出来的,小于600能被触发出来,就是这个工具已经是烂大街了。而 Free 的用户,如果当你收到这个 email 的时候,大概率你的站已经飞了,因为已经漏了很多请求到源了 

一些基本的防御
对于第一的随即路径,很多时候,你只要弄好 nginx 的配置,不要让他到达后端,基本就没事了。
对于第二和第三的,你可以在 cloudflare dashboard 上 cache rules 里面按照你的需求来。
| 自定义缓存规则 | 缓存忽略 query string |
|---|---|
![]() |
![]() |
当然最重要的还是速率限制,但是 cloudflare free 的,没有记错只能限制 10 秒,所以如果你是 cloudflare free 速率这种东西,你还得本地做。
然后对于 Pro (不确定) / Buisness / Enterpise 的套餐,你还可以在 Security -> Settings 左手边的位置,直接限制 cf 认为的人机请求,比如直接 block 或者质询,这玩意的准确率确实牛逼,测了几个 bot 基本上都绕不过这玩意。而且还是实时更新的,如果你是这几个套餐,真心建议开
总结
还有很多攻击方法,是我不知道,或者是我没详细说,因为我不清楚的。比如说,通过 ua 的变种,来让 cf 跨设备的缓存是 miss 等等的攻击。
Free 被打没有任何规则,存活率只有 1%,Free 有规则,但是只有在 cf 内的规则,存货率 10%,对于 free cf 和 本机都有防护的,能到 40% 的存活率(这种情况就是全靠你本机了,IP 量大了还是得死)。pro / buisness / enterpise 这类的,默认的规则就很够了,尤其是 Bot traffic 这个。反正呢么多下来,就是一句话,要防御,得价钱 





好文
先收藏一波
@Na #3
我的规则是,在一分钟内访问 / 如果超过 10次,那就质询,到访问 4xx 的错误,10秒超过两次,就封1分钟。我的规则主要就是速率,剩下的就交给 cf。但是我的规则估计也没什么参考性,因为我的 cf 套餐不是 free ,而 cf free 的速率只有一个规则,也限制不了哪么长的时间
但是把,规则这个东西不能直接抄作业,最重要的还是看你网页的需求。就比如说,你部署的整个网页,是全程不需要用到 query string 的,哪么就可以 ignore query string 的缓存方式。但是如果你还是需要,比如我之前提过的 wp,那就不能通过一刀切的方式去 ignore 他。速率的实现也是,因为有些程序是一直要频繁的去 get 更新数据,所以你需要白名单一些 api 的路径。