直接开启net.ipv4.tcp_syncookies=1是最有效的内核级SYN-Flood缓解手段,它不占内存、不维护状态,仅在半连接队列溢出时按需启用加密序列号验证;必须设为1(非0或2),同步调大somaxconn至≥65535、将tcp_synack_retries设为2,并配iptables前置限速,缺一不可。

直接开启 net.ipv4.tcp_syncookies = 1 是在不扩容带宽、不增加内存开销的前提下硬扛 SYN 挤兑最有效的内核级手段——它不存状态、不占队列,靠加密序列号隐式建链,只在半连接队列真正溢出时自动触发。
为什么必须设为 1,而不是 0 或 2
设为 0 表示完全关闭,服务器只能靠有限内存硬扛伪造 SYN,极易被耗尽连接结构体而拒绝服务;设为 2 是强制全程启用 SYN Cookies,会禁用 TCP 时间戳和 SACK,在跨境、移动或高丢包链路上可能导致真实用户握手失败或吞吐下降。现代内核(≥3.7)已支持带时间戳的 SYN Cookies,设为 1 即可实现“按需启用”,安全且兼容性最佳。
开启后 tcp_max_syn_backlog 就失效了
这是关键事实,常被误调:一旦 tcp_syncookies=1 生效,内核绕过传统半连接队列管理逻辑,tcp_max_syn_backlog 的值不再参与判断,再调大它毫无意义。此时防御机制不依赖缓冲区大小,而是靠哈希编码把时间戳、MSS、IP 和端口信息压缩进 SYN+ACK 的初始序列号中。你该关注的是“何时触发”,而不是“能堆多大”。
必须同步做的三件事
-
将
tcp_synack_retries设为 2:默认值 5 会让单个伪造 SYN 最多占用服务器约 63 秒(1s, 3s, 7s, 15s, 31s),设为 2 后总等待时间压至约 4 秒,显著加快无效连接释放节奏 -
调大
net.core.somaxconn(建议 ≥65535):它控制 accept 队列上限,也影响内核对 SYN 队列水位的判断逻辑,间接决定 syncookies 触发时机 -
配 iptables 前置限速:例如
iptables -A INPUT -p tcp --syn -m limit --limit 15/sec --limit-burst 30 -j ACCEPT,把攻击流量拦在 TCP 栈之前,避免 CPU 被大量无效哈希计算拖垮
如何验证是否真起作用
仅看 sysctl net.ipv4.tcp_syncookies 返回 1 不够,要确认它被实际调用:netstat -s | grep -i "syncookies" 查看 Syncookies sent 计数是否随异常流量上升;dmesg | tail -20 留意是否有 possible SYN flooding 提示——这说明队列确实溢出、syncookies 已介入响应。


















