DoS的相关概念
DoS: 也就是我们所说到的拒绝服务,一切能够引起DoS行为的攻击都被称为DoS攻击,该攻击的效果是使得计算机或者网络无法提供正常的服务。
DoS攻击: 指的是造成DoS的攻击行为,目的是使攻击目标计算机无法提供正常的服务,最常见的DoS攻击有计算机网络带宽攻击和连通性攻击,其中带宽攻击是指以极大通信量冲击通往目标计算机的网络,使得所有可用的网络资源都被消耗殆尽,导致合法的用户请求无法通过,无法正常到达目标计算机;而连通性攻击则是指用大量的连接请求攻击目标计算机,使得所有可用的操作系统资源都被消耗殆尽,导致目标计算机无法处理合法用户的请求。
DoS攻击的攻击原理(SYN泛洪攻击)
SYN泛洪攻击是利用TCP协议的缺陷进行的DoS攻击,因为攻击者必须向被攻击的服务器发送大量的虚假的IP请求(一个虚假的IP报文,这里建议大家自己组包),被攻击者在收到请求后返回确认信息,等待攻击者进行确认,这里也就是我们所说到的TCP的三次握手的基本知识,这个过程需要TCP的三次握手。由于攻击者发送的请求信息是虚假的,所以服务器接收不到返回的确认信息,在一段时间内服务器会处于等待状态,而分配给这次请求的资源却没有被释放,当攻击者等待一定时间后,会因为连接超时而断开,这时攻击者会再次发送新的虚假信息(随机产生IP地址),直至最终服务器资源被耗尽,直到瘫痪。
涉及到的TCP三次握手:首先时请求服务方发送一个SYN消息,服务方收到SYN后,会向请求方回送一个SYN-ACK表示确认,当请求方收到SYN-ACK后,再次向服务方发送一个CK消息,这样一次TCP才算正式简历成功。
SYNFlooding(泛洪攻击):则是专门针对TCP协议栈在两台主机间初始化连接握手的过程中进行的DoS攻击,其旨在实现三次握手的前两个步骤,当服务方收到请求方的SYN消息后,由于请求方采用源地址欺骗等手段使得服务方发出的SYN-ACK得不到确认消息,于是服务方会在一定时间处于等待接受请求方的ACK的确认消息。对于服务器来说,可用的TCP连接是有限的,因为他们只有又显得内存缓存区用于创建连接,如果这一缓冲区充满了虚假连接消息的初始信息,该服务器就会对接下来的连接停止响应,直至缓冲区里的连接企图超时。(这也就涉及到了网络编程中socket编程的listen的设计原理,也就是未完成三次握手的队列,及完成三次握手可以使用accept的队列)
解决DoS中SYN泛洪攻击的方式
对于SYN未完成连接队列已满,难道真的只能够丢弃链接吗?并不是这样的。
SYN泛洪防御:
- 缩短SYN timeout时间,即从服务器收到一个SYN报文到确认这个SYN报文无效这个过程所花费的时间。
- 设置syncookies,服务器根据当前状态计算出一个值,放在己方发出的SYN+ACK报文中发出,当客户端返回ACK报文时,取出该值验证,如果合法,就认为连接简历成功。
这里我采用的是开启syncookies功能来防御SYN泛洪攻击。
Linux下怎样开启syncookies功能呢?
修改tcp_syncookied参数即可,其中值为0时表示关闭该功能,2表示无条件开启功能,而1则表示仅当SYN半连接队列放不下时,再启用它。
这也是由于syncookie仅用于应对SYN泛洪攻击,这种方式建立的连接,许多TCP特性都无法使用,所以应当把tcp_syncookied设置位1,仅在队列满时再启用。
net.ipv4.tcp_syncookies = 1
对于DoS的syn泛洪攻击防御是不是感觉就如此的简单?,收藏起来偷偷学习