启用tcp_syncookies是Linux下缓解SYN Flood攻击最有效手段,它通过哈希加密将连接信息嵌入SYN+ACK序列号,实现无状态响应,避免半连接队列内存占用;需设为1自动触发,并配合降低synack重试次数和iptables限速使用。

启用 tcp_syncookies 是 Linux 下在不增加内存损耗前提下缓解 SYN Flood 攻击最核心、最有效的手段——它让服务器彻底跳过为每个伪造 SYN 分配半连接内存这一步。
为什么 syncookies 能避免内存损耗
传统 TCP 握手收到 SYN 后,内核会在 SYN 队列 中为每个请求分配一个结构体(struct request_sock),保存源 IP、端口、MSS、时间戳等状态信息。攻击者发 10 万个 SYN,队列就占满,内存也跟着涨。
syncookies 关闭时,这些结构体必须常驻内存;开启后,内核不做任何存储,而是用加密哈希把关键信息“压缩”进 SYN+ACK 包的初始序列号里。只有客户端真返回 ACK,且确认号(ack = seq+1)能通过校验,内核才临时构造完整连接。整个过程无状态、零队列占用。
正确启用 syncookies 的方式
临时启用(立即生效):
sysctl -w net.ipv4.tcp_syncookies=1
永久生效(重启不丢失):
在 /etc/sysctl.conf 中添加一行:
net.ipv4.tcp_syncookies = 1
然后运行:
sysctl -p
注意:
• 值设为 1 表示“自动启用”(仅当 SYN 队列溢出时触发),最稳妥;设为 2 是强制启用,一般无需;
• 启用后,tcp_max_syn_backlog 参数会被忽略,调大它已无意义;
• 它与 tcp_tw_reuse 可共存,不冲突。
配套调优,防止 syncookies 成为唯一依赖
syncookies 是兜底机制,不是万能开关。需配合以下两项,才能真正降低资源压力:
- 压低重试次数:执行 sysctl -w net.ipv4.tcp_synack_retries=2。默认值 5 意味着最多等待约 63 秒,攻击者就卡在这里耗时间。设为 2 后,总等待时间缩至约 7 秒,快速释放无效等待。
-
iptables 前置限速:在 INPUT 链头部加自定义链过滤 SYN 包,例如:
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 50/s --limit-burst 10 -j RETURN
iptables -A syn-flood -j DROP
这样每秒只放行 50 个新 SYN,突发允许 10 个,把大量异常流量拦在内核连接处理逻辑之外。
需要注意的兼容性细节
启用 syncookies=1 后,内核会禁用 SACK(选择性确认)选项。这对绝大多数 HTTP/Web 服务影响极小,但在高丢包环境(如弱 Wi-Fi、跨境链路)下可能略微降低吞吐。如果你的业务明确依赖 SACK 且网络质量差,可考虑使用带时间戳扩展的 syncookie 方案(需较新内核及特定配置),但日常防护中无需为此妥协。


















