title: CDN中的ddos防护
author: sheazhang
目录
DDOS大类可分为两种:
- 带宽消耗型:消耗带宽,在入口阻塞正常用户。类型有UDP FLOOD和ICMP FLOOD
- 防御方法:提升服务器(交换机)入流量带宽,单机10G,机房一般是100G。针对UPD Flood,如果不提供UDP服务,可以直接丢弃,针对ICMP Flood,运营商层面一般就会阻断,禁止ping包可以。
- 防御方法:针对带宽消耗型攻击,目前主要靠灵活调度来防御。而且这种情况下,流量根本就没有到我们的服务器,在机房交换机上一层就已经拥塞了,机房完全不可用。比如我们一个机房受到了300G DDOS攻击。导致机房上层拥塞,这种情况,探测到后,及时将业务迁移即可。
2. 资源消耗型攻击:攻击者利用协议的缺陷或者模拟应用层协议,构造恶意的攻击报文,这种报文没有作用但是目标服务器又不得不处理,消耗大量系统资源,导致目标服务器异常,影响正常应用。比如SYN Flood,ACK Flood,CC攻击。
get back
主要讲资源消耗型攻击
1. SYN Flood
TCP(Transmission Control Protocol)是有状态协议,会通过协议中的字段来维护各种状态,比如flag(指定包的类型:syn, ack, fin等),序列号(seq number,解决包乱序问题),窗口(滑动窗口,用于流控制)。
下图是TCP在整个周期中涉及的过程,包括初始化,数据传输和断开连接。SYN Flood就是根据TCP的三次握手原理,发动的攻击。 下面是详细的交互过程:
- 关于建连接时SYN超时
- 试想一下,如果server端接到了clien发的SYN后回了SYN-ACK后client掉线了,server端没有收到client回来的ACK,那么,这个连接处于一个中间状态,即没成功,也没失败。于是,server端如果在一定时间内没有收到的TCP会重发SYNACK。
- 在Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s 2s 4s 8s 16s 32s = 2^6 -1 = 63s,TCP才会把断开这个连接。
- SYN FLOOD:
- 一些恶意的人就为此制造了SYN Flood攻击——给服务器发了一个SYN后,就下线了,于是服务器需要默认等63s才会断开连接,这样,攻击者就可以把服务器的syn连接的队列耗尽,让正常的连接请求不能处理。
- SYN队列值的大小在在`tcp_max_syn_backlog`设置。现在的linux版本有一个`tcp_syncookies`参数,能一定程度上抵御DDOS攻击,当SYN队列满了后,TCP 会通过源地址端口、目标地址端口和时间戳打造出一个特别的Sequence Number发回去(又叫cookie),如果是攻击者则不会有响应,如果是正常连接,则会把这个 SYN Cookie发回来,然后服务端可以通过cookie建连接(即使你不在SYN队列中)。
- 改进的防御方式:
- 上诉方法能抵御较少量的攻击,但实际测试过程中,对于TS80(24个逻辑CPU 64G内存),包量达到,154万/s时,CPU已经满负载了,ping测试丢包率达到80%。主要消耗CPU的地方在于过滤iptables规则和syncookies生成算法。
- 针对这两个,DDOS专用内核有两个改进:
- 把syncookies模块提前到ip_rcv中执行:IP层传到TCP层,需要根据包中的目的端口,现在iptalbes做一层过滤,如果规则是 drop,则直接丢弃,如果要放行,则传到TCP层处理。DDOS专用内核将这一层处理提前到ip_rsv,并设置端口白名单,如果包中的目的端口不是服务器监听的端口,直接丢弃,不用iptables过滤。
- 更改syncookies生成算法:cookie的计算是目前内核是使用SHA1算法的,并只取其中的32个bit。SHA1计算的值是有160个bit的。而只需要一个32个bit的数,却使用了这么复杂的算法,划不来。DDOS内核采用了Jhash算法,快速计算出32个bit的cookie值的同时也不会导致SynCookies的安全性降低。Jhash的速度更快,消耗的CPU更小。
- 攻击判定:在服务器上抓包,如果有SYN Flood攻击,包中应该有大量的SYN包。
2. ACK Flood
主机在接收到一个带有ACK标志位的数据包的时候,需要检查该数据包所表示的连接四元组是否存在,如果存在则检查该数据包所表示的 状态是否合法,然后再向应用层传递该数据包。如果不存在,且没有开syncookies则,直接返回rst。这种情况,ACK Flood并不会消耗太 多的CPU资源,攻击效果并不明显,但如果主机开了syncookies,并且遭受了SYN Flood攻击,对于攻击发送的ACK,都将需要计算 cookies,这也同样需要大量CPU资源,现在DDOS专用内核使用新hash算法,对此类攻击同样有较好的防护效果。
3. CC 攻击
CC攻击可以归为DDoS攻击的一种。他们之间的原理都是一样的,即发送大量的请求数据来导致服务器拒绝服务,是一种连接攻击。CC攻击又可分为代理CC攻击,和肉鸡CC攻击。请求的内容一般为动态资源,比如js/cgi/asp, 由于这类攻击能模仿正常用户请求,很难识别,较难防御。而且用户放在CDN的内容,针对这类文件一般都不会缓存,直接透传到源站。 针对这类攻击,只能在业务层面防护,比如针对某些动作,做限制频率,比如某个IP,5分钟内只能请求3次,超过就返回403。