syn洪流
- SYN是互联网上最原始、最经典的DDoS(Distributed Denial of Service)攻击之一。它利用了TCP协议的三次握手机制,攻击者通常利用工具或者控制僵尸主机向服务器发送海量的变源IP地址或变源端口的TCP SYN报文,服务器响应了这些报文后就会生成大量的半连接,当系统资源被耗尽后,服务器将无法提供正常的服务。
- 增加服务器性能,提供更多的连接能力对于SYN的海量报文来说杯水车薪,防御SYN的关键在于判断哪些连接请求来自于真实源,屏蔽非真实源的请求以保障正常的业务请求能得到服务。
原理
攻击者在TCP三次握手的过程中,只向服务器发送大量的SYN请求包,在收到服务器的SYN,ACK包后不做回应,而是不断地发送SYN包,这样一来,服务器收不到客户端的回应包,就会建立一个半连接SYNtime, 从而消耗服务器的大量资源并且对这些SYN请求包不断地重试,从而导致正常的连接请求被忽略 。
TCP三次握手过程
- 开始建立连接时,客户端发送SYN报文到服务器,等待服务器确认。SYN报文的源IP地址和端口是客户端的IP地址和端口。
- 服务器收到SYN报文,回应一个SYN-ACK(Synchronize-Acknowledgement)报文。SYN-ACK报文的目的P地址和端口是客户端的IP地址和端口。
- 客户端收到服务器的SYN-ACK报文,向服务器发送ACK报文,服务器收到ACK报文后完成三次握手,TCP连接建立成功。
如何产生的
- 黑客通常通过伪造的源IP地址或端口,向服务器发送大量的SYN报文,请求建立TCP连接。由于源IP地址或端口是伪造的,服务器发送的SYN-ACK报文永远不会被真实的客户端接收和回应。极少数情况下,黑客也会使用真实源IP地址,但他们只是通过攻击工具发送大量SYN报文,工具并不会响应来自服务器SYN-ACK报文。无论如何,服务器都接收不到ACK报文,产生了大量的半连接。此时服务器需要维持一张巨大的等待列表,不停地重试发送SYN-ACK报文,同时大量的资源无法释放。当服务器被这些恶意的半连接占满时,就不会再响应新的SYN报文,从而导致正常的用户无法建立TCP连接。
识别syn
- SYN的目的是为了占满服务器的连接数,消耗服务器的系统资源
防御
限制SYN 缓存队列
- 限制SYN缓存队列
- 客户端发来的SYN请求数据都会放到SYN队列中,当客户端发来ACK确认时,数据会放到Accpt队列中,大量的SYN请求会使SYN队列激增,耗尽内存,因此我们可以限制SYN队列的大小,超过门限,直接拒绝请求
缺点:
- 正常IP也会被拒绝,但保证了服务器不崩溃
首包丢弃
- 是指来自某客户端的第一次请求,服务端直接抛弃,因此不会进入;正常的客户端,如果服务端没有响应,会发送第二次请求;服务端根据ip判断是否是第两次请求,通过的 sqe序号等信息 判断是否是重传报文;是,准备建立连接,并将该ip加入白名单,下次访问直接通过。
- 如何判断是否是恶意请求?正常的客户端,如果服务端没有响应,会发送第二次请求,同时sqe序号是相同的;恶意的客户端,
- 缺点:不排除攻击者,采用反侦察策略,伪造大量ip,且每个ip发送都发二次请求,同时sqe序号是相同的情况;同时正常客户端的体验也会受影响,两次请求延长了响应时间;
防护系统隔离
- syn报文首先由DDOS防护系统 带上特定的seq(记为cookie)来响应syn_ack,并不分配储存连接的数据区(不对SYN的信息进行任何存储)。真实的客户端会返回一个ack 为cookie+1,此时在分配内存。 而伪造的客户端,将不会作出响应。这样我们就可以知道那些IP对应的客户端是真实的,将真实客户端IP加入白名单。未及时做出响应的,会作为黑用户屏蔽一段时间;
- 下次访问直接通过,而其他伪造的syn报文就被拦截。由于防护系统不需要分配储存连接的数据区,以及进入SYN-RCVD状态,因此不会被击溃;
防护系统隔离+reset认证
- 由DDOS防护系统来响应SYN,防护设备收到SYN后响应SYN+ACK,其中的ack(记为cookie)是根据某种算法计算出一个极难预测的数值。当真实客户端收到这个报文时,发现确认号不正确,将发送reset报文,并且seq 为cookie + 1。 而伪造的源,将不会有任何回应。这样我们就可以将真实的客户端IP加入白名单。第二次请求时就是正常的三次握手了;