讲讲 SYN FLOOD 原理,防御,检测手段
SYN Flood 攻击原理
SYN Flood 是一种利用 TCP 三次握手过程中的漏洞发起的攻击
正常的三次握手流程:
- SYN:客户端向服务器发送一个
SYN
包,请求建立连接 - SYN-ACK:服务器收到
SYN
包后,分配资源,并回复一个SYN-ACK
包 - ACK:客户端收到
SYN-ACK
后,回复一个ACK
包,三次握手完成,连接建立
SYN Flood 攻击原理: 攻击者利用这个过程,向服务器发送大量的 SYN
包。但与正常连接不同的是,攻击者不会回复第三步的 ACK
包
- 大量 SYN 包:攻击者利用伪造的源 IP 地址(以隐藏自己的真实身份),向目标服务器发送海量的
SYN
包 - 服务器资源耗尽:服务器收到每个
SYN
包后,都会为它在半开连接队列(Half-Open Connection Queue)中分配一个连接状态,并发送一个SYN-ACK
包 - 无响应:由于攻击者使用的是伪造的 IP 地址,服务器发送的
SYN-ACK
包永远不会被响应 - 队列饱和:随着半开连接队列被大量伪造连接迅速填满,服务器无法再处理新的合法连接请求。最终,新的正常用户无法连接,导致服务不可用,即达到了拒绝服务攻击的目的
这种攻击的危害在于,攻击者利用极小的代价,就可以耗尽服务器大量的内存和 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
包的方式,使其在受到攻击时表现得更加健壮
工作原理:
- 不分配资源:服务器收到
SYN
包后,不会立即为它分配资源 - 生成 Cookie:服务器将客户端的 IP、端口、MSS 等信息,加上一个服务器独有的密钥,通过哈希算法生成一个
SYN Cookie
- 发送 SYN-ACK:服务器把这个
SYN Cookie
作为 TCP 序列号,发送SYN-ACK
包 - 客户端回复:如果客户端是合法的,它会回复一个
ACK
包,该包中的序列号正是SYN Cookie
加 1 的值 - 验证 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
攻击事件