SYN和RST 学习

来源:互联网 发布:12315可以投诉淘宝小二 编辑:程序博客网 时间:2024/05/29 10:28

1. SYN 攻击原理和解决办法

三次握手的第二次,服务器端接收到了SYN信号之后就进入了SYN_RECV状态,然后发送SYN和ACK信号给客户端,等待客户端发送ACK信号进入ESTABLISHED状态,但是如果一直都等不到ACK信号,并且还有很多很多的这样的连接请求,这个时候,我们大致可以判断是发生了SYN攻击了。

当然咯,可以通过 netstat 来查看下,So easy !!!

好,既然发现了,那么如何解决呢?
先从最简单的说起:    
1 , 防火墙设置超时的限制,当服务器多长时间没有收到ACK,那么防火墙就发送RST到服务器端强制关闭这个连接,问题是这个时间不太好确认,但也总是一种解决办法。
2, SYN网关收到了服务器发送的ACK信号后,马上就回复给服务器一个ACK。 同时以服务器的身份转发这SYN_ACK信号给客户端,这样假设已经连接成功。如果这个时候客户端有发送数据,那么SYN网关就转发,不然就丢弃。
3,  加个SYN代理网关,他的作用是做一个假设的三次握手,只有当他和客户端能正常连接之后,那么才去和服务器端连接,这样就过滤了非正常连接的请求。、

2.RST 报文

前面说到了解决SYN攻击,可以由防火墙来发送RST报文给服务器到某个超时时间后断开连接,那么这个RST报文是啥东西呢?
RST:(Reset the connection)用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求。如果接收到RST位时候,通常发生了某些错误。
简单的说: RST报文就是强制关闭连接的报文,当发送RST报文关闭连接的时候,不必等待缓冲区的数据都发送出去,而是直接丢弃缓冲区的数据发送RST包,而接收到RST报文之后,也不用回复ACK信号进行关闭确认。

那么什么情况下会发送RST报文呢?

1.到不存在的端口的连接请求

产生复位的一种常见情况是当连接请求到达时,目的端口没有进程正在监听。对于UDP,当一个数据报到达目的端口时,该端口没在使用,它将产生一个ICMP端口不可达的信息;而对于TCP呢,服务器就会发送一个RST给客户端,告诉你小子连错了,必须关闭了重连。

2.请求超时

客户端发起请求连接的时候,就设置了一个值,如果这个范围内没有给我回复,那我就不连了。 这个时候就是发送RST给服务器,告诉你我不想连了。

3.检测半关闭连接

对一个已经收到FIN包的socket调用read方法, 如果接收缓冲已空, 则返回0, 这就是常说的表示连接关闭. 但第一次对其调用write方法时, 如果发送缓冲没问题, 会返回正确写入(发送). 但发送的报文会导致对端发送RST报文, 因为对端的socket已经调用了close, 完全关闭, 既不发送, 也不接收数据. 所以, 第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号, 导致进程退出.


**** 另外确认一点哈,这个RST报文是对方发送过来,我接收到了然后进行处理的。

解决办法:

  1. 目的pc的端口没有在监听,请确定服务是否打开,或者client的连服务器的端口是否正确

  2. 客户端请求非法,导致服务器出现异常,服务器主动断开。

  3. 服务器重启了,重新监听端口。而客户端还是用旧的tcp链接发送报文,服务器端也会发送rst链接复位报文,因为原有的链接已经没了。






0 0
原创粉丝点击