https连接耗尽攻击利用tls握手开销占满nginx连接数、ssl缓存或cpu资源,防护需协同限连(limit_conn)、限速(limit_req)、加固tls(禁用低效套件、调小会话缓存、启用ocsp stapling)及识别异常行为(sni校验、指纹封禁、日志监控)。

HTTPS 连接耗尽攻击的特点
针对 HTTPS 的 DDoS 攻击中,连接耗尽类(如 TLS 握手洪水、慢速 SSL 握手、重复 ClientHello 泛洪)不依赖高带宽,而是利用 TLS 协商过程的计算开销与状态维持成本,快速占满 Nginx 的 worker 连接数、SSL 会话缓存或 CPU 资源。这类攻击流量看似合法(完整 TLS 握手包),但不完成请求或中途断连,导致 Nginx 持续分配内存、进行非对称加解密、维护半开连接,最终拒绝正常用户接入。
核心防护:限制并发连接与握手频率
连接数限制是防御 HTTPS 耗尽攻击的第一道屏障,需在 http 或 server 块中协同配置:
-
按 IP 限并发连接:使用
limit_conn_module控制每个客户端可建立的活跃连接上限limit_conn_zone $binary_remote_addr zone=ssl_conn:10m;server { listen 443 ssl; limit_conn ssl_conn 5; }
建议静态资源站点设为 3–8,API/登录页等敏感路径可进一步收紧至 2–3 -
限制 TLS 握手速率:Nginx 本身不直接限握手频次,但可通过
limit_req对 HTTPS 请求入口(如location /)施加速率控制,间接压制高频建连行为limit_req_zone $binary_remote_addr zone=ssl_rate:10m rate=3r/s;location / { limit_req zone=ssl_rate burst=6 nodelay; }
该配置对所有 HTTPS 请求生效,能有效过滤掉每秒发起多次完整握手+GET 的自动化工具
加固 TLS 层行为,降低服务端开销
减少单次 TLS 协商消耗,提升抗压能力:
-
禁用低效加密套件:在
ssl_ciphers中移除RC4、3DES、NULL及所有EXPORT套件;优先启用ECDHE+AES-GCM,缩短握手轮次并支持 0-RTT(若业务允许) -
调小 SSL 缓存参数:避免攻击者填充大量无效会话
ssl_session_cache shared:SSL:10m;(10MB 约支持 4 万会话)ssl_session_timeout 4h;(不宜过长,防止缓存被恶意占满) - 启用 OCSP Stapling:避免客户端发起在线证书状态查询(OCSP 请求),减少额外 TLS 往返和后端依赖
识别并拦截异常 TLS 行为
结合日志与条件判断,主动拒绝可疑握手特征:
-
检查 User-Agent 与 TLS 扩展:真实浏览器通常携带完整 SNI、ALPN、签名算法列表;攻击工具常缺失或使用固定值
if ($ssl_server_name = "") { return 444; }(强制要求 SNI)if ($ssl_protocol = "") { return 444; }(拒绝无协议协商的连接) -
封禁已知恶意 TLS 指纹:通过
map模块匹配$ssl_client_hello(需 Nginx Plus 或开源版配合第三方模块如ngx_http_ssl_preread_module)或基于日志分析提取高频异常指纹后,用geo+deny封禁 IP 段 -
记录并告警高频重连:在 access_log 中加入
$connection_requests和$ssl_protocol字段,监控单 IP 在短时间内的连接重建次数,触发自动限流或 WAF 联动











