如何防御 SYN Flood 攻击?
SYN Flood 是一种经典的 DDoS(分布式拒绝服务)攻击,它利用 TCP 协议“三次握手”的机制,通过发送大量伪造源 IP 的 SYN 包,耗尽服务器的半连接队列资源,导致正常用户无法建立连接。
防御 SYN Flood 攻击通常需要从操作系统内核优化、网络设备/防火墙以及云端清洗三个层面入手。
以下是详细的防御策略:
1. 操作系统内核参数优化 (Linux 为例)
这是成本最低的第一道防线,通过调整内核参数来增强服务器承受半连接的能力。
你需要编辑 /etc/sysctl.conf 文件,添加或修改以下参数,然后执行 sysctl -p 生效:
启用 SYN Cookies (核心防御手段)
bashnet.ipv4.tcp_syncookies = 1原理:当半连接队列满时,服务器不再分配内存存储连接状态,而是根据源 IP、端口等信息计算出一个 Cookie 值作为序列号发回给客户端。只有客户端发回正确的 ACK 包(包含该 Cookie),服务器才分配资源。这能有效绕过半连接队列耗尽的问题。
增加半连接队列长度
bashnet.ipv4.tcp_max_syn_backlog = 262144原理:默认的队列长度可能只有 1024 或 2048,攻击者很容易填满。将其调大(如 26万+),可以容纳更多的恶意请求,给正常请求留出空间。
减少 SYN-ACK 重试次数
bashnet.ipv4.tcp_synack_retries = 1原理:默认情况下,服务器收到 SYN 后会发送 SYN-ACK 并等待回应。如果没收到,会重试 5 次(约 3 分钟)。攻击者肯定不会回应,所以服务器会长时间挂起这些连接。将重试次数改为 1 次或 0 次,可以快速释放无效连接占用的资源。
加快 TIME_WAIT 回收 (辅助)
bashnet.ipv4.tcp_tw_recycle = 1 # 注意:NAT环境下慎用 net.ipv4.tcp_tw_reuse = 1
2. 网络层防御技术 (防火墙/硬件设备)
如果攻击流量较大,单纯靠服务器 CPU 处理会非常吃力,需要在服务器之前的网络设备上进行拦截。
启用 SYN Proxy (SYN 代理)
- 原理:在防火墙或负载均衡器上开启此功能。设备代替服务器与发送方进行三次握手。
- 流程:防火墙收到 SYN -> 防火墙回复 SYN-ACK -> 只有收到客户端的 ACK 后,防火墙才向后端真实服务器发起连接。
- 效果:彻底隔离了伪造 IP 的 SYN 包,后端服务器只处理合法的 TCP 连接。
速率限制 (Rate Limiting)
- 限制单个 IP 地址在单位时间内的 SYN 包发送速率。
- 缺点:如果攻击者使用庞大的僵尸网络(真实 IP),每个 IP 发包很慢但总数很大,这种方法效果有限;且容易误伤 NAT 环境下的正常用户(如整个网吧出口 IP 相同)。
首包丢弃 (First Packet Drop)
- 原理:防火墙丢弃任何来源 IP 的第一个 SYN 包。正常的 TCP 协议栈会重传 SYN 包,而很多简单的攻击工具不会重传。
- 缺点:会增加正常用户的连接延迟。
3. 基础设施与云端防御 (应对大规模攻击)
当 SYN Flood 的流量巨大(如几十 Gbps 甚至 Tbps),填满了你的网络带宽时,上述本地防御都会失效(因为链路已经堵死了)。此时必须依赖云服务。
使用 CDN (内容分发网络)
- 如 Cloudflare、阿里云 CDN 等。
- CDN 节点作为反向代理,会终结 TCP 连接。攻击流量打在 CDN 庞大的边缘节点上,只有合法的 HTTP 请求才会回源到你的服务器。
高防 IP / 流量清洗服务
- 将 DNS 解析指向高防 IP,或者通过 BGP 引流。
- 流量会先经过专业的清洗中心,清洗中心利用特征识别、指纹匹配等算法过滤掉攻击流量,将干净的流量转发回源站。
Anycast 技术
- 利用 Anycast 将同一个 IP 广播到全球多个地理位置。攻击流量会被分散到离攻击源最近的节点,从而稀释攻击强度,避免单点被打垮。
4. 基础网络安全配置
- 反向路径过滤 (uRPF)
- 在路由器端配置 Unicast Reverse Path Forwarding。
- 如果路由器接收到一个包,但路由表显示回包路径不是该接口,则丢弃。这能有效过滤掉大部分伪造源 IP 的攻击。
总结
- 小规模攻击:开启 Linux 内核的
tcp_syncookies,减小tcp_synack_retries。 - 中规模攻击:使用防火墙(iptables/硬件防火墙)开启 SYN Proxy。
- 大规模攻击(带宽打满):必须上 CDN 或购买专业的 DDoS 高防服务。