0x00 前情提要
我的 Cloudflare WAF 配置并非一蹴而就的完美方案,而是一套经过多次迭代、结合业务场景和实战经验形成的动态防御体系。核心逻辑始终围绕三个关键目标:主动防御、最小化误拦截、以及性能与成本的平衡。
在开始之前,让我们了解一些关键概念:
- Web 应用程序防火墙(Web Application Firewall, WAF)是一种防护网络攻击的技术,通过检查和过滤 HTTP 流量中的恶意请求和攻击,保护 Web 应用程序的安全。
- Cloudflare WAF 通常有这样几种策略:Allow(允许)、Managed Challenge(托管质询)、Block(阻止)
- 对于 Managed Challenge 策略,访问网站标题通常为
Just a moment... - 对于 Block 策略,访问网站标题通常为
Attention Required! Cloudflare并且页面会有一个大红色的阻止图标 - 在 WAF 规则的管理页面,我们可以注意到 CSR (Challenge Score Rate),它是一个百分比值,用于表示通过的质询请求和发出的质询请求的比例。CSR 的值越小越好,此指标可帮助我们评估 WAF 规则的有效性。
实现完美配置的基础是理解防御的优先级。我将规则分为三层,对应三个不同的策略,每一层解决不同层级的问题。
0x01 质询一些看起来很奇怪的请求
IDC 验证
通常而言,我们的访客不会在数据中心上网,所以大部分来自数据中心的流量都是有问题的流量,我们可以使用 托管质询 来应对这部分流量:
(ip.geoip.asnum in {174 195 209 577 792 793 794 1215 1216 1217 2497 2914 3223 3255 3269 3326 3329 3457 3462 3598 4184 4190 4637 4694 4755 4785 4788 4816 4826 4835 5056 5610 5617 6471 6584 6830 6876 6877 6939 7029 7224 7303 7489 7552 7684 8068 8069 8070 8071 8074 8075 8100 8220 8560 8881 8987 9009 9299 9312 9370 9534 9678 9952 9984 10026 10453 11351 11426 11691 12076 12271 12334 12367 12874 12876 12989 14061 14117 14140 14576 14618 15169 16276 16509 16591 16629 17043 17428 17707 17788 17789 17790 17791 18013 18228 18403 18450 18599 18734 18978 19527 19740 20207 20473 20552 20554 20860 21704 21769 21859 21887 22773 22884 23468 23724 23885 23959 23969 24088 24192 24424 24429 24940 25429 25697 25820 25935 25961 26160 26496 26818 27715 28429 28431 28438 28725 29066 29286 29287 29802 30083 30823 31122 31235 31400 31898 32097 32098 32505 32613 34081 34248 34549 34947 35070 35212 35320 35540 35593 35804 35816 35908 35916 36351 36352 36384 36385 36444 36492 36806 37963 37969 38001 38197 38283 38365 38538 38587 38588 38627 39284 40065 40676 40788 41009 41096 41264 41378 42652 42905 43289 43624 43989 45011 45012 45062 45076 45085 45090 45102 45102 45102 45103 45104 45139 45458 45566 45576 45629 45753 45899 45932 46484 46844 47232 47285 47927 48024 48024 48337 48905 49327 49588 49981 50297 50340 50837 51852 52000 52228 52341 53089 54463 54538 54574 54600 54854 54994 55158 55330 55720 55799 55924 55933 55960 55967 55990 55992 56005 56011 56109 56222 57613 58073 58199 58461 58466 58519 58543 58563 58593 58772 58773 58774 58775 58776 58844 58854 58862 58879 59019 59028 59048 59050 59051 59052 59053 59054 59055 59067 59077 59374 60068 60592 60631 60798 61112 61154 61317 61348 61577 61853 62044 62240 62468 62785 62904 63018 63023 63075 63288 63314 63545 63612 63620 63631 63655 63677 63678 63679 63727 63728 63729 63835 63838 63888 63916 63949 64050 131090 131106 131138 131139 131140 131141 131293 131428 131444 131477 131486 131495 132196 132203 132509 132510 132513 132591 132839 133024 133199 133380 133478 133492 133746 133752 133774 133775 133776 133905 133929 134238 134327 134760 134761 134763 134764 134769 134770 134771 134835 134963 135061 135290 135300 135330 135377 135629 137693 137697 137699 137753 137784 137785 137787 137788 137876 137969 138366 138407 138607 138915 138949 138950 138952 138982 138994 139007 139018 139124 139144 139201 139203 139220 139316 139327 139726 139887 140096 140596 140701 140716 140717 140720 140723 140979 141157 141180 142570 146817 149167 177453 177549 197099 197540 198047 198651 199490 199506 199524 199883 200756 201094 201978 202053 202675 203087 204601 204720 206092 206204 206791 206798 207319 207400 207590 208425 208556 211914 212708 213251 213375 262187 263022 263196 263639 263693 264344 264509 265443 265537 266706 267784 269939 270110 328608 394699 395003 395936 395954 395973 398101 })
这个列表包括了各个国家大部分数据中心的出口 ASN,一般不会影响到普通家宽用户。另外请注意我这里质询了来自 Akile AS61112 的流量,如果您有需求请自行解开。
对于高风险 ASN 进行质询
这部分 ASN 建议和上方一起使用,效果更佳。(可选,有一定的误报率)
(ip.src.asnum in {965 6461 7195 7203 7713 7941 8075 8560 8987 9009 9123 11878 13349 13965 14061 14593 14618 15169 16276 18779 18978 19148 19527 19871 20853 21704 21769 22552 22612 22616 25369 26496 28753 30633 34081 36599 37148 37963 39686 43513 44144 44477 45090 45102 46261 46516 46606 47583 49367 49981 50304 50495 50835 51167 51290 51765 52393 52449 52485 53667 54252 54600 55081 55286 55960 55990 59253 60068 60781 62160 62240 62874 63023 64080 64267 64286 132203 132817 133499 133752 133944 134450 135377 137718 139659 141995 142002 149428 150436 152194 200373 201035 201341 202044 202496 202914 203020 203061 203098 203346 203999 204287 205544 205659 205964 206092 207990 209043 209709 210644 210906 212144 212329 212335 212384 215859 216071 263740 394380 394474 394814 39486 395954 396356 396982 397391 397630 398101 398823})
对于高风险地区进行质询
这些地区常用来做攻击(基本上是小国家),建议质询。(可选,有一定的误报率)
(ip.src.country in {"AR" "BD" "BR" "CO" "CZ" "IN" "ID" "IR" "LR" "LY" "NL" "PH" "RU" "TR" "UA" "VN" "T1" "PR"})
对于奇怪的请求头进行质询
这里有一些与浏览器不匹配的请求头,通过这条规则可以很方便的将它们拦截下来。
(any(http.request.headers["accept-encoding"][*] eq "identity"))
or (any(http.request.headers["x-requested-with"][*] eq "XMLHttpRequest"))
or (len(http.request.headers["x-cache"]) > 0)
or (len(http.request.headers["cdn-loopcount"]) > 0)
or (len(http.request.headers["trailer"]) > 0 and not http.user_agent contains "Firefox")
or (len(http.request.headers["x-frame-options"]) > 0)
or (len(http.request.headers["accept-charset"]) > 0)
or (http.user_agent contains "Firefox" and len(http.request.headers["sec-ch-ua"]) > 0)
or (any(http.request.headers["accept-encoding"][*] eq "x-real-ip"))
or (any(http.request.headers["accept-encoding"][*] eq "x-forwarded-for"))
or (any(http.request.headers["accept-encoding"][*] eq "x-forwarded-host"))
or (any(http.request.headers["accept-encoding"][*] eq "cloudfront-viewer-address"))
or (any(http.request.headers["accept-encoding"][*] eq "ali-cdn-real-ip"))
慎用:质询可能有风险的请求
通常而言,大部分 CC 攻击都是 HTTP/1.1 的请求(少部分 HTTP/2 或 HTTP/3),所以我们可以针对这一点进行封堵:
(http.request.version eq "HTTP/1.1")
另外附上一条不常用 HTTP Method 的质询规则,这需要根据你的业务适当放行 API 站点:
(not http.request.method in {"GET" "POST" "OPTIONS" "HEAD"})
0x02 阻止
奇怪的 User-Agent
正常用户访问通常会携带一个看上去像话的 User-Agent,而部分恶意请求的 User-Agent 为空或者为请求库默认 User-Agent,这部分流量我们可以质询或者阻止。
(http.user_agent eq "")
另外还有一些各类工具的请求,我们可以通过这个表达式来阻止:
(http.user_agent contains "Acunetix")
or (http.user_agent contains "apache")
or (http.user_agent contains "attachment")
or (http.user_agent contains "BackDoorBot")
or (http.user_agent contains "cobion")
or (http.user_agent contains "fhscan")
or (http.user_agent contains "fimap")
or (http.user_agent contains "Gscan")
or (http.user_agent contains "hey/")
or (http.user_agent contains "Joomla")
or (http.user_agent contains "libweb")
or (http.user_agent contains "libwww")
or (http.user_agent contains "masscan")
or (http.user_agent contains "nmap")
or (http.user_agent contains "Page" and http.user_agent contains "Analyzer")
or (http.user_agent contains "PHPCrawl")
or (http.user_agent contains "PyCurl")
or (http.user_agent contains "python")
or (http.user_agent contains "RankActive")
or (http.user_agent contains "RankingBot")
or (http.user_agent contains "RankurBot")
or (http.user_agent contains "researchscan")
or (http.user_agent contains "ScanAlert")
or (http.user_agent contains "scanbot")
or (http.user_agent contains "virusdie")
or (http.user_agent contains "VoidEYE")
or (http.user_agent contains "WebShag")
or (http.user_agent contains "Wprecon")
or (http.user_agent contains "WPScan")
or (http.user_agent contains "wrk")
or (http.user_agent contains "ZmEu")
or (http.user_agent contains "ZumBot")
or (http.user_agent contains "Zyborg")
or (http.user_agent contains "Zeus")
or (http.user_agent contains "zgrab")
or (http.user_agent contains "zmap")
or (http.user_agent contains "lient" and http.user_agent contains "ttp")
or (http.user_agent contains "fuck")
or (http.user_agent eq "undefined")
or (http.user_agent eq "")
更进一步,有时候会有一些老旧的或者不符合 User-Agent 规范的 UA,我们可以继续添加如下内容来屏蔽:
(not starts_with(http.user_agent, "Mozilla/5.0 (")) or (http.user_agent eq "Mozilla/5.0") or (http.user_agent eq "Mozilla/5.0 (compatible)")
ITDOG
有些网站源站性能较差,如果有人在 itdog 上进行了快速测速很可能导致源站 CPU 飙升,我们可以通过规则屏蔽这部分请求:
(any(http.request.headers["checkmode"][*] contains "fast"))
如果你想要同时阻止快速和监测,请使用下面这条规则:
(len(http.request.headers["checkmode"]) > 0)
终极审判:Accept-Language 和 Accept-Encoding
正常的浏览器请求在请求头中必定携带 Accept-Language 和 Accept-Encoding 这两个请求头且 UA 都是以 Mozilla/5.0 开头,如果缺失这三个请求头,则表明请求为异常或恶意请求。
请注意本条规则可能误伤各个写法不规范的友链检查请求,请自行放行
(not len(http.request.headers["accept-encoding"]) > 0)
or (not len(http.request.headers["accept-language"]) > 0)
对于部分高风险 ASN 进行阻止
这些 ASN 通常被表明用在各种攻击中,建议直接阻止(可选,有一定的误报率)
(ip.src.asnum in {8075 64267 63949 60068 54252 51167 47583 45102 44477 397630 396982 36352 36351 31898 30058 24940 213230 212329 203020 202561 200373 16509 16276 14061 135377 132203})
Netcraft
单拎出来,懂的都懂。
(ip.src.asnum in {212329})
or ((lower(http.user_agent) contains "netcraft"))
or (ip.src in {194.52.68.0/24 194.72.238.0/24 83.138.182.72/29 83.138.189.96/29 81.91.240.0/24 89.36.24.0/24 83.222.232.216/30 184.172.0.0/16})
0x03 其他设置
Tor Services
使用 ASN 处置方案,不建议在生产里使用,纯粹用于内部黑名单系统炫技
(ip.src.asnum in { 3 9 32 160 174 209 278 553 559 577 680 701 719 786 803 812 823 852 855 1101 1102 1103 1133 1136 1205 1213 1221 1257 1267 1299 1403 1653 1680 1759 1835 2027 2033 2108 2116 2119 2514 2516 2518 2527 2603 2611 2614 2856 2860 2900 2907 3061 3164 3209 3214 3215 3223 3236 3242 3243 3249 3257 3258 3269 3292 3301 3303 3320 3329 3352 3356 3462 3758 3790 3927 4181 4224 4319 4508 4658 4685 4713 4739 4764 4766 4771 4788 4804 4922 5089 5378 5404 5408 5410 5432 5483 5603 5607 5610 5617 5645 5650 5769 6128 6145 6167 6181 6315 6327 6661 6696 6698 6718 6724 6730 6799 6805 6810 6830 6848 6855 6871 6876 6893 6939 7018 7203 7377 7418 7459 7506 7545 7552 7684 7765 7922 7992 8075 8151 8218 8283 8339 8400 8412 8422 8437 8447 8455 8473 8495 8560 8648 8708 8717 8758 8767 8820 8849 8866 8873 8881 8916 8943 8972 9008 9009 9031 9044 9050 9063 9105 9123 9136 9141 9145 9269 9299 9318 9370 9378 9443 9506 9534 9790 10143 10242 10489 10796 10929 10961 10996 11114 11232 11351 11403 11404 11426 11427 11550 11572 11650 11721 11796 11847 11878 12083 12093 12119 12161 12312 12322 12338 12353 12355 12364 12392 12400 12479 12496 12508 12552 12586 12605 12731 12735 12767 12874 12876 13022 13030 13036 13037 13045 13046 13101 13110 13127 13170 13188 13213 13285 13692 13693 13868 13977 14007 14061 14315 14593 14618 14638 14670 14956 15081 15108 15435 15440 15502 15547 15557 15600 15614 15626 15657 15704 15895 15943 15962 16019 16075 16086 16097 16125 16276 16302 16509 16591 16652 17055 17356 17506 17547 17552 17676 17931 18106 18390 18460 18526 18530 19045 19148 19237 19318 19437 19504 19994 20001 20055 20115 20257 20454 20473 20676 20712 20766 20845 20853 20857 20860 20904 21100 21211 21409 21473 21499 21859 21949 22047 22296 22611 22612 22773 23310 23423 23470 23655 23884 24086 24233 24282 24685 24768 24800 24875 24940 24953 24961 24971 25198 25255 25353 25369 25472 25512 25795 26042 26068 26347 26383 26527 26615 26801 26832 27176 27411 27631 27651 27823 28258 28573 28753 28855 29066 29075 29107 29134 29169 29222 29259 29314 29447 29518 29551 29580 29691 29695 29802 30036 30058 30083 30600 30633 30722 30766 30823 30836 30860 30893 30983 31012 31034 31103 31148 31371 31863 31898 32097 32133 32181 32244 32338 32489 32613 33083 33387 33566 33705 33796 33837 33885 33911 33915 33943 33984 34222 34224 34244 34259 34288 34689 34694 34700 34702 34779 34878 34911 34927 35042 35100 35112 35179 35244 35366 35425 35426 35434 35470 35518 35530 35592 35661 35699 35758 35916 36149 36352 36375 36813 36849 36850 37611 38074 38195 39020 39287 39375 39378 39392 39405 39519 39587 39614 39622 39642 39788 39798 39819 39857 39900 39912 40021 40029 40138 40244 40676 40749 40924 40933 40994 41047 41075 41108 41111 41164 41281 41608 41634 41653 41745 42159 42237 42275 42532 42541 42611 42624 42652 42675 42708 42730 42831 42908 42927 43150 43180 43258 43289 43317 43341 43350 43513 43541 43641 43847 43902 43927 44103 44133 44176 44477 44486 44489 44592 44679 44709 44716 44820 44869 44901 44925 45012 45037 45045 45102 45382 45671 45731 45758 45839 45899 46015 46375 46475 46632 46690 46841 46844 46887 47066 47172 47263 47325 47447 47536 47570 47583 47610 47692 47890 47987 48090 48101 48314 48635 48753 48874 48900 48926 48927 49367 49392 49409 49453 49468 49505 49544 49581 49601 49635 49683 49770 49855 49981 50066 50266 50304 50338 50340 50360 50436 50613 50629 50673 50821 50840 50867 50979 51059 51167 51175 51177 51290 51395 51396 51659 51692 51744 51765 51815 51852 52000 52048 52092 52173 52423 53072 53486 53667 53914 54098 54290 54641 54702 54965 55081 55286 55293 55592 55688 55720 56030 56067 56153 56322 56380 56381 56478 56610 56611 56630 56655 56803 56971 57043 57169 57269 57494 57608 57717 57811 57860 58010 58061 58087 58212 58294 58329 58791 58915 59253 59444 59491 59702 59711 59720 59729 59741 59878 59891 60016 60068 60117 60131 60191 60404 60522 60602 60729 60781 61098 61106 61112 61125 61138 61157 61174 61272 61323 61335 61424 61493 62000 62005 62217 62240 62248 62336 62370 62425 62564 62744 62904 63018 63023 63473 63770 63806 63930 63949 63997 64289 64396 64425 131965 131970 132203 133159 133206 133210 133398 134351 134697 134835 135377 135887 135932 135959 136052 136258 136557 141995 142036 149440 151858 151873 197019 197071 197422 197448 197451 197524 197540 197566 197648 197695 197706 197902 197922 198071 198093 198161 198178 198620 198859 198930 198967 198985 199058 199118 199173 199246 199284 199524 199654 199950 199959 200019 200052 200081 200195 200223 200462 200490 200533 200651 200698 200713 200736 200950 201112 201146 201308 201670 201814 201838 202053 202246 202282 202302 202306 202401 202422 202425 202448 202520 202539 202585 202613 202618 202759 203003 203020 203363 203380 203424 203446 203476 203953 204410 204601 204615 204641 204911 204957 205007 205053 205090 205100 205235 205449 205714 205771 206075 206125 206216 206236 206238 206264 206642 206774 206804 207003 207083 207143 207252 207279 207459 207503 207560 207645 207656 207713 207799 207916 207957 207992 208046 208101 208208 208226 208323 208367 209243 209281 209605 209641 209696 209825 210079 210083 210152 210218 210226 210403 210558 210630 210644 210731 210874 210893 211301 211462 211507 211593 211619 211720 211742 211882 212027 212238 212271 212317 212396 212441 212477 212508 212531 212895 212913 213230 213250 213281 213354 213373 213438 213725 213850 213873 213877 213887 213959 214094 214196 214209 214285 214354 214366 214379 214481 214503 214677 214717 214790 214808 214902 214918 214996 215026 215120 215248 215296 215362 215381 215467 215481 215540 215659 215703 215730 215762 215904 216063 216071 216107 216127 216188 262287 262391 263608 263812 267546 328170 328364 329007 329184 329325 393238 393336 393408 393552 393577 393746 393886 394056 394380 395466 395510 395673 395853 395954 396190 396362 396527 397032 397122 397162 397373 397423 398101 398242 398721 399122 399334 399629 399646 399804 399820 400175 400226 400304 400509 400564 400771 400848 400861 401104 401332 401401 })
0x04 放行一些请求
绝大部分情况下,使用这条规则放行就够了,特殊情况特殊对待:
(cf.client.bot)
or ((lower(http.user_agent) contains "uptime"))
0x05 参考链接
- Cloudflare 免费版 WAF 规则分享和详解
- 窥探 Cloudflare WAF 防护(关键词:打探敌情、5 秒盾穿盾、Bot score)
- WolfYangFan/cloudflare.ruleset
- sefinek/Cloudflare-WAF-Expressions
- Pysio 在群内分享的部分规则
- 阳帆极寒之地群 流量垃圾桶的每周赃流量统计
0x06 结语
本文分享了我经过实战验证的 Cloudflare WAF 分层防御配置方案,核心围绕主动防御、最小化误拦截、性能与成本平衡三大目标。通过分层策略(托管质询、阻止、放行)实现动态防御。如有任何问题欢迎留言反馈。