CDN中的ddos防护

title:      CDN中的ddos防护
author:     sheazhang

目录

DDOS大类可分为两种:

  1. 带宽消耗型:消耗带宽,在入口阻塞正常用户。类型有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。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jerry的SAP技术分享

Java singleton初始化顺序研究

8220
来自专栏Java架构

Redis压缩列表原理与应用分析

Redis是一款著名的key-value内存数据库软件,同时也是一款卓越的数据结构服务软件。它支持字符串、列表、哈希表、集合、有序集合五种数据结构类型,同时每种...

16030
来自专栏Bingo的深度学习杂货店

Leetcode 【524、767、1053、1079】

这道题是给一个字符串s和一个单词数组,找到数组里面最长的单词,该单词可以通过删除s的某些字符来得到。如果答案不止一个,返回长度最长且字典序最小的单词。如果答案不...

11930
来自专栏一个会写诗的程序员的博客

缓存雪崩 & 缓存穿透

12110
来自专栏阿杜的世界

vavr:让你像写Scala一样写Java

Hystrix是Netflix开源的限流、熔断降级组件,去年发现Hystrix已经不再更新了,而在github主页上将我引导到了另一个替代项目——resilie...

16430
来自专栏null的专栏

深度学习算法原理——TextCNN

论文地址:Convolutional Neural Networks for Sentence Classification

19540
来自专栏Bingo的深度学习杂货店

Leetcode 【739、946、973】

这道题是给一个温度列表,重新生成一个列表:对应位置是需要再等待多久温度才会升高超过该日的天数。

8320
来自专栏悠扬前奏的博客

Spark-实例0.Word Count

import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContex...

9420
来自专栏Golang开发

golang-101-hacks(26)——io.Writer interface

Compared to io.Reader, since you no need to consider io.EOF error, the process o...

7620
来自专栏Jerry的SAP技术分享

jUnit生命周期管理学习

8140

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励