启用syn cookies并同步扩大连接队列、缩短半连接等待时间,是防御syn flood最有效且低副作用的内核级手段;需组合生效,单靠一项效果有限。

直接启用 SYN Cookies 并同步扩大连接队列、缩短半连接等待时间,是防御 SYN Flood 最有效且低副作用的内核级手段。单靠某一项参数效果有限,关键在组合生效。
开启 SYN Cookies 作为核心兜底机制
它让内核在半连接队列满时,不分配内存保存状态,而是把客户端信息编码进 SYN+ACK 的初始序列号中;只有收到正确 ACK 才真正建立连接。这不是“锦上添花”,而是防止服务彻底失联的最后一道防线。
- 临时启用:echo 1 > /proc/sys/net/ipv4/tcp_syncookies
- 永久生效:在 /etc/sysctl.conf 中添加 net.ipv4.tcp_syncookies = 1,再执行 sysctl -p
- 现代内核(≥3.7)已支持带时间戳的 SYN Cookies,不会禁用 TCP SACK 或窗口缩放,普通 Web/数据库服务可放心开启
同步调大两个关键连接队列
SYN Cookies 只在队列溢出时触发。如果 tcp_max_syn_backlog(半连接队列)或 somaxconn(全连接队列)太小,攻击包还没触达 Cookies 就被静默丢弃,等于防护形同虚设。
- net.ipv4.tcp_max_syn_backlog = 65535:建议不低于 4096,高并发服务直接设为最大值
- net.core.somaxconn = 65535:必须 ≥ 应用 listen() 调用传入的 backlog 值,否则会被截断
- 修改后需重载监听服务(如 systemctl reload nginx),否则新值不生效
缩短半连接超时,加快资源释放
默认 tcp_synack_retries = 5 意味着服务器最长会为一个伪造 SYN 等待约 31 秒(指数退避)。攻击者正是利用这点持续占位。调低该值能显著提升队列周转率,且不影响真实用户建连。
- 设为 3:最长等待约 3 秒
- 设为 2:最长等待约 1.5 秒(更激进,适合网络质量较好的场景)
- 避免设为 0 —— 首次 SYN+ACK 发送失败即丢弃,易在路径不稳定时误伤正常连接
谨慎处理 TIME-WAIT 相关参数
TIME-WAIT 本身不是 SYN Flood 的直接受害者,但大量短连接堆积会导致端口耗尽、影响新连接接纳能力,间接削弱抗压能力。
- net.ipv4.tcp_tw_reuse = 1 可以开启,但仅对**主动发起连接的客户端行为**有效(如服务端调用第三方 API),对监听服务端无实质帮助,也不冲突
- net.ipv4.tcp_tw_recycle = 0 必须保持关闭 —— 该参数已在 Linux 4.12+ 移除,旧版本启用后在 NAT、负载均衡等常见环境中极易引发连接失败
- 若确需压缩 TIME-WAIT 持续时间,优先调整 net.ipv4.tcp_fin_timeout(例如设为 30),比强开回收更安全可控











