经历 1000000000 次 DDoS 请求攻击后,我总结了三条经验

2025 年 4 月 24 日到 5 月 5 日期间,我的站点突然遭遇了一波极其猛烈的 HTTP Flood 攻击(被攻击记录,总请求数达到了 1.44B+)。最夸张的一刻,峰值一度冲到每秒 3120 次请求(根据 CloudFlare 的邮件通知)。这真的是一场难以忘记的风暴。事后,我把整个过程捋了一遍,总结了三条经验和避坑要点。如果你有一天也遇上这种情况,或许能帮上点忙。

确保遵循安全原则

安全原则:不要与蠢人辩论,要特别小心网络地雷,并当心这类网络组织

确保 CDN 具备防护功能

一定要选带有安全防护的 CDN,也就是 SCDN。这里说个我自己的典型“反面案例”:

  1. 一开始我使用的是多吉云的 CDN,其封顶措施仅针对流量,无法根据请求数进行有效限制。在遭遇 CC 攻击时,虽然设置了 QPS 限制,但请求数仍然在瞬间被消耗殆尽(并且由于结算存在延迟,只需在 5 分钟的结算延迟窗口内持续刷流量,就完全不会触发封顶设置。对此向客服咨询后,得到的答复是技术限制所致)。最终,封顶机制未被触发,额度用尽后账户立即进入欠费状态。在被 CC 攻击的整个过程中,平台并未提供任何实质性的防护措施。
  2. 我联系客服,客服建议说“你把攻击 IP 拉到黑名单就不会计费了”。然而黑名单居然有上限,根本无法应对大规模攻击。
  3. 于是很尴尬:没防住攻击,也没能及时下线,还额外“亏”了 100~200 块钱费用。要知道,这点钱都够在某大厂 SCDN 个人版用一年(大厂 SCDN 一年才 100.98 元)。

一般而言,普通 CDN 是按所有流量和请求收费,包括正常和攻击流量;SCDN 则是在安全清洗后,只对正常流量和请求计费,对钱包和安全更友好。目前我站迁移到了 WAF.SB。在实际使用中,无论速度还是稳定性都表现优秀,基于 FlexCDN 系统支持较为细致的规则配置,在本站抵御 DDoS 攻击时发挥了重要作用。

确保配置可靠 WAF 规则

在部署 SCDN 后,务必配合可靠的 WAF(Web 应用防火墙)规则。合理的规则不仅可以实现近源清洗,有效减少回源请求,显著减轻源站压力,同时还能保障正常流量的顺利通过。

借助小絮分享给我的 CloudFlare 规则及 IP 黑名单,我能够有效过滤掉绝大部分恶意请求(高达 99.8%)。同时,XAY 赞助 SCDN,收集到的样本也帮助我进一步完善了防御规则。监控发现,这次攻击全部采用了类似的手法,即构造大量带有不同查询参数的请求,例如:

/?Yh7Fy=5PzufQSA292ZC3gHQ46CJKYQf
/?8qvup=v9ddCspC6SNrlt0U5l86U9p0u
/?pGLKg=7PjbTEAUvgDDqdImWhNRhCvNW
/?mNvFi=AnYthHORM50jiDOnksKLtk3cq
/?4QQMV=I8rmjEfl2EuKW1OfKdygjQ0Y6

因此,我建议各位站长在配置 CDN 缓存时尽量忽略查询参数,以提升防护效果。

当然,“世上没有万无一失的防护”。攻击手法不断变化,CDN 节点策略也可能会有同步延迟。因此,建议再叠加本地 WAF,实现双重保护。这样不仅可以及时手动封禁可疑 IP,还能进一步防止恶意请求渗透到源站,提升整体安全性。

附录

小絮分享的 CloudFlare 规则

采取措施可以设置为质询/禁止。

经过多日测试,质询通过率几乎为 0%(实际质询通过只有 2 次,都是我找在俄罗斯的朋友来帮忙测试产生的)。

规则 1:

(ip.geoip.continent eq "AF") or (http.user_agent contains "Mozilla/4.0") or (not http.request.method in {"GET" "POST" "OPTIONS" "HEAD"}) or (ip.geoip.country in {"BR" "BG" "CA" "DE" "IN" "ID" "IE" "MX" "NL" "PH" "RU" "TH" "VN" "T1" "UZ"}) or (ip.geoip.asnum in {45753 47890} and not cf.client.bot) or (ip.geoip.asnum in {12816 12786 18450 197540 24961 26496 35908 46606 54600 60068 22773 18978 7922 61317 6079 397391 46562 22616 26347 45916 22394 202594 40676 398101 396362 6167 54290 135981 21686 7303 138997 22418 140224 46475 20001 43959 41378 29802 10013 9824 4766 209 43260 7565 40676 3786 28438 13287 3786 24641 7925 60068 200373} and not cf.client.bot) or (ip.geoip.asnum in {14061 20473 2914 16276 24940 8100 45102 36352 135377 63949 54994 3462 35908 14618 16276} and not cf.client.bot)

规则 2:

(ip.geoip.asnum in {6060 6729 7411 9164 11331 11938 17447 22801 23865 24426 24567 25288 26561 26701 27524 30490 32177 32558 34465 34888 34985 35624 35718 35830 37707 38149 38337 38946 39720 40193 40403 40665 40963 41155 41947 42192 42419 42505 42624 42694 43444 43463 43613 43668 43743 44317 44386 44774 44801 44853 46664 47893 47926 47945 48090 48198 48589 49042 49217 49316 50236 50308 50935 51045 51124 51381 51396 51447 51490 53958 55020 55748 56291 56873 57097 57415 57467 57509 57523 57678 58854 59425 59683 60842 61302 61432 61879 62864 63881 64425 131750 132574 132781 132827 132930 133320 133488 133668 133692 133883 133994 135271 135752 136231 136367 136923 137156 138687 138749 138808 138915 139660 139789 140125 140155 140184 140208 140666 140787 140941 141333 141567 141803 141835 141836 141853 141875 142002 142062 142430 142519 146999 147186 147211 147287 147291 149181 149196 149197 149208 149242 149286 149434 150030 150036 150082 150091 150100 150604 150813 150860 151604 152149 152170 152192 152194 152327 152485 152486 153318 197450 197555 198375 198571 198578 198953 199420 199598 199654 200010 200373 200514 200593 200699 201249 201380 201572 201626 202171 202267 202302 202318 202383 202388 202425 202481 202685 202972 203120 203346 203959 203999 204057 204428 204487 204490 204502 204552 205083 205124 205663 205835 205911 206017 206068 206371 206728 207084 207088 207566 208046 208198 208312 208485 209121 209605 209737 210240 210530 210644 210756 210848 210919 210950 211121 211199 211238 211619 211673 211720 211762 211849 211922 212283 212448 212651 212867 213058 213257 213354 213371 213373 213389 213438 213511 213676 213828 213889 213921 213945 213992 214018 214059 214196 214231 214295 214318 214351 214472 214497 214746 214799 214820 214860 214927 214940 214943 215117 215127 215176 215310 215376 215420 215436 215460 215462 215476 215479 215720 215766 215789 215826 215930 216240 216246 266724 327814 327837 328095 328958 329325 395111 398638 398741 398770 399979 400018 400171 400506 400992 401109 401110 401115 401116 401120} and not cf.client.bot and not http.user_agent contains "Bot" and not http.user_agent contains "Spider" and not http.user_agent contains "bot" and not http.user_agent contains "spider")

0
上一篇 中文博客圈列表
下一篇 题解分享:[AtCoder Beginner Contest 414 E] Count A%B=C