### 讲讲 SYN FLOOD 原理，防御，检测手段

SYN Flood 攻击原理

SYN Flood 是一种利用 TCP 三次握手过程中的漏洞发起的攻击

正常的三次握手流程：

1. SYN：客户端向服务器发送一个 `SYN` 包，请求建立连接
2. SYN-ACK：服务器收到 `SYN` 包后，分配资源，并回复一个 `SYN-ACK` 包
3. ACK：客户端收到 `SYN-ACK` 后，回复一个 `ACK` 包，三次握手完成，连接建立

SYN Flood 攻击原理： 攻击者利用这个过程，向服务器发送大量的 `SYN` 包。但与正常连接不同的是，攻击者不会回复第三步的 `ACK` 包

1. 大量 SYN 包：攻击者利用伪造的源 IP 地址（以隐藏自己的真实身份），向目标服务器发送海量的 `SYN` 包
2. 服务器资源耗尽：服务器收到每个 `SYN` 包后，都会为它在半开连接队列（Half-Open Connection Queue）中分配一个连接状态，并发送一个 `SYN-ACK` 包
3. 无响应：由于攻击者使用的是伪造的 IP 地址，服务器发送的 `SYN-ACK` 包永远不会被响应
4. 队列饱和：随着半开连接队列被大量伪造连接迅速填满，服务器无法再处理新的合法连接请求。最终，新的正常用户无法连接，导致服务不可用，即达到了拒绝服务攻击的目的

这种攻击的危害在于，攻击者利用极小的代价，就可以耗尽服务器大量的内存和 CPU 资源

SYN Flood 防御手段

防御 SYN Flood 攻击主要从两个方向入手：增加服务器处理能力和优化连接处理机制

1. 调整 TCP/IP 参数

这是最简单直接的防御措施，可以通过修改 Linux 内核参数来增加半开连接队列的容量和缩短超时时间

- `net.ipv4.tcp_max_syn_backlog`: 增加这个参数的值，可以增大半开连接队列的容量
- `net.ipv4.tcp_synack_retries`: 减少服务器发送 `SYN-ACK` 重试的次数，从而缩短半开连接的超时时间，更快地释放资源

2. SYN Cookie

这是一种非常有效的防御机制，它改变了服务器处理 `SYN` 包的方式，使其在受到攻击时表现得更加健壮

工作原理：

1. 不分配资源：服务器收到 `SYN` 包后，不会立即为它分配资源
2. 生成 Cookie：服务器将客户端的 IP、端口、MSS 等信息，加上一个服务器独有的密钥，通过哈希算法生成一个 `SYN Cookie`
3. 发送 SYN-ACK：服务器把这个 `SYN Cookie` 作为 TCP 序列号，发送 `SYN-ACK` 包
4. 客户端回复：如果客户端是合法的，它会回复一个 `ACK` 包，该包中的序列号正是 `SYN Cookie` 加 1 的值
5. 验证 Cookie：服务器收到 `ACK` 包后，不检查半开连接队列，而是根据其中的序列号，反向计算并验证 `SYN Cookie`。如果验证成功，才分配资源并建立连接

这种机制的优点是，在完成三次握手前，服务器不会为连接分配任何资源，从而大大降低了被 SYN Flood 攻击的风险。

3. 硬件和软件防火墙

现代防火墙和入侵检测系统（IDS）通常内置了 SYN Flood 检测和防御功能

- 速率限制：对来自同一 IP 或同一网段的 `SYN` 请求进行速率限制
- 白名单/黑名单：通过规则限制可疑 IP 的访问
- 使用负载均衡器：将请求分发到多台服务器，可以分散攻击流量

SYN Flood 检测手段

及时发现 SYN Flood 攻击是防御的第一步。

1. 系统网络状态监控

使用 `netstat` 或 `ss` 命令是监控 TCP 连接状态最常用的方法

    # 查看所有 TCP 连接
    netstat -nt | grep tcp
    # 使用 ss 查看 SYN_RECV 状态的连接
    ss -s

- 在正常情况下，`SYN_RECV` 状态的连接数量应该很小。如果这个数字突然暴增，就可能正在遭受 SYN Flood 攻击

2. 网络流量分析

使用网络抓包工具（如 `tcpdump`）可以对流量进行深入分析

    # 只抓取 SYN 包
    tcpdump -n 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0'

- 分析结果：如果抓到的流量中，大部分都是带有伪造源 IP 的 `SYN` 包，且没有后续的 `ACK` 包，那么基本可以断定是 SYN Flood 攻击

3. IDS/IPS 日志

如果系统中部署了入侵检测系统（IDS）或入侵防御系统（IPS），它们会记录可疑的网络流量。通过查看 Snort、Suricata 等工具的日志，可以快速发现大量来自同一源 IP 或不同源 IP 的 `SYN` 攻击事件