当面试官问这个问题的时候,不要被 "SYN 泛洪" 这个名词给震慑到,其实面试官就是想知道计算机网络中关于 DDoS 攻击和 TCP 建立连接三次握手的相关知识的考核。不要担心,接下来将详细介绍一下 SYN 泛洪及其相关知识。
什么是 SYN 泛洪?
攻击者向目标服务器发送大量的伪造源 IP 的 SYN 报文,服务端每收到一次 SYN 请求就会为其分配资源,内核会把这个连接放到半连接队列里,并向客户端返回 SYN + ACK,如果客户端返回 ACK,就把其对应的连接放到全连接队列里。但是由于这些伪造的客户端不会返回 ACK,因此这些连接会一直待在半连接队列里。服务器为了维护这些连接会耗尽自身内存,然后拒绝为后续的连接请求服务。

解决方案
增强网络基础措施
提升网络带宽、增加服务器的处理能力和承载能力,通过增强基础设施的能力来抵御攻击
SYN Cookie
使用 SYN Cookie 的目的就是绕过半连接队列的情况下建立连接。服务端收到 SYN 报文后,不分配半连接资源,而是通过源 IP、目的 IP、端口、时间戳等信息,经加密算法生成一个 "SYN Cookie" 放到第二次握手 SYN+ACK 的序列号中。客户端收到带 Cookie 的 SYN + ACK 并回复 ACK 时,服务端验证序列号的合法性,若合法则直接建立连接。
半连接队列优化
增大内核参数 somaxconn (最大监听队列长度),提升服务端处理并发连接的能力。减少 tcp_synack_retries(SYN+ACK 报文的重传次数,默认 5 次,可降低至 2-3 次),缩短半连接的超时时间,加快资源释放。调大 netdev_max_backlog这个队列用于接收网络处理不过来的数据包,但个人感觉调大了用处不大,攻击者伪造的 SYN 请求也能更大
拓展:什么是 DDoS 攻击?
SYN 泛洪攻击只是 DDoS 攻击的一种,DDoS,即分布式拒绝服务。顾名思义,DDoS 攻击的目的就是通过某种手段让正常的请求无法获得其服务。
是通过什么手段呢?攻击者通过控制海量僵尸主机组成的僵尸网络,从多个分布式节点同时向目标(服务器 / 网络 / 应用)发起恶意流量或请求,耗尽其带宽、CPU、内存、连接数等核心资源,使目标无法处理合法用户请求,最终导致服务中断或瘫痪。
常见的攻击类型:
- 网络层攻击,如 UDP 反射攻击
- 传输层攻击,如 SYN 泛洪
- 会话层攻击,如 SSL 连接攻击
- 应用层攻击,如 DNS 泛洪,HTTP 泛洪