Sockstress 攻击是一种针对 TCP 协议栈的拒绝服务攻击,它利用三次握手的漏洞,通过发送大量半开连接或异常 ACK 包,耗尽服务器内存和 CPU 资源,导致合法用户无法访问。与传统的流量洪水不同,Sockstress 攻击流量极小,却能让服务器资源迅速枯竭。面对这种攻击,单靠带宽清洗往往无效,需要从内核参数、网络层缓解到应用层限控进行分层防御。本文基于 AWS 官方文档,提供一套从 Linux 内核调优到 WAF 限控的防护路径。
为什么 Sockstress 攻击难以防御?
Sockstress 攻击的核心是制造大量处于特定状态的 TCP 连接,例如 SYN_RECEIVED 或 ESTABLISHED,每个连接都占用服务器内存和文件描述符。攻击者可以低速率发送恶意数据包,避开传统的流量阈值检测。AWS 在 DDoS 防护概述中指出,网络和传输层(L3/L4)的攻击由 AWS Shield 自动缓解,但应用层(L7)攻击需要额外配置。Sockstress 属于传输层攻击,但因其低速率特性,如果防护设备只按流量大小触发,可能漏报。
第一步:内核参数调优,增强 TCP 栈韧性
在 Linux 服务器上,合理的 sysctl 参数可以缓解 Sockstress 的部分影响。关键参数包括:
net.ipv4.tcp_max_syn_backlog:增大 SYN 队列长度,但过大可能被利用,需平衡。net.ipv4.tcp_syncookies:启用 SYN cookies,当 SYN 队列满时,不分配资源,直接回复 cookie,可有效抵御 SYN 洪水,但对 Sockstress 的已建立连接帮助有限。net.ipv4.tcp_fin_timeout:缩短 FIN_WAIT 状态超时,释放内存。net.ipv4.tcp_tw_reuse:复用 TIME_WAIT 连接,减少资源占用。net.core.somaxconn:调整 accept 队列长度,避免全连接队列溢出。
调优需要测试,不同业务模型对延迟和并发的要求不同。例如,高并发短连接服务可能会从缩短超时中受益,但长连接服务则可能影响稳定性。
第二步:网络层自动缓解与手动干预
AWS 文档指出,AWS Shield Standard 自动为所有 AWS 资源提供 L3/L4 层保护,包括 SYN 洪水和 UDP 洪水等。对于 Sockstress 这类低速率攻击,Shield 的检测系统会分析连接模式,识别异常。但自动缓解可能不会立即触发,因为攻击流量未达到阈值。
如果使用 AWS Shield Advanced,可以启用更精细的缓解。文档提到,在攻击期间,Shield Advanced 会自动将 VPC 网络 ACL 部署到 AWS 网络边缘,以应对大规模事件。但网络 ACL 只能基于 IP、端口和协议进行过滤,对于 Sockstress 的随机源 IP 和低速率,效果有限。因此,需要结合其他手段。
对于自建防护,可以在负载均衡器或防火墙层面限制每个源 IP 的连接速率,并设置连接超时。但攻击者可能使用 IP 欺骗,导致限速误伤。
第三步:应用层 WAF 限控,精准拦截
虽然 Sockstress 是传输层攻击,但应用层防护可以补充。AWS WAF 可以部署在 CloudFront 或 ALB 前,通过规则限制请求速率、检测异常行为。文档强调,对于 L7 攻击,AWS 默认不自动缓解,以避免误伤合法流量。因此,你需要自定义规则。
例如,可以配置基于速率的规则,限制单个 IP 的每秒请求数。但 Sockstress 可能不产生 HTTP 请求,而是建立 TCP 连接后保持空闲。此时,WAF 的连接跟踪可能不适用。更有效的是在负载均衡器(如 ALB)上设置空闲超时,关闭不活跃连接。
AWS 文档建议在响应攻击时,提供自己的缓解措施。你可以结合 WAF 的速率规则和 IP 信誉列表,动态阻断攻击源。但需注意,攻击可能来自分布广泛的僵尸网络,IP 列表可能滞后。
第四步:架构层面的缓解与取舍
AWS Well-Architected 框架强调权衡。对于 Sockstress 攻击,可以考虑以下架构调整:
- 使用 CDN 或 Anycast 网络:分散攻击流量,隐藏源站 IP。但 Sockstress 针对的是 TCP 连接,CDN 可能无法完全吸收。
- 弹性伸缩:通过自动扩展组增加实例,以应对资源消耗。但攻击可能导致新实例也被耗尽,需要结合健康检查。
- 部署专用防护设备:如 AWS Shield Advanced 提供的 DDoS 响应团队,但成本较高。
每种方案都有代价:内核参数调整可能影响性能,WAF 规则可能误杀,架构改造可能增加延迟。你需要根据业务重要性和攻击频率选择。
常见误区与失败条件
一个常见误区是只依赖流量清洗。Sockstress 流量小,清洗中心可能不触发。另一个误区是过度调整内核参数,如将 SYN backlog 调得过大,反而增加内存消耗。
失败条件包括:未监控连接状态、未设置连接超时、WAF 规则过于宽松、或未与云服务商协调。AWS 文档指出,对于 L3/L4 攻击,自动缓解有效,但 L7 攻击需要主动响应。Sockstress 介于两者之间,需要组合策略。
参考资料
延伸阅读
