浅谈TCP半连接攻击与全连接攻击

全连接攻击:

所谓的全连接攻击说的就是客户端仅仅“连接”到服务器,然后再也不发送任何数据,直到服务器超时后处理或者耗尽服务器的处理进程。

为何不发送任何数据呢?因为一旦发送了数据,服务器检测到数据不合法后就可能断开此次连接,如果不发送数据的话,很多服务器只能阻塞在recv或者read调用上。

很多的服务器架构都是每连接一个进程的方式,这种服务器更容易受到全连接攻击,即使是进程池/线程池的方式也不例外,症状就是服务器主机建立了大量的客户端处理进程,然后阻塞在recv/read而无所事事,大量的这种连接会耗尽服务器主机的处理进程。

如果处理进程数量达到了主机允许的最大值,那么就会影响到该主机的正常运作,比如你再也无法ssh到该主机上了。

半连接攻击

半连接攻击是一种针对协议栈的攻击,或者说是一中针对主机的攻击,皮之不存毛将焉附,主机一旦被攻击而耗尽了内存资源,用户态的应用程序也将无法运行。

半连接攻击是一种攻击协议栈的攻击方式,坦白说就是攻击主机的一种攻击方式。通过将主机的资源消耗殆尽,从而导致应用层的程序无资源可用,导致无法运行。

在正常情况下,客户端连接服务端需要通过三次握手,首先客户端构造一个SYN连接数据包发送至服务端,自身进入SYN_SEND状态,当服务端收到客户端的SYN包之后,为其分配内存核心内存,并将其放置在半连接队列中,服务端接收客户SYN包并会向客户端发送一个SYN包和ACK包,此刻服务端进入SYN_RECV态。客户端收到包之后,再次向服务端发送ACK确认包。至此连接建立完成,双方都进入ESTABLSHEDZ状态。半连接就是通过不断地构造客户端的SYN连接数据包发向服务端,等到服务端的半连接队列满的时候,后续的正常用户的连接请求将会被丢弃,从而无法连接到服务端。此为半连接攻击方式。根据服务端的半连接队列的大小,不同主机的抵抗这种SYN攻击的能力也是不一样。

半连接攻击与全连接攻击区别

半连接攻击耗尽的是全局的内存,因此可以用不为半连接分配内存的方式加以预防–syn cookie。

而全连接攻击耗尽的是主机的处理进程和连接数量,因此可以限制处理进程的创建或者限制预创建的进程池进程的分配。

解决全连接攻击

可以通过不为全连接分配进程处理的方式来防范全连接攻击,具体的情况是当收到数据之后,在为其分配一个处理线程。具体的处理方式在accept返回之前是不分配处理线程的。直到接收相关的数据之后才为之提供一个处理过程。例如在apache服务中,是通过预创建一定量的子进程作为处理连接继承。所有的自己进程都继承父进程的sockfd,每当有一个连接过来时,只有当accept返回是,才会为该链接分配一个进程来处理连接请求。负责,子进程一直处于等待状态。如果出现值是连接存在,而始终不放数据,该链接的状态是SYN_RECV,在协议栈中,提供一个保活期给该链接,如果超过保活期还没有数据到来,服务端协议栈将会断开该链接。如果没有该保活期,虽然避免了ESTABLESHED状态的数量,但是SYN_RECV的数据量的增长仍旧是不可估算的,所以需要利用保活期来监控该链接是需要清除断开。

解决半连接攻击

可以通过拓展半连接队列的大小,来进行补救,但缺点是,不能无限制的增加,这样会耗费过多的服务端资源,导致服务端性能地下。这种方式几乎不可取。现主要通syn cookie或者syn中继机制来防范半连接攻,部位半连接分配核心内存的方式来防范

这一切是通过TCP_DEFER_ACCEPT这个套接字参数来实现的,它的接口形式如下:
setsockopt(listen_socket, SOL_TCP, TCP_DEFER_ACCEPT, &val, sizeof(val))
其中val是一个数字,它代表一个时间,字面上理解,在这个时间过去后仍没有数据到来的话就会在不指派服务进程(accept不返回)的情况下断开连接,可是这只是一个方面,协议栈的实现中还有另外一个方面,那就是服务器协议栈会试图重传自己的synack好几次,因此这个限制时间是受到tcp协议栈的synack的重传次数和defer_accept的值共同决定的。

————————————————
参考文章链接:https://blog.csdn.net/dog250/article/details/5955094

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值