持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
半连接队列
服务器第一次收到客户端的SYN之后,就会处于SYN_RCVD(同步已接收)状态,此时双方还没有完全建立连接,服务器会把此种状态下请求连接放在一队列里,我们把这种队列称为半连接队列。
SYN FLood 攻击
客户大量伪造 IP 发送 SYN 包,服务端回复的 ACK+SYN 去到了一个 【未知】的地址,势必造成服务端大量的链接处于 SYN_RCVD 状态,而服务端的半链接队列大小也是有限的,如果半链接队列满了,就会导致出现无法处理正常请求的情况。
这种利用TCP建立连接时3次握手的“漏洞”,通过原始套接字发送源地址虚假的SYN报文,使目标主机永远无法完成3次握手,占满了系统的协议栈队列,资源得不到释放,进而拒绝服务,是互联网中最主要的DDOS攻击形式之一。
如下图所示:
抵御 SYN Flood 攻击
- 增大半连接队列
不能只增大tcp_max_syn_backlog,还需要一同增大somaconn和backlog,也就是增大全连接队列
- 开启tcp_syncookies功能
开启tcp_syncookies就可以在不使用syn半连接队列的情况下建立连接
syncookies在接收到客户端的syn报文时,计算出一个值,放到syn+ack报文中发出。当客户端返回ack报文时,取出该值验证,成功则建立连接,如下图:
- 减少ack+syn报文的重传次数
因为我们在收到syn攻击时,服务端会重传syn+ack报文到最大次数,才会断开连接。针对syn攻击的场景,我们可以减少ack+syn报文的重传次数,使处于syn_recv状态的它们更快断开连接
修改重传次数:/proc/sys/net/ipv4/tcp_synack_retries