在了解分布式拒绝服务攻击的原理之前,先要了解以下两个关键的基础原理
1.TCP饿死:
UDP这种传输方式不会控制自己在通信通道里的流量,可理解为不讲道理的人。他们来到了一个热闹地区的KFC中,但是他们不买东西只排队将所有食物的价格都问一遍,占满所有的座位和过道。而常规的TCP服务通过自己的弹窗机制来控制流量,好比讲道理的人,座位被占满了,TCP自然会离开KFC导致正常的服务不能进行。最终的结果就是UDP将整个通道打满堵死。
2.TCP三次握手和四次断开连接:
文字说不清楚,见下图
TCP头格式
seq:序列号;ack:确认序列号
双方均需要确认才可断开连接
关于双方在整个过程中每个时间段的状态名称·
分析完以上的两个原理便可继续
DOS攻击:一台或多台计算机对受攻击服务器的某一个端口发送大量无关的UDP报文,导致整个通道内的正常服务无法进行。
DDOS攻击:大量的肉鸡对服务器的不同端口发送巨型流量的UDP报文,无法通关关闭端口的方式来进行隔离,破坏力极强,严重会造成服务器当机。
根据攻击的时间和方式又可分将DDOS为以下几种
1.SYN Flood
2.ACK Flood
3.Connection Flood
4.HTTP Get Flood
对TCP饿死的应对方案
1.增加带宽,堵死了再买
2.CDN,各地部署子服务器,当子服务遭受到攻击时,其他地区的服务器和主服务器不会受到影响。
3.BGP流量清洗,通过BGP将通道内的无用UDP报文清洗干净再转给服务器
1
、
SYN
洪水攻击
要理解
dos
攻击,首先要理解
TCP
连接的三次握手过程
(Three-wayhandshake)
。
在
TCP/IP
协议中,
TCP
协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手
:
建立连接时,客户端发送
SYN
包
((SYN=i)
到服务器,并进入
SYN SEND
状态,等待服务器确认
;
第二次握手
:
服务器收到
SYN
包,必须确认客户的
SYN (ACK=i+1 )
,同时自己也发送一个
SYN
包
((SYN=j)}
即
SYN+ACK
包,此时服务器进入
SYN_RECV
状态
;[1]
第三次握手
:
客户端收到服务器的
SYN+ACK
包,向服务器发送确认包
ACK(ACK=j+1)
,此包发送完毕,客户端和服务器进入
ESTABLISHED
状态,完成三次握手,客户端与服务器开始传送数据。
在上述过程中,还有一些重要的概念
:[1]
半连接
:
收到
SYN
包而还未收到
ACK
包时的连接状态称为半连接,即尚未完全完成三次握手的
TCP
连接。
半连接队列
:
在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的
SYN
包
(SYN=i )
开设一个条目,该条目表明服务器已收到
SYN
包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于
SYN_ RECV
状态,当服务器收到客户的确认包时,删除该条目,服务器进入
ESTABLISHED
状态。
Backlog
参数
:
表示半连接队列的最大容纳数目。
SYN-ACK
重传次数
:
服务器发送完
SYN-ACK
包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息、从半连接队列中删除。注意,每次重传等待的时间不一定相同。
半连接存活时间
:
是指半连接队列的条目存活的最长时间,也即服务从收到
SYN
包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时也称半连接存活时间为
Timeout
时间、
SYN_RECV
存活时间。
上面三个参数对系统的
TCP
连接状况有很大影响。
SYN
洪水攻击属于
DoS
攻击的一种,它利用
TCP
协议缺陷,
通过发送大量的半连接请求,耗费
CPU
和内存资源。
SYN
攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上
SYN
攻击并不管目标是什么系统,只要这些系统打开
TCP
服务就可以实施。从图
4-3
可看到,服务器接收到连接请求
(SYN=i )
将此信息加入未连接队列,并发送请求包给客户端
( SYN=j,ACK=i+1)
,此时进入
SYN_RECV
状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合
IP
欺骗,
SYN
攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的
IP
地址,向服务器不断地发送
SYN
包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的
SYN
包将长时间占用未连接队列,正常的
SYN
请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。过程如下
:[1]
攻击主机
C(
地址伪装后为
C')—–
大量
SYN
包
—->
被攻击主机
C'<——-SYN/ACK
包
—-
被攻击主机
由于
C’
地址不可达,被攻击主机等待
SYN
包超时。攻击主机通过发大量
SYN
包填满未连接队列,导致正常
SYN
包被拒绝服务。另外,
SYN
洪水攻击还可以通过发大量
ACK
包进行
DoS
攻击。
【防御方法】
第一种是
缩短
SYN Timeout
时间
第二种方法是
设置
SYN Cookie
,就是给每一个请求连接的
IP
地址分配一个
Cookie
,如果短时间内连续受到某个
IP
的重复
SYN
报文,就认定是受到了攻击,以后从这个
IP
地址来的包会被一概丢弃。
>netstat -n -p tcp >result.txt
【
SYN Cookie
】
当服务器收到一个
SYN
报文后,
不立即分配缓冲区
,而是利用连接的信息生成一个
cookie
,并将这个
cookie
作为将要返回的
SYN
+
ACK
报文的初始序列号。
当客户端返回一个
ACK
报文时,根据包头信息计算
cookie
,与返回的确认序列号(初始的序列号+
1
)的前
24
位进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接。
【缺陷】
SYN Cookies
的使用不与任何协议定义冲突,照理来说它该和所有的
TCP
实现兼容。然而,当
SYN Cookies
使用的时候,会发生两种值得注意的变化:
首先,服务器只能编码八种
MSS
数值,因为只有
3
位二进制空间可用。
其次,这个服务器必须拒绝所有的
TCP
选用项,例如大型窗口和时间戳,因为服务器会在信息被用其他方式存储时丢弃
SYN
队列条目。
尽管这些限制将不可避免地导致一个不如最佳的体验,它们的效果很少被客户端注意到
——
这些改变只在被攻击时值得注意。在这样的情况下,牺牲
TCP
选项来保护连接一般被认为是合乎情理的。
Linux
内核从
2.6.26
版本开始为
TCP
选用项加入了有限的支持,通过把它们编码在时间戳内实现。
较新的
TCP Cookie
传输(
TCPCT
)标准被设计用来克服
SYN Cookies
的这些问题,并且在各种方面改进这套机制。不像
SYN Cookies
,
TCPCT
是一个
TCP
拓展并且要求两端点都支持
TCPCT
。
2
、
ACK Flood
攻击
在
TCP
连接建立之后,
所有的数据传输
TCP
报文都是带有
ACK
标志位的,
主机在接收到一个带有
ACK
标志位的数据包的时候,需要检查该数据包所表示的连接四元组是否存在,如果存在则检查该数据包所表示的状态是否合法,然后再向应用层传递该数据包。如果在检查中发现该数据包不合法,例如该数据包所指向的目的端口在本机并未开放,则
主机操作系统协议栈会回应
RST
包告诉对方此端口不存在。
通常状态检测防火墙所做的事情与此类似,只不过防火墙只拦截非法的数据包,而不主动回应。
对比主机以及防火墙在接收到
ACK
报文和
SYN
报文时所做动作的复杂程度,显然
ACK
报文带来的负载要小得多。所以在实际环境中,只有当攻击程序每秒钟发送
ACK
报文的速率达到一定的程度,才能使主机和防火墙的负载有大的变化。当发包速率很大的时候,
主机操作系统将耗费大量的精力接收报文、判断状态,同时要主动回应
RST
报文,正常的数据包就可能无法得到及时的处理
。这时候客户端(以
IE
为例)的表现就是访问页面反应很慢,丢包率较高。
但是状态检测的防火墙通过判断
ACK
报文的状态是否合法,借助其强大的硬件能力可以较为有效的过滤攻击报文。
当然如果攻击流量非常大(特别是千兆线路上,我们曾经观察到
200~300Mbps
左右的
ACK Flood
),由于需要维护很大的连接状态表同时要检查数量巨大的
ACK
报文的状态,防火墙也会不堪重负导致全网瘫痪。
3
、死亡之
ping (pingofdeath)
ICMP(InternetControlMessageProtocol
,
Internet
控制信息协议
)
在
Internet
上用于错误处理和传递控制信息。
最普通的
ping
程序就是这个功能。而在
TCP/IP
的
RFC
文档中对包的最大尺寸都有严格限制规定,许多操作系统的
TCP/IP
协议栈
都规定
ICMP
包大小为
64KB
,且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区。
“PingofDeath”
就是故意产生畸形的测试
Ping
(
PacketInternetGroper
)包,声称自己的尺寸超过
ICMP
上限,也就是加载的尺寸超过
64KB
上限,使未采取保护措施的网络系统出现内存分配错误,导致
TCP/IP
协议栈崩溃,最终接收方宕机。
【防御方法】
1
、用高级设置法预防
Ping
2
、用网络防火墙阻隔
Ping
使用防火墙来阻隔
Ping
是最简单有效的方法,现在基本上所有的防火墙在默认情况下都启用了
ICMP
过滤的功能。
3
、
启用
IP
安全策略防
Ping
4
、
修改
TTL
值防
Ping
许多入侵者喜欢用
TTL
值来判断操作系统,他们首先会
Ping
一下你的机子,如看到
TTL
值为
128
就认为你的系统为
Windows NT/2000
,如果
TTL
值为
32
则认为目标主机操作系统为
Windows 95/98
,
如果为
TTL
值为
255/64
就认为是
UNIX/Linux
操作系统。既然入侵者相信
TTL
值所反应出来的结果,那么我们不妨修改
TTL
值来欺骗入侵者,达到保护系统的目的
5
、防火墙在处理
Ping of Death
攻击报文时,是通过判定数据包的大小是否大于
65535
字节,如果数据包大于
65535
字节,则判定为攻击报文,直接丢弃。
4
、
UDP
泛洪
UDPflood
攻击:如今在
Internet
上
UDP
(用户数据包协议)的应用比较广泛,
很多提供
WWW
和
Mail
等服务设备通常是使用
Unix
的服务器,它们
默认打开一些被黑客恶意利用的
UDP
服务。如
echo
服务会显示接收到的每一个数据包,而原本作为测试功能的
chargen
服务会在收到每一个数据包时随机反馈一些字符。
UDPflood
假冒攻击就是利用
这两个简单的
TCP/IP
服务的漏洞
进行恶意攻击,通过伪造与某一主机的
Chargen
服务之间的一次的
UDP
连接,回复地址指向开着
Echo
服务的一台主机,通过将
Chargen
和
Echo
服务互指,
来回传送毫无用处且占满带宽的垃圾数据,在两台主机之间生成足够多的无用数据流,
这一拒绝服务攻击飞快地导致网络可用带宽耗尽。
【防御方法】
UDP
协议与
TCP
协议不同,是无连接状态的协议,并且
UDP
应用协议五花八门,差异极大,因此针对
UDP Flood
的防护非常困难。其防护要根据具体情况对待:
判断包大小,如果是大包攻击则使用防止
UDP
碎片方法:根据攻击包大小设定包碎片重组大小,通常不小于
1500.
在极端情况下,可以考虑丢弃所有
UDP
碎片。
攻击端口为业务端口:根据该业务
UDP
最大包长设置
UDP
最大包大小以过滤异常流量。
攻击端口为非业务端口:一个是丢弃所有
UDP
包,可能会误伤正常业务
;
一个是建立
UDP
连接规则,要求所有去往该端口的
UDP
包,必须首先与
TCP
端口建立
TCP
连接。不过这种方法需要很专业的防火墙或其他防护设备支持。
5
、
Land
(
LandAttack
)攻击
在
Land
攻击中,黑客利用一个特别打造的
SYN
包
—
它的原地址和目标地址都被设置成某一个服务器地址进行攻击
。
此举将导致接受服务器向它自己的地址发送
SYN-ACK
消息,
结果这个地址又发回
ACK
消息并创建一个空连接,每一个这样的连接都将保留直到超时,
在
Land
攻击下,许多
UNIX
将崩溃,
NT
变得极其缓慢(大约持续五分钟)。
【防御方法】
防火墙在处理
Land
攻击报文时,通过检查
TCP
报文的源地址和目的地址是否相同,或者
TCP
报文的源地址是否为环回地址,如果是则丢弃。
6
、泪滴攻击
对于一些大的
IP
数据包,往往需要对其进行拆分传送,这是为了迎合链路层的
MTU
(最大传输单元)的要求。比如,一个
6 000
字节的
IP
包,在
MTU
为
2 000
的链路上传输的时候,就需要分成
3
个
IP
包。在
IP
报头中有一个偏移字段和一个拆分标志(
MF
)。如果
MF
标志设置为
1
,则表示这个
IP
包是一个大
IP
包的片段,其中偏移字段指出了这个片段在整个
IP
包中的位置。例如,对一个
6 000
字
节的
IP
包进行拆分(
MTU
为
2 000
),
则
3
个片段中偏移字段的值依次为
0
,
2 000
,
4 000
。
这样接收端在全部接收完
IP
数据包后,就可以根据这些信息重新组装这几个分次接收的拆分
IP
包。在这
里就有一个安全漏洞可以利用了,就是
如果黑客们在截取
IP
数据包后,把偏移字段设置成不正确的值,这样接收端在收到这些分拆的数据包后,就不能按数据包中的偏移字段值正确组合这些拆分的数据包,但接收端会不断尝试,这样就可能致使目标计算机操作系统因资源耗尽而崩溃。
【防御方法】
检测这类攻击的方法是对接收到的分片数据包进行分析,计算数据包的片偏移量(
Offset
)是否有误。反攻击的方法是添加系统补丁程序,丢弃收到的病态分片数据包并对这种攻击进行审计。尽可能采用最新的操作系统,或者在防火墙上设置分段重组功能,由防火墙先接收到同一原包中的所有拆分数据包,然后完成重组工作,而不是直接转发。因为防火墙上可以设置当出现重叠字段时所采用的规则。
7
、
IP
地址扫描攻击
IP
地址扫描攻击是攻击者运用
ICMP
报文(如
Ping
和
Tracert
命令)探测目标地址
,或者使用
TCP/UDP
报文对一定地址发起连接,通过判断是否有应答报文,以确定哪些目标系统确实存活着并且连接在目标网络上。
【防御方法】
防火墙对收到的
TCP
、
UDP
、
ICMP
报文进行检测,当某源
IP
地址连续发送报文的目的
IP
地址与前一个报文的目的
IP
地址不同时,则记为一次异常,当异常次数超过预定义的阈值时,则认为该源
IP
的行为为
IP
地址扫描行为,防火墙会将该源
IP
地址加入黑名单。
8
、
Smurf
攻击
Smurf
攻击通过使用将回复地址设置成受害网络的广播地址的
ICMP
应答请求
(ping)
数据包,来淹没受害主机,最终导致该网络的所有主机都对此
ICMP
应答请求做出答复,导致网络阻塞。更加复杂的
Smurf
将源地址改为第三方的受害者,最终导致第三方崩溃。
攻击的过程是这样的:
Woodlly Attacker
向一个
具有大量主机和因特网连接的网络的广播地址发送一个欺骗性
Ping
分组(
echo
请求)
,这个目标网络被称为反弹站点,而欺骗性
Ping
分组的源地址就是
Woolly
希望攻击的系统。
这种攻击的前提是,路由器接收到这个发送给
IP
广播地址(如
206.121.73.255
)的分组后,会认为这就是广播分组,并且把以太网广播地址
FF:FF:FF:FF:FF:FF:
映射过来。这样路由器因因特网上接收到该分组,会对本地网段中的所有主机进行广播。
读者肯定能够想到下面会发生什么情况。网段中的所有主机都会向欺骗性分组的
IP
地址发送
echo
响应信息。如果这是一个很大的以太网段,可以会有
500
个以上的主机对收到的
echo
请求进行回复。
由于多数系统都会尽快地处理
ICMP
传输信息,
Woodlly Attacker
把分组的源地址设置为目标系统,因此目标系统都很快就会被大量的
echo
信息吞没,这样轻而易举地就能够阻止该系统处理其它任何网络传输,从而引起拒绝为正常系统服务。
这种攻击不仅影响目标系统,还影响目标公司的因特网连接。如果反弹站点具有
T3
连接(
45Mbps
),而目标系统所在的公司使用的是租用线路(
56Kbps
),则所有进出该公司的通讯都会停止下来。
这种攻击现在已经很少见
,
大多数的网络已经对这种攻击免疫了
.
【防御方法】
配置路由器禁止
IP
广播包进网
配置网络上所有计算机的操作系统,禁止对目标地址为广播地址的
ICMP
包响应。
被攻击目标与
ISP
协商,有
ISP
暂时阻止这些流量。
对于从本网络向外部网络发送的数据包,本网络应该将其源地址为其他网络的这部分数据包过
9
、
Fraggle
攻击
类似于
Smurf
,使用
UDP
应答消息而非
ICMP
。
UDP
端口
7
(
ECHO
)和端口
19
(
Chargen
)在收到
UDP
报文后,都会产生回应。在
UDP
的
7
号端口收到报文后,会回应收到的内容,而
UDP
的
19
号端口在收到报文后,会产生一串字符流。它们都同
ICMP
一样,会产生大量无用的应答报文,占满网路带宽。攻击者可以向子网广播地址发送源地址为受害网络或受害主机的
UDP
包,端口号用
7
或
19.
子网络启用了此功能的每个系统都会向受害者的主机做出响应,从而引发大量的包,导致受害网络的阻塞或受害主机的崩溃;子网上没有启动这些功能的系统将产生一个
ICMP
不可达的消息,因而仍然消耗带宽。也可将源端口改为
Chargen
。目的端口为
ECHO
,这样会自动不停地产生回应报文,其危害性更大。
【防御方法】
检查进入防火墙的
UDP
报文,若目的端口号为
7
或
19
,则直接拒绝,并将攻击记录到日志,否则允许通过。
10
、电子邮件炸弹
电子邮件炸弹是最古老的匿名攻击之一,通过设置一台机器不断的大量的向同一地址发送电子邮件,攻击者能够耗尽接受者网络的带宽。
【防御方法】
对邮件地址进行配置,自动删除来自同一主机的过量或重复的消息。
11
、畸形消息攻击
各类操作系统上的许多服务都存在此类问题,由于这些服务在处理信息之前没有进行适当正确的错误校验,在收到畸形的信息可能会崩溃。
【防御方法】
打最新的服务补丁。