运输层:SYN泛洪攻击

SYN泛洪是一种TCP拒绝服务攻击,在这种攻击中一个或多个恶意的客户端产生一系列TCP连接尝试(SYN报文段),并将它们发送给一台服务器,它们通常采用“伪造”的源IP地址。服务器会为每一条连接分配一定数量的连接资源(比如说内存)。由于连接尚未完全建立,服务器为了维护大量的半打开连接会在耗尽自身内存后拒绝为后续的合法连接请求服务。
通常的解决办法是SYN cookie:
当服务器收到一个SYN报文时,它并不知道该报文段是来自一个合法的用户,还是一个SYN泛洪攻击的一部分。因此服务器不会为该报文段生成一个半开连接,服务器会生成一个初始TCP序列号,该序列号是SYN报文段的源和目的IP地址以及仅有该服务器知道的秘密数的一个复杂函数(散列函数)。这个精心制作的初始序列号称为“cookie”。服务器则发送具有这种初始序列号的SYNACK分组。重要的是,服务器并不记忆该cookie或任何对应于SYN的其他状态信息。
如果客户是合法的,则它返回一个ACK报文段。当服务器收到该ACK,需要验证该ACK是与前面发送的某些SYN相对应的。如果该服务器没有维护有关SYN报文段的记忆,这是怎样完成的呢?它是借助于cookie来做到的。对于一个合法的ACK,在确认字段中的值等于在SYNACK字段(此时为cookie值)中的值加1.服务器使用SYNACK报文段中的源和目的IP地址与端口号(它们与初始的SYN中的相同)以及秘密数运行相同的散列函数。如果该函数的运行结果加1与在客户的SYNACK中的确认值相同的话,服务器认为该ACK对应于较早的SYN报文段,因此它是合法的。服务器则生成一个具有套接字的全开的连接。
在另一方面。如果客户没有返回一个ACK报文段,则初始的SYN并没有对服务器产生危害,因为服务器没有为它分配任何资源。

关于SYN cookie的自我理解:由于SYN泛洪会制造来自客户端的连接请求,但是仅限于发起,也就是第一次握手环节,然后服务端收到若干连接请求,实际上是难以区分真实用户和泛洪攻击的一部分,所以会建立起大量的半打开连接消耗内存,并且会不停的给泛洪攻击的虚假IP发送SYNACK报文。所以解决方法就是真实用户和泛洪攻击的IP都不一开始建立连接分配资源,而是等到确定了是真实用户才分配资源,这其中的做法就是把来自客户端的关键信息做成SYNACK中的序列号反馈回去,如果还能回应上了这个序列号,也就是客户端回应了ACK报文并且其中的序列号值为cookie+1,说明该客户端是真实用户,要不然就是伪造的。

参考书籍:《计算机网络自顶向下方法》、《TCP/IP详解 卷1:协议》

猜你喜欢

转载自blog.csdn.net/qq_43847153/article/details/126832392