前言
最近在准备计网期中考试,分享一些计网有趣的知识吧~
正文
首先我们先了解TCP三次握手的过程,然后再讨论为什么会有SYN洪泛攻击,以及如何解决。
TCP三次握手
(1)⼀开始,客户端和服务端都处于 CLOSED
状态。先是服务端主动监听某个端口,处于 LISTEN
状态
(2)客户端会随机初始化序号( client_isn
),将此序号置于 TCP 报文段首部的序号
字段中,同时把 SYN 标志位置为 1 ,表示SYN
报文段(不包含应用层数据)。该报文段会被封装在一个IP数据报中,并发送给服务器,表示向服务端发起连接,之后客户端处于 SYN-SENT
状态
(3)服务端收到客户端的 SYN 报文后,为该TCP连接分配TCP缓存和变量。随后服务端也随机初始化⾃⼰的序号( server_isn ),将此序号填入TCP 报文段首部的序号
字段中,其次把 TCP报文段首部的确认应答号
字段填入 client_isn + 1
, 接着把 SYN和 ACK 标志位置为 1,表示SYNACK报文段
。最后把该报文发给客户端,表示允许连接。该报文也不包含应用层数据,之后服务端处于 SYN-RCVD
状态。
(4)客户端收到服务端报文后,客户也要给该连接分配缓存和变量。并向服务端回应最后⼀个应答报文,将该应答 TCP报文段 首部 ACK 标志位置为 1 ,SY标志位被置为0,其次确认应答号
字段填入 server_isn + 1
,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED
状态。服务器收到客户端的应答报文后,也进入 ESTABLISHED
状态。
注意到每一次连接
,客户端和服务器都要给该连接分配缓存和变量(变量指的是接收窗口,表示该接收方还有多少可用的缓存空间)。
SYN洪泛攻击
如上握手过程,我们知道服务器为了响应一个收到的SYN
,分配并初始化连接变量和缓存。然后服务器发送一个SYNACK
进行响应,并等待来自客户的ACK报文段。如果某客户不发送ACK来完成该三次握手的第三步,服务器则处于半开连接状态
SYN洪泛攻击
属于DoS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。在这种攻击中,攻击者发送大量的TCP SYN报文段,而不完成第三次握手的步骤。随着这种SYN报文段纷至沓来,服务器不断为这些半开连接分配资源(但从未使用),导致服务器的连接资源被消耗殆尽。
Dos攻击有如下三种,而
SYN洪泛攻击
就是连接洪泛攻击
的一种。
现在有一种有效的防御系统,称为SYN cookie
它们被部署在大多数主流操作系统中
-
当服务器接收到一个SYN报文段时,它并不知道该报文段是来自一个合法的用
户,还是一个SYN洪泛攻击的一部分。因此服务器不会为该报文段生成一个半
开连接。相反,服务器生成一个初始TCP序列号,该序列号是SYN报文段的源 和目的IP地址与端口号以及仅有该服务器知道的秘密数的一个复杂函数(散列函数)。这种精心制作的初始序列号被称为“cookie”。服务器则发送具有这种
特殊初始序列号的SYNACK
分组。重要的是,服务器并不记忆该cookie或任何
对应于SYN的其他状态信息 -
如果客户是合法的,则它将返回一个ACK报文段。当服务器收到该ACK,需要
验证该ACK是与前面发送的某些SYN相对应的。前面讲过对于一个合法的ACK,在确认字段中的值等于在SYNACK
字段(此时为cookie值)中的值加1 。服务器则将使用该报文段中的源和目的地IP地址与端口号以及秘密数运行相同的散列函数。如果该函数的结果加1与在客户的SYNACK中的确认(cookie)值相同的话,服务器认为该ACK对应于较早的SYN报文段,因此它是合法的。服务器则生成一个具有套接字的全开的连接 -
在另一方面,如果客户没有返回一个ACK报文段,则初始的SYN并没有对服务
器产生危害,因为服务器没有为它分配任何资源。