Linux防范SYN洪水攻击需协同配置tcp_max_syn_backlog、somaxconn、tcp_synack_retries并强制启用tcp_syncookies:前者设为8192~32768,后者同步匹配或略高,重试次数调至2,且必须开启syncookies兜底。

Linux 中防范 SYN 洪水攻击,关键不是“堵死 SYN”,而是让系统在高并发伪造请求下不崩溃,并优先保障真实连接。队列大小配置是基础环节,但必须和内核防护机制协同生效——单独调大队列,不开启 SYN Cookies,仍会因内存耗尽而失效。
调整半连接队列上限(tcp_max_syn_backlog)
该参数控制内核为未完成三次握手的连接(即处于 SYN_RECV 状态)所能维护的最大数量。默认值常为 1024,对中高并发服务极易打满。
- 小流量网站或测试环境:设为 4096
- 中等业务(如 API 网关、中小型 Web 服务):推荐 8192~16384
- 高并发场景(如 CDN 边缘节点、负载均衡器后端):可设为 32768 或更高,但需配合足够内存与 CPU
临时生效命令:
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
永久生效:在 /etc/sysctl.conf 中添加
net.ipv4.tcp_max_syn_backlog = 8192,再运行 sysctl -p 加载。
同步调大全连接队列(somaxconn)
半连接建好后,需进入全连接队列等待应用层调用 accept()。若此队列太小,即使 SYN 成功通过,也会在最后一步被丢弃。
- 该值应 ≥ 应用程序 listen() 中指定的 backlog 参数
- 且不能低于 tcp_max_syn_backlog,否则成为新瓶颈
- 建议统一设为与 tcp_max_syn_backlog 相同或略高,例如 8192
临时设置:
sysctl -w net.core.somaxconn=8192
永久配置:在 /etc/sysctl.conf 添加
net.core.somaxconn = 8192
缩短无效连接滞留时间(tcp_synack_retries)
当服务端发出 SYN+ACK 后,若迟迟收不到 ACK,会按此参数重试。默认 5 次,总超时约 30 秒——攻击者正利用这段时间堆积大量僵尸连接。
- 设为 2:总超时压缩至约 21 秒
- 设为 0:仅发一次 SYN+ACK,立即释放资源(要求 tcp_syncookies=1 已启用)
- 生产环境推荐 2,平衡响应速度与兼容性
执行:
sysctl -w net.ipv4.tcp_synack_retries=2
并写入 /etc/sysctl.conf 保证持久化。
必须配套启用 SYN Cookies
队列再大也有限,真正兜底的是 tcp_syncookies。它让内核在队列满时不再分配内存,而是将客户端信息加密进 SYN+ACK 的序列号中;只有收到合法 ACK 才验证并建立连接。
- 临时开启:echo 1 > /proc/sys/net/ipv4/tcp_syncookies
- 永久开启:在 /etc/sysctl.conf 添加 net.ipv4.tcp_syncookies = 1,再运行 sysctl -p
- 注意:启用后部分 TCP 扩展(如 SACK)会被禁用,但对 HTTP/HTTPS/API 等主流服务无感知,必须开启











