欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SYN泛洪攻击

程序员文章站 2024-02-24 11:37:28
...

今天我们来讨论一个问题: 就是SYN泛洪攻击。

泛洪攻击出现在三次握手阶段, 这是TCP协议本身存在的缺点。

一、泛洪攻击原理:

攻击方以伪造的IP地址向服务器发送大量SYN请求(对应接口是connect),
我们知道这是三次握手的第一个报文, 服务器收到SYN请求之后, 会返回SYN+ACK的报文(表明自己已经接受到你的连接请求, 并且我也想和你建立连接)。

正常的客户端连接是会返回ACK报文的。 但这个攻击方不会返回ACK。

攻击方负责大量地发送SYN请求,但不响应服务器端地回应。

最终会导致服务器处理这些请求导致无法处理其他正常的业务, 甚至堆栈溢出程序崩溃!

二、那么这到底是为什么呢?

说这个我们要说说TCP中listen接口backlog参数了。
在内核维护了两个队列, 一个是半连接队列,另一个是全连接队列

半连接: 服务器端处于SYN_RECV的状态(服务器返回SYN+ACK报文的状态) , 它只差收到客户端的ACK报文就会进入全连接队列中。
全连接: 也就是已完成三次握手的队列, 存的是已完成三次握手的请求。(一般他是会让accept接受并创建返回用户通信socketfd)

对于泛洪攻击, 由于它是疯狂发送SYN请求但不相应。 因此它会导致半连接队列饱满。 导致无法处于正常的用户请求。

虽然说在半连接队列中, 如果在SYN TIMEOUT(计时器)结束时,还没有收到客户端返回ACK报文, 他会丢弃这个请求, 缓解一下压力。 但是这个时间是比较缓慢的。完全跟不上攻击者发送的SYN请求。

(这就好像病毒进入我们人体, 由于体内没有抗体, 人体造抗体的速度比不上病毒繁殖的速度, 最终导致人体死亡。)

三、如何解决泛洪攻击呢?

1、缩小服务器SYN TIMIE_OUT 计时器的时间。 (处理变快一些)

2、防火墙:

	1> SYN网关:  网关就相当于双方的中介。 
		防火墙收到客户端发送SYN请求连接报文, 然后把这个报文发送给服务器,
	    服务器返回SYN + ACK报文给SYN网关, 这个时候网关会把SYN+ACK返回给客户端。
	    并且自己已客户端的身份向服务器发送ACK报文, 让服务器由半连接进入全连接队列。
	    当客户端真正返回ACK报文,有数据则发送给服务器, 没有则丢弃。 
	    这样做主要是因为服务器承受的全连接比半连接高得多。有效减轻对服务器的攻击。
		
	2> 被动式网关: 
		他主要区别是在于设置SYN的请求超时时间, 这个时间是比服务器的SYN TIMIEOUT短得多。
	    客户端和服务器端之间的三次握手通过网关正常转发, 如果说是客户端在网关的请求时间还
	    没有返回最终的ACK确认报时, 防火墙会给服务器发送RST报文,使服务器丢弃连接。 
	    由于网关的计时时间是比服务器的计时时间短的, 可以有效地防止SYN FLOOD攻击。

	3> SYN中继:
		SYN网关收到客户端地SYN请求时, 自己会返回SYN+ACK的报文给客户端,不会通知服务器端, 
		如果说客户端返回ACK, 代表正常连接,这个时候SYN网关会向服务器建立三次握手。 
		这样防火墙作为代理完成了三次连接。 可以完全过滤掉SYN攻击。
相关标签: tcpip