广东住房城乡建设厅网站首页,谷歌网站收录提交,二次开发焦点吧,泰安电视台新闻综合频道SYN 攻击方式最直接的表现就会把 TCP 半连接队列打满#xff0c;这样当 TCP 半连接队列满了#xff0c;后续再在收到 SYN 报文就会丢弃#xff0c;导致客户端无法和服务端建立连接。
避免 SYN 攻击方式#xff0c;可以有以下四种方法#xff1a;
调大 netdev_max_backlo…SYN 攻击方式最直接的表现就会把 TCP 半连接队列打满这样当 TCP 半连接队列满了后续再在收到 SYN 报文就会丢弃导致客户端无法和服务端建立连接。
避免 SYN 攻击方式可以有以下四种方法
调大 netdev_max_backlog增大 TCP 半连接队列开启 tcp_syncookies减少 SYNACK 重传次数方式一调大 netdev_max_backlog
当网卡接收数据包的速度大于内核处理的速度时会有一个队列保存这些数据包。控制该队列的最大值如下参数默认值是 1000我们要适当调大该参数的值比如设置为 10000 方式二增大 TCP 半连接队列 增大 TCP 半连接队列要同时增大下面这三个参数
增大 net.ipv4.tcp_max_syn_backlog增大 listen() 函数中的 backlog增大 net.core.somaxconn
具体为什么是三个参数决定 TCP 半连接队列的大小可以看这篇可以看这篇TCP 半连接队列和全连接队列满了会发生什么又该如何应对 方式三开启 net.ipv4.tcp_syncookies 开启 syncookies 功能就可以在不使用 SYN 半连接队列的情况下成功建立连接相当于绕过了 SYN 半连接来建立连接。 具体过程 当 「 SYN 队列」满之后后续服务端收到 SYN 包不会丢弃而是根据算法计算出一个 cookie 值将 cookie 值放到第二次握手报文的「序列号」里然后服务端回第二次握手给客户端服务端接收到客户端的应答报文时服务端会检查这个 ACK 包的合法性。如果合法将该连接对象放入到「 Accept 队列」。最后应用程序通过调用 accpet() 接口从「 Accept 队列」取出的连接。可以看到当开启了 tcp_syncookies 了即使受到 SYN 攻击而导致 SYN 队列满时也能保证正常的连接成功建立。 net.ipv4.tcp_syncookies 参数主要有以下三个值 0 值表示关闭该功能1 值表示仅当 SYN 半连接队列放不下时再启用它2 值表示无条件开启功能那么在应对 SYN 攻击时只需要设置为 1 即可。 方式四减少 SYNACK 重传次数 当服务端受到 SYN 攻击时就会有大量处于 SYN_REVC 状态的 TCP 连接处于这个状态的 TCP 会重传 SYNACK 当重传超过次数达到上限后就会断开连接。
那么针对 SYN 攻击的场景我们可以减少 SYN-ACK 的重传次数以加快处于 SYN_REVC 状态的 TCP 连接断开。
SYN-ACK 报文的最大重传次数由 tcp_synack_retries内核参数决定默认值是 5 次比如将 tcp_synack_retries 减少到 2 次 为什么挥手需要四次
再来回顾下四次挥手双方发 FIN 包的过程就能理解为什么需要四次了。
关闭连接时客户端向服务端发送 FIN 时仅仅表示客户端不再发送数据了但是还能接收数据。服务端收到客户端的 FIN 报文时先回一个 ACK 应答报文而服务端可能还有数据需要处理和发送等服务端不再发送数据时才发送 FIN 报文给客户端来表示同意现在关闭连接。从上面过程可知服务端通常需要等待完成数据的发送和处理所以服务端的 ACK 和 FIN 一般都会分开发送因此是需要四次挥手。4.1 TCP 三次握手与四次挥手面试题 | 小林coding
#第二次挥手丢失了会发生什么
当服务端收到客户端的第一次挥手后就会先回一个 ACK 确认报文此时服务端的连接进入到 CLOSE_WAIT 状态。
在前面我们也提了ACK 报文是不会重传的所以如果服务端的第二次挥手丢失了客户端就会触发超时重传机制重传 FIN 报文直到收到服务端的第二次挥手或者达到最大的重传次数。
举个例子假设 tcp_orphan_retries 参数值为 2当第二次挥手一直丢失时发生的过程如下图 对于 close 函数关闭的连接由于无法再发送和接收数据所以FIN_WAIT2 状态不可以持续太久而 tcp_fin_timeout 控制了这个状态下连接的持续时长默认值是 60 秒。
但是注意如果主动关闭方使用 shutdown 函数关闭连接指定了只关闭发送方向而接收方向并没有关闭那么意味着主动关闭方还是可以接收数据的。
如果主动关闭方一直没收到第三次挥手那么主动关闭方的连接将会一直处于 FIN_WAIT2 状态tcp_fin_timeout 无法控制 shutdown 关闭的连接。如下图