本文已参与「新人创作礼」活动,一起开启掘金创作之路。
SYN泛洪
什么是SYN泛洪
恶意攻击者伪造源IP发送大量SYN段给服务器,服务器要分配必要的资源,如TCP和设置计时器等。由于连接尚未完全建立,服务器为了维持大量的半打开连接会在耗尽自身内存后拒绝为后续的合法连接请求服务
解决
SYN COOKIES
主要思想
使用cookie推迟资源分配直到完整的连接建立。
当一个syn到达时,这条连接存储的大部分信息都被编码并保存在syn+ack报文段的序列号字段。采用syn cookies的目标主机不需要为了进入的连接请求分配任何资源,只有在syn+ack报文段本身被确认后(并返回了初始序列号)才会被分配真正的内存。
总的来说就是服务端会回一个带有特殊序列号的syn ack,如果对端回了ack,解析ack-1与将四元组与t散列函数的结果相同,说明不是syn泛洪攻击报文,服务器分配资源建立连接
过程
执行过程中服务器需要仔细选择tcp初始序列号,服务器在接收到1个syn后会采用下面的方法来设置初始序列号的数值,首5位是t%32的结果,t是一个32位的计时器,每隔64秒加一,接着3位是对服务器最大段大小的编码值,剩余的24位保存了4元组与t的hash值。根据服务器选定的散列加密算法计算获得
服务器总是以一个syn+ack报文段作为响应,接收到ack后根据其中的t值计算出与加密的散列值相同的结果,服务器才会为这个syn构建队列
缺陷
-
对最大段的大小进行编码,这种方法禁止使用任意大小的代码段
-
由于计数器会回绕。连接建立的过程会因为周期非常长(64s)而无法正常工作,因此该功能未作为默认设置
SCTP
特点
ctp通过四次握手的方法来建立一个sctp连接
过程
-
首先请求端发送一个INIT消息到服务端
-
服务端收到这个INIT消息后,准备好建立本次连接所需要的相关信息,并将这些信息放在一个叫“State Cookie”的数据块中
-
服务端给请求端发送一个INIT_ACK的消息,INIT_ACK中包含了这个“State Cookie”,同时服务端会把和本次链接相关的所有资源释放掉,不维护任何资源和状态
-
请求端收到INIT_ACK后会把里面的“State Cookie”信息取出来重新封装一个COOKIE_ECHO发往服务端
-
服务端收到COOKIE_ECHO消息后再次去除其中的“State Cookie”,依据“State Cookie”中存储的信息建立本次链接,并向请求端发送COOKIE_ACK消息
思考
个人感觉和SYN COOKIES差不多。服务端不维护半链接信息,而是把半链接信息发送给请求端(存放在“State Cookie”中),如果请求端确实需要建立这个链接,那么请求端需要再把半链接信息回送给服务端,这时服务端便可以根据返回的半链接信息建立连接了
减少syn-ack数据包的重发次数
避免多次重发消耗资源
增加backlog队列
通过修改应用的listen()函数调用和一个操作系统内核参数SOMAXCONN——它用于设置一个应用程序能够接收的backlog上限值。这种方法本身并不能被完全认为是抵御SYN洪泛的有效方法,即使在一些能够有效支持超大backlog队列分配的操作系统中,因为攻击者能够任意生成比其操作系统支持的backlog还大得多的数据报。
限制syn并发数
有效减少syn泛洪攻击,但是缺点很明显,不利于服务器正常连接
参考
《TCP/IP详解卷一》