防范SYN洪水攻击的关键是合理配置半连接队列(tcp_max_syn_backlog)、全连接队列(somaxconn)、缩短半连接存活时间(tcp_synack_retries)并启用SYN Cookies(tcp_syncookies),缺一不可。

要防范 SYN 洪水攻击,关键不是“堵死连接”,而是让系统在高伪造流量下仍能维持合法连接通路。核心在于控制两个队列的容量与生命周期:半连接队列(SYN Queue) 和 全连接队列(Accept Queue)。配置不当,哪怕开了 tcp_syncookies 也起不到作用。
合理设置半连接队列长度
这是抵御 SYN Flood 的第一道缓冲区。默认值(常为 1024 或更低)极易被填满,导致内核静默丢弃新 SYN 包——此时 tcp_syncookies 还没机会触发。
- 查看当前值:
sysctl net.ipv4.tcp_max_syn_backlog
- 建议设为 4096~8192(中等并发),或 32768~65535(高负载、有足够内存);
- 修改命令(临时):
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
- 永久生效:在
/etc/sysctl.conf中添加:net.ipv4.tcp_max_syn_backlog = 8192
注意:盲目设为 65535 可能增加内存开销,且若应用层未同步适配,实际效果受限。
同步调大全连接队列上限
半连接建好后,需进入全连接队列等待 accept()。若该队列太小(默认常为 128),即使三次握手完成,也会因队列溢出被丢弃,表现为 ListenOverflows 计数上升。
- 查看当前值:
sysctl net.core.somaxconn
- 建议设为 8192 或更高,且必须 ≥ 应用监听时指定的
backlog值(如 Nginx 的listen 80 backlog=8192,Java 的ServerSocket(port, 8192)); - 修改命令(临时):
sysctl -w net.core.somaxconn=8192
- 永久生效:在
/etc/sysctl.conf中添加:net.core.somaxconn = 8192
缩短半连接存活时间,加速释放无效条目
每个伪造 SYN 在队列中停留越久,越容易卡住资源。默认重试 5 次(总等待超 60 秒),攻击者几百个 IP 就能打满队列。
- 推荐设为 2 或 3(平衡兼容性与响应速度):
sysctl -w net.ipv4.tcp_synack_retries=2
- 若确认环境稳定(无 NAT、无弱网客户端),可设为 0(实测半连接存活时间压至 3 秒内),但必须配合
tcp_syncookies=1; - 永久配置示例:
net.ipv4.tcp_synack_retries = 2
必须启用 SYN Cookies 作为保底机制
它不是前置拦截器,而是在队列真正溢出时的无状态兜底方案:不占内存、不存状态,靠加密编码把客户端信息藏进序列号里,收到合法 ACK 再验证建连。
- 开启命令(临时):
sysctl -w net.ipv4.tcp_syncookies=1
- 永久配置:
net.ipv4.tcp_syncookies = 1
- 注意:启用后部分 TCP 扩展(如 SACK)可能受限,但对 HTTP/API 等主流服务基本无感,建议默认开启。
配置完别忘了执行:
sysctl -p
验证是否生效,并用 ss -s | grep synrecv 或 netstat -s | grep -i "listen.*overflow" 观察实际队列压力。


















