记一次线上 DDoS 攻击案例

2024-06-14 ⏳5.8分钟(2.3千字)

跟进大半年的项目终于上线了🎉虽说上线当天没有出问题,最近却受到了一次 DDoS 攻击。说起来我还没有线上 DDoS 的相关经验,这次攻击规模不大,有些方面符合预期,有些方面出乎预料。今天把这次攻击事件分享出来,给大家做个参考。

攻击概况

攻击发生于上午八点多,持续时间七分钟,攻击流量 bps 峰值为 48.11Gbps,攻击流量 pps峰值为 7.98Mpps。攻击者只打了我们一台业务服务器。可能是在测试攻击效果。因为我们配置了 DDoS 原生防护,这一小波流量被挡住了。攻击者见我们有防护,而且服务器众多,可能就打消了继续作恶的念头。

项目上线之前,我们跟相关方面做过多次安全相关的讨论。我们的业务服务走 TCP 长连接,肯定要买 DDoS 高防包。国内互联网管制比较严格,在国内搞事很容易溯源追查,所以我个人判断 DDoS 攻击流量应该以海外流量为主。新项目的海外用户极少,我建议运营方在上线当天屏蔽海外流量;如果有海外用户,可引导他们使用加速器等手段连回国内。运营表示海外用付费用户,此计不妥,只能作罢。于是就老老实实地购买高防包。

来源分布

此次攻击的来源分布如下图:

DDoS 来源地域分布

从图上看,大多数流量来自海外,这印证我前面的猜测。但是来自中国大陆流量居然快要占到十分之一了。看来黑产真是比较猖獗,国内的互联网管控也并非铁板一块😂我们在工作中不能掉以轻心⚠️

类型分布

此次攻击的类型分布如下:

DDoS 攻击类型分布

排在第一的居然跟 Memcached 有关,确实比较意外😳

DDoS 攻击的核心原理是耗光服务器资源,使用无法处理正常请求。这里的资源主要是带宽,当然也包含 CPU、内存、文件描述符等。只要是有限的资源,都可以被耗光。如果想耗光服务器的带宽,最简单的办法就是暴力发包。攻击者可以找几台大带宽主机,不停给攻击对象发包,耗尽对方带宽。但这种方法缺点有二,其一是来源很明确,防守方可以把有限的来源 IP 加到黑名单里就能阻止攻击;其二,这种方法可以说是杀敌一千,自损八百。要想耗尽对方的带宽,攻击方至少要准备一样多的网络资源,这样攻击成本就可能很高。

后续衍生出的各种攻击方法都是在想办法解决上述两个问题。

第一类方案是僵尸网络。攻击者利用系统漏洞控制大批服务器并组成僵尸网络。确定攻击对象后,攻击者会控制大量的服务器发送 ICMP 包或 UDP 包,耗光服务器带宽。因为服务器众多,攻击流量的来源 IP 地址各不相同,几乎很难阻止。上图中的 ICMP/UDP-None/TCP-ACK 都算这一类型。

僵尸网络虽然很有效,但控制大量肉鸡也绝非易事。而且网络一旦开始攻击,就会受到司法体系的调整,可能用不了多久就被捣毁,可持续性较差。所以黑产还会采用其他的方案。这里比较取巧的就是 TCP-SYN 型攻击。

TCP 创建连接需要三次握手,过程如下图所示:

TCP 三次握手

客户端(连接主动一方)先发送 SYN 报文,服务器收到后会分配系统资源,回复 SYN/ACK 报文,并等待客户端的 ACK 报文。攻击方通过伪造 IP 源地址和 TCP 源端口,向服务器发送大量 SYN 报文。一伪造的源地址和源端口根本不会响应服务端的报文,而服务端收到后会不断分配资源记录连接状态,最终会塞满 SYN 对列而无法对外提供服务。因为 SYN 报文很小,攻击者不需要很大的带宽就能实现 DDoS 攻击。

这类方案虽好,却需要一个前提条件,即攻击者所在的网络允许发送非自由网段的报文。什么意思?假设 ISP A 的网段是 10.0.0.0/8 那么它所有设备的原地址都应该是 10.X.X.X。如果没有其他 ISP 从该 ISP A 购买 transit 服务或者做 peer 互联,那么从 ISP A 发出的所有报文的源地址应该都在 10.0.0.0/8 网段。可是现实中的互联网是由大量的 ISP 共同参与,这些机构技术能力和管理规范参差不齐,有些 ISP 居然就允许网内认备随意修改报文的来源地址还帮其转发。这就是所谓的 IP spoofing。

TCP-ACK 这种相对来说比较容易应对,最简单的就是开启 SYN cookie。该方案简单来说就是服务端收到 SYN 报文后,会根据客户端的 IP 地址、端口、当前时间等信息生成一个特殊的 SYN/ACK 包发给客户端,此时并不会在服务端分配资源保存状态。等服务端收到最后的 ACK 报文完成验证后再分配资源。这样就轻松绕过了攻击陷阱。具体原理我会另写文章分析。

显然,攻击者不会善罢甘休~他们很块就基于 IP spoofing 找到了新的攻击方法 reflect-flood,也就反射泛洪攻击。该方法简单来说就是攻击者借力打力。首先,攻击者找到很多有安全隐患的中间服务器,主要是 UDP 服务,像是开启了 UDP 协议的 Memcached 、NTP 服务、 DNS 解析服务等。然后,攻击者发送大量查询请求,并把报文的源地址修改为攻击目标的地址。中间服务收到请求后以为是攻击对象在查询数据,于是返回查询结果。这就好像比是中间服务把攻击者的流量反射到了攻击对象上,所以叫反射攻击。通常查询报文体积很小,响应报文体积很大,所以攻击者可以用很小的带宽对攻击对象发起很大的流量冲击。上图中的 Memcached-Reflect-Flood 和 NTP-Reflect-Flood 都属于这一类。因为效果太棒了,所以应用十分广泛🤦而且成本极为低廉。只要发现配置不合理的中单服务器,就能很容易发起 DDoS 攻击。

反射攻击

治理反思

DDoS 攻击危害巨大。现在社会在骨干网上投入巨大,但大量资源都被 DDoS 攻击消耗掉了,不但产生不了收益,还会造成危害~但 DDoS 攻击所利用的却又是比较低级的配置漏洞。如果所有的系统都开启 SYN cookie,那么 TCP-SYN 泛洪攻击就无处实施;如果像 Memcached/NTP 等 UDP 服务都能严格配置防火墙等安全策略,反射攻击也就失去了中转节点;如果所有 ISP 都能根据自身的网段严格过虑流量,那就不会有 IP spoofing 问题,与之相关的一系列 DDoS 攻击就会烟消云散。但互联网从诞生之初就是一个松散的联盟,各自治系统使用 BGP 协议平等互联,系统内部独立管理,互不干涉。可能正是由于这种松散的治理体系才有现在的互联网。对于 DDoS 攻击,早在 2000 年 IETF 就发布了 RFC2827 来治理 IP spoofing 问题。到现在 24 年过去了,IP spoofing 仍然没有解决,全世界每年都要投入巨大的资源来应对 DDoS 攻击,真是太遗憾了。不过我们应该乐观,现在 RPKI 技术已经逐渐普及,以后各 ISP 应该会越来越严格地过滤非法报文,DDoS 攻击应该会越来越少。期待没有 DDoS 的世界🌍