静态资源站点通常指不依赖服务端动态计算、主要交付HTML、CSS、JavaScript、图片、字体和视频等文件的网站或应用前端。这类站点的特点是内容相对固定、可缓存性强、带宽消耗集中在文件传输上。很多人误以为静态站没有数据库、没有登录接口,DDoS攻击就不会造成太大影响,实际上静态资源站点一旦被大流量攻击命中,CDN回源带宽会被瞬间打满,对象存储的请求费用会暴涨,前端页面无法加载,业务直接瘫痪。针对静态资源站点的DDoS防护,核心思路不是堆安全设备,而是从架构上减少攻击面、利用边缘节点吸收流量、严格控制回源链路、并通过自动化策略降低攻击期间的资源消耗。

静态资源站点面临的DDoS攻击类型

静态资源站点最常见的攻击方式是HTTP Flood和CC攻击。攻击者会模拟大量正常请求,频繁拉取体积较大的JS、CSS或图片文件,造成源站出口带宽耗尽。另一种是针对HTTPS握手过程的SSL Flood,通过大量TLS握手请求消耗服务器CPU资源。还有DNS Query Flood,直接攻击域名解析服务,让用户无法解析到站点IP。对于未接入CDN的静态站,攻击者还会直接对源站IP发起UDP Flood或SYN Flood,这类攻击更容易让机房触发黑洞路由,导致整个IP不可用。因此,静态资源站点的DDoS防护必须同时考虑网络层、传输层和应用层。

第一层防护:CDN边缘节点分散流量

静态资源站点最有效的DDoS防护手段就是把流量全部接入CDN。CDN节点分布广泛,单点带宽储备远高于普通源站,攻击流量会在边缘节点被分摊和清洗。接入CDN后,源站IP不应暴露在公网,所有DNS解析记录只指向CDN提供的CNAME地址。源站服务器可以通过安全组或防火墙规则,只允许CDN回源节点IP访问80和443端口,其他来源一律拒绝。这样即使攻击者扫描到源站真实IP,也无法直接建立连接。对于高价值业务,还可以使用CDN厂商提供的独立高防IP,将攻击流量牵引到清洗中心后再回注正常流量。

很多团队在配置CDN时忽略了回源Host和缓存键的设置。攻击者如果构造随机查询参数,比如在URL后面附加随机数字或随机字符串,CDN会认为这是不同的资源,每次都回源拉取,源站压力瞬间升高。正确的做法是在CDN控制台配置忽略URL中的特定查询参数,或者将缓存键设置为只包含协议、域名和路径,不包含查询字符串。对于确实需要查询参数的场景,可以设置参数白名单,只保留必要的业务参数,其余全部忽略。

第二层防护:对象存储与源站隔离

静态资源站点的源站通常有两种形态:一种是自建Nginx或Apache服务器,另一种是直接使用对象存储服务。如果源站是对象存储,建议将对象存储设置为私有读写,只通过CDN回源鉴权来访问。这样攻击者无法直接请求对象存储的公网地址,所有请求都必须经过CDN。对象存储本身具备一定的带宽承载能力,但请求费用和流量费用在攻击期间会急剧上升,因此必须配合CDN的缓存策略和访问控制来降低回源次数。

对于自建源站,建议将静态文件与动态接口完全分离。静态文件使用独立的域名,例如static.example.com,动态接口使用api.example.com。静态域名全部走CDN,源站只保留一份冷备文件。动态接口域名则使用独立的防护策略,比如更严格的频率限制和WAF规则。这样即使动态接口被打垮,静态资源仍然可以正常加载,用户至少能看到页面框架和基础内容。

第三层防护:应用层频率限制与行为分析

CDN边缘节点可以配置频率限制规则,针对单个IP、单个会话或单个UA在单位时间内的请求次数进行限制。静态资源站点的正常用户通常会在短时间内并发请求多个文件,但不会持续以极高频率请求同一个文件。攻击者往往会用脚本循环拉取同一个大文件,或者用大量代理IP分散请求。频率限制可以拦截明显的异常行为,但对于慢速CC攻击,单纯靠频率限制不够,还需要结合行为分析。

行为分析的核心是识别请求模式是否像真实浏览器。真实浏览器加载页面时会先请求HTML,然后解析HTML中的资源引用,按照依赖顺序请求CSS、JS和图片。攻击脚本往往直接请求目标资源,缺少完整的资源加载链路。CDN或WAF可以通过检查Referer、User-Agent、Accept头以及请求序列来判断请求是否来自真实浏览器。对于缺少Referer或者Referer与请求资源不匹配的请求,可以直接拦截或返回验证页面。

另一个容易被忽视的细节是HTTP协议版本。攻击工具通常使用HTTP/1.1或更低版本,而现代浏览器普遍支持HTTP/2和HTTP/3。可以在CDN边缘节点对不支持HTTP/2的请求进行降级处理,比如限制其并发连接数或请求速率。这不会影响正常用户,但能显著增加攻击者的成本。

第四层防护:源站带宽与连接数优化

即使CDN承担了大部分流量,源站仍然需要应对回源请求。攻击者可以通过构造大量未命中缓存的请求来迫使CDN回源。因此,源站本身的带宽和连接数优化至关重要。Nginx作为静态资源服务器时,可以通过调整worker_processes、worker_connections和keepalive_timeout等参数来提升并发处理能力。以下是一个针对高并发静态资源服务的Nginx配置示例:

user www-data;
worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 4096;
    use epoll;
    multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 30;
    keepalive_requests 100;
    client_body_timeout 10;
    client_header_timeout 10;
    send_timeout 10;

    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=50r/s;

    server {
        listen 80;
        server_name static.example.com;

        root /var/www/static;
        index index.html;

        location / {
            limit_conn perip 20;
            limit_req zone=reqlimit burst=100 nodelay;
            try_files $uri $uri/ =404;
            expires 30d;
            add_header Cache-Control "public, max-age=2592000";
            add_header X-Content-Type-Options nosniff;
            add_header X-Frame-Options DENY;
            access_log off;
        }

        location ~* \.(jpg|jpeg|png|gif|webp|svg|css|js|woff|woff2|ttf|eot|mp4|webm|pdf)$ {
            limit_conn perip 10;
            limit_req zone=reqlimit burst=200 nodelay;
            expires 365d;
            add_header Cache-Control "public, max-age=31536000, immutable";
            access_log off;
        }
    }
}

这段配置限制了单IP并发连接数和请求速率,同时为静态文件设置了长期缓存头。immutable指令告诉浏览器资源不会变化,可以直接使用本地缓存而不重新验证,这能大幅减少重复请求。需要注意的是,limit_req的rate值要根据实际业务调整,设置过低会误伤正常用户,设置过高则无法有效拦截攻击。

第五层防护:DNS层防护与多线路冗余

DNS是静态资源站点的入口,DNS Query Flood攻击会导致域名解析失败。建议使用支持DNS防护的权威DNS服务商,这类服务商通常具备大带宽DNS集群和自动清洗能力。同时,为域名配置较长的TTL值,例如300秒或更长,这样即使DNS服务短暂不可用,用户本地DNS缓存仍然可以解析到CDN节点。对于关键业务,可以配置多个DNS服务商做冗余,主DNS故障时自动切换到备用DNS。

多线路冗余还体现在CDN层面。如果单一CDN厂商的某个节点或线路被攻击打满,用户访问会受到影响。可以采用双CDN策略,主CDN承担日常流量,备用CDN在主CDN不可用时接管。切换方式可以通过DNS智能解析实现,当主CDN的监控探针检测到可用性下降时,自动将解析切换到备用CDN。这种方案成本较高,但对于可用性要求极高的静态资源站点是值得的。

第六层防护:自动化监控与弹性降级

DDoS攻击往往在短时间内突然爆发,人工响应来不及。需要建立自动化监控体系,实时采集CDN回源带宽、源站CPU、内存、网络连接数、请求错误率等指标。当回源带宽超过预设阈值时,自动触发降级策略。降级策略可以包括:关闭非核心静态资源的回源、将部分大文件切换为CDN缓存中的旧版本、对非关键路径的请求返回静态占位图、限制特定地理区域的请求等。

弹性降级的核心是保证核心页面框架可用。例如,一个电商静态首页包含商品图片、轮播图、字体文件和视频背景。攻击期间可以自动关闭视频背景和轮播图,只保留商品列表和基础样式。这样即使带宽紧张,用户仍然可以浏览商品信息。降级策略需要在架构设计阶段就预留开关,不能等到攻击发生时临时改代码。

第七层防护:源站IP隐藏与定期更换

源站IP泄露是静态资源站点被直接攻击的主要原因。很多团队在早期开发阶段直接使用源站IP访问,后来接入CDN后没有及时更换IP,导致攻击者通过历史DNS记录或搜索引擎缓存获取到真实IP。建议在接入CDN后立即更换源站IP,并确保新IP从未在公网出现过。同时,源站服务器不要对外提供任何非必要服务,比如SSH端口只对办公网IP开放,数据库端口不对外监听。

定期更换源站IP是一种有效的主动防御手段,但操作成本较高,需要同步更新CDN回源配置和安全组规则。对于使用对象存储作为源站的场景,不存在源站IP泄露的问题,因为对象存储服务本身由云厂商托管,攻击者无法直接定位到底层服务器。这也是推荐静态资源站点优先使用对象存储加CDN架构的原因之一。

成本控制与攻击期间的资源优化

DDoS攻击不仅影响可用性,还会带来直接的经济损失。对象存储的请求费用和CDN的流量费用在攻击期间会大幅增加。建议在CDN控制台设置费用告警和流量上限,当流量超过预设值时自动触发防护策略,而不是无限消耗预算。对于对象存储,可以开启防盗链功能,只允许特定Referer的请求访问资源。同时,对超大文件设置访问频率限制,避免攻击者反复下载同一个大文件造成流量费用激增。

另一个成本优化点是使用CDN的压缩功能。开启Gzip或Brotli压缩后,文本类资源如HTML、CSS、JS的传输体积可以减少60%到80%,这不仅能提升加载速度,还能降低流量消耗。对于图片资源,可以使用CDN的图片处理功能,按需生成不同尺寸的WebP或AVIF格式,避免传输原始大图。

总结

静态资源站点的DDoS防护是一个系统工程,不能依赖单一手段。核心原则是:源站IP严格隐藏、所有流量经过CDN边缘节点、缓存策略最大化减少回源、应用层频率限制与行为分析结合、源站配置优化以应对突发回源、DNS层冗余保障解析可用、自动化监控实现快速降级。这套组合策略能够有效应对绝大多数针对静态资源站点的DDoS攻击,同时将攻击期间的资源消耗和成本控制在可接受范围内。