洪水攻击又称洪泛攻击,是DoS攻击或者DDoS攻击常用的手段。但是针对不同的阶段的洪水攻击,我们处理方法也不同。当然,这里只谈防止的方法,不做具体细节的配置讲解。
针对TCP的洪水攻击
TCP三次握手规则
下面我把三次握手的详细情况介绍一下:
- 刚开始,主机1和主机2都是关闭状态。
- 主机1主动打开连接,主机2被动打开连接。
- 主机2创建一个TCB传输控制块,这个控制块存储关于连接的信息,比如TCP的连接表,发送与接收缓存的指针,重传队列的指针,发送号与接收号等等。TCB创建结束后,开启监听状态。
- 主机1创建TCB,进行连接申请。向B发送请求报文:该报文首部的同步位
SYN=1
,随机序列号seq=x
。注意:TCP规定此时的报文不能携带数据,但是必须占用一个序列号。主机1进入SYN SENT状态。 - 主机2收到请求,向主机1发送确认连接。此时的确认报文中,
SYN=1,ACK=1,ack=x+1
并随机序列号seq=y
,发送给主机1。同样需要消耗一个序列号,且不能携带数据。主机2进入SYN REVD状态。 - 主机1收到确认消息后,将状态改为ESTABLISHED,再次向主机2发送报文。
ACK=1, seq=x+1, ack=y+1
。TCP规定,此时的报文可以携带数据,也可以不携带数据。如果不携带数据,则不需要序列号,那么下一次序列号仍然为seq=x+1
,本次仍是seq=x
。 - 主机2收到连接确认,进入ESTABLISHED状态。
其中有一个细节,ACK与ack的关系:
- ACK:报文单独标识,ACK=1时才做有效报文,ACK=0时报文无效。
- ack:确认号,是收到的seq+1,意思是我需要收到的下一个报文的序号是seq+1。
三次握手的缺陷
现在我们假设利用洪水攻击,那么攻击者必然会利用多ip地址。这些地址可能是真实的,也可能是伪造的。如果是真实的,我们很难通过手段拒绝这些连接,因为我们无法拒绝一个真实的ip向我们发起服务。但是假如这些ip是假的,那么带入到TCP三次握手会发生什么呢?
假设有10000个伪造的ip地址向服务器发起连接请求,服务器收到了,会向这些请求回复收到请求。但是,这些ip地址是假的,因此服务器的回复根本不起作用,因为找不到对应的ip地址。但是由于TCP啰嗦的可靠性保证,我们需要多次请求连接,这样的话无形之中就会造成资源浪费,洪水攻击就达成了。
怎么对抗针对TCP三次握手的洪水攻击
其实防治方法有很多,我们可以从几个角度来分类这些手段。
建墙
我们让一个单独的服务器处理TCP的连接,只有真正建立起三次握手的申请才会被转移到真正提供服务的服务器上。
监控
由于伪造ip是无法通过三次握手的,因此它们的连接都是半连接。我们可以把半连接的请求放在一个队列中,当队列满了,就会按照先进先出的原则判断队列中的请求是否已经是全连接的,如果是,则踢出队列;如果仍然是半连接状态,我们可以将其视为恶意ip,释放这些连接,并踢出队列。
黑名单
这个方法可能不太奏效,因为ip是伪造的,所以即使封禁这些ip地址可能起到的作用不是很大。但是也算是一种解决方法。
超时释放
每一个连接超过一定的时长,不管是因为任何原因都会直接放弃对其的连接。
设置重复回应次数
比如我要维持可靠连接,就要不断发送确认请求的报文。这时候可以设置重复确认的次数,超过这个次数则释放连接。
针对应用的洪水攻击
此类攻击针对应用,用大量的访问造成应用或者服务器崩溃。这个没啥好说的,就是请求无效访问而已。应对方法也相对简单:
- 建立队列,控制访问流量,超出的流量禁止访问。好处是服务不会崩溃,坏处是可能阻挡大量正常访问。
- 接口统计数据,一段时间内多次访问算作恶意访问。比如一秒内发起了10次访问,明显不是正常手速点出来的,封禁ip。
- 三秒防刷。在三秒钟内,每一个ip只能访问一次。好处是对每个ip平等对待,坏处是当大量ip访问导致服务器不能正常运行,正常ip再次访问会被限制。
——————————————————————
还有其他的一些红帆攻击,但是呢因为我不是专业学安全的,对这些也不了解,所以在这里就不提了。