蓝易云CDN:想让CDN真正发挥CC防御作用?你必须手动配置好这几条WAF规则

蓝易云CDN:想让CDN真正发挥CC防御作用?你必须手动配置好这几条WAF规则

很多用户把网站接入CDN后发现,CC攻击来了照样扛不住。问题出在哪?大多数情况下不是CDN本身防不了,而是WAF规则没有根据自身业务特征做针对性配置。CDN默认的防护策略是通用型的,面对真正有针对性的CC攻击往往不够用。以下几条WAF规则是实战中必须手动配好的,配对了,防御效果立竿见影 🛡️

规则一:对动态接口设置严格的请求频率上限

CC攻击最爱打的就是动态接口——登录、搜索、API查询、订单提交这类每次都要回源计算的请求。静态资源有CDN缓存兜底,基本打不动;但动态接口每一次请求都穿透到源站,几百个并发就可能压垮后端。

必须对这些路径单独设置频率限制:

# 针对登录接口的独立限流区域
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/s;

# 针对搜索接口的独立限流区域
limit_req_zone $binary_remote_addr zone=search_limit:10m rate=3r/s;

location /api/login {
    limit_req zone=login_limit burst=10 nodelay;
    proxy_pass http://backend;
}

location /api/search {
    limit_req zone=search_limit burst=5 nodelay;
    proxy_pass http://backend;
}

逐段解释:

  • limit_req_zone 分别为登录和搜索接口建立独立的计数区域,各分配10MB内存,按客户端IP跟踪访问频率。登录接口允许每秒5次请求,搜索接口更严格,每秒仅3次。
  • burst=10burst=5 分别设置两个接口的突发容忍量,允许短时间内排队的请求数。nodelay 表示突发请求立即处理而非延迟排队,超出容忍量的直接拒绝。
  • limit_req 放在具体的 location 块中而不是全局,就是为了对不同接口施加不同强度的限制,避免一刀切影响正常业务。

这一步的关键是:你必须清楚自己网站哪些路径是动态的、回源的,然后逐个配置,而不是依赖全局统一限流 🎯

规则二:拦截空Referer和异常Referer的请求

正常用户访问网站页面时,浏览器会自动在请求头中携带Referer字段,标明请求来自哪个页面。而大量CC攻击工具发出的请求要么没有Referer,要么Referer是随机伪造的无关域名。

valid_referers none blocked server_names *.yourdomain.com;

if ($invalid_referer) {
    return 444;
}

解释:

  • valid_referers 定义合法Referer的白名单。none 表示允许没有Referer的直接访问(比如用户在地址栏直接输入网址),blocked 表示允许被代理服务器或防火墙删除了Referer的请求,server_names 匹配当前服务器名称,*.yourdomain.com 匹配自己域名下所有子域的来源页面。
  • $invalid_referer 是Nginx内置变量,当请求的Referer不在白名单内时值为1,触发 return 444 直接断开连接,不返回任何内容。444是Nginx特有的状态码,意思是关闭连接且不发送响应头,比返回403更节省资源。

需要注意的是,如果你的网站有API被第三方调用的场景,需要把合作方的域名也加入白名单,否则会误拦 ⚙️

规则三:过滤高危User-Agent特征

CC攻击工具在User-Agent字段上往往会露出马脚。有的直接暴露工具名称,有的使用明显过时或不合常理的UA字符串。在WAF层面建立UA黑名单是性价比极高的防御手段:

map $http_user_agent $bad_ua {
    default 0;
    "~*python-requests"  1;
    "~*httpclient"       1;
    "~*java/"            1;
    "~*okhttp"           1;
    "~*libwww-perl"      1;
    "~*Go-http-client"   1;
    "~*node-fetch"       1;
    "~*PhantomJS"        1;
    ""                   1;
}

server {
    if ($bad_ua) {
        return 403;
    }
}

解释:

  • map 指令根据 $http_user_agent 的值做正则匹配,将结果映射到变量 $bad_ua。默认值为0(放行),匹配到黑名单中任何一项则为1(拦截)。~* 表示不区分大小写的正则匹配。
  • 黑名单涵盖了常见的自动化工具标识:python-requests(Python爬虫库)、httpclient(Java/C# HTTP库)、Go-http-client(Go语言默认UA)、PhantomJS(无头浏览器)等。最后一行空字符串匹配UA为空的请求。
  • map 而不是一连串 if 判断,性能更好,Nginx官方也推荐这种写法。

这条规则能过滤掉大部分低成本CC攻击工具的流量。当然高级攻击者会伪造UA,所以这只是防御链中的一环而非全部 🔍

规则四:对敏感路径启用验证码质询

有些接口极其敏感且后端处理成本极高,比如注册、短信发送、支付回调等。对这类路径,仅靠频率限制还不够,最好在WAF层直接加入人机验证机制。

在蓝易云CDN的WAF控制面板中,通常可以按路径配置质询策略。核心逻辑如下:

  • 首次请求命中敏感路径 → 返回JS Challenge页面
  • 浏览器自动执行运算 → 生成加密Token写入Cookie
  • 携带Token重新请求 → WAF验证通过后放行至源站
  • 后续请求凭Cookie免验,有效期内不再重复质询

如果需要在源站侧做二次校验,可以在Nginx中检查质询Cookie是否存在:

location /api/register {
    if ($cookie_waf_token = "") {
        return 403;
    }
    proxy_pass http://backend;
}

解释: 该规则检查请求中名为 waf_token 的Cookie是否存在。$cookie_waf_token 是Nginx自动解析Cookie后生成的变量。如果该Cookie为空(说明请求没有通过CDN的JS质询),直接返回403拒绝,不让其触达后端业务逻辑。这是一层轻量级的源站侧兜底验证 🔒

规则五:限制单IP并发连接数

CC攻击的另一个典型特征是单个IP建立大量并发连接。正常用户浏览网页,浏览器通常对同一域名保持6-8个并发连接,而攻击工具可能从单个IP发起数百甚至上千个并发。

limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;

server {
    location / {
        limit_conn conn_per_ip 30;
        limit_conn_status 429;
    }
}

解释:

  • limit_conn_zone 以客户端IP为维度创建连接计数区域,分配10MB共享内存。
  • limit_conn conn_per_ip 30 表示每个IP最多同时保持30个活跃连接,超出的新连接直接被拒绝。30这个值适合大多数普通网站,如果是资源密集型站点(大量图片、长连接)可以适当调高。
  • limit_conn_status 429 将超限时返回的状态码改为429(Too Many Requests),比默认的503语义更准确,也方便在日志中统计被限流的请求量。

这条规则对Slowloris等慢速连接攻击特别有效 💪


最后的关键提醒: 以上五条规则不是配完就万事大吉,必须根据自身业务的真实流量数据来调整阈值参数。建议先在WAF日志中观察一周正常业务的访问模式(峰值QPS、单IP平均请求数、热门路径分布),再据此设定合理的阈值。阈值太松等于没防,太紧则误杀正常用户。蓝易云CDN的WAF面板提供了实时请求日志和拦截统计,善用这些数据才能把规则调到最佳状态 📊

THE END