启用tcp_syncookies=1是linux防御syn flood的核心手段,通过加密哈希生成syn+ack序列号实现无状态连接验证,零内存开销,生产环境推荐设为1并配合tcp_synack_retries=2等参数调优。

启用 tcp_syncookies 是 Linux 下在不增加内存开销前提下防御 SYN Flood 的核心手段。它不为每个伪造 SYN 分配连接状态,而是用加密哈希生成 SYN+ACK 序列号,仅当客户端返回合法 ACK 时才创建 socket,从根本上避免半连接队列(SYN Queue)耗尽。
启用并确认 tcp_syncookies 生效
该参数有三个取值:0(关闭)、1(自动启用)、2(强制启用)。生产环境推荐设为 1,兼顾兼容性与防护强度。
- 临时启用:
sysctl -w net.ipv4.tcp_syncookies=1 - 永久生效:在
/etc/sysctl.conf中添加一行net.ipv4.tcp_syncookies = 1,再执行sysctl -p - 验证是否生效:
sysctl net.ipv4.tcp_syncookies应返回net.ipv4.tcp_syncookies = 1
理解它为何不增加资源损耗
传统处理方式会在收到 SYN 后立即分配内存保存半连接信息,攻击者发 10 万个 SYN,服务器就预占 10 万条内存条目。而启用 syncookies 后:
- 内核不再维护 SYN 队列中的状态,
tcp_max_syn_backlog参数被忽略 - SYN+ACK 的初始序列号由时间戳、MSS、源/目标 IP 和端口经哈希加密生成
- 客户端返回 ACK 时,内核重新计算 cookie 并比对确认号,匹配才建立连接
- 全程无状态,零额外内存占用,适合高并发低配服务器
配套调优提升整体防护效果
syncookies 是兜底机制,需配合其他参数减少无效重试、加快异常连接释放:
-
net.ipv4.tcp_synack_retries = 2:将 SYN+ACK 重传从默认 5 次降到 2 次,最迟等待约 7 秒即放弃,大幅缩短资源占用周期 - 避免设置
tcp_synack_retries = 0:会导致首次握手失败即丢弃,可能误伤路径不稳定的真实用户(如某些云 LB 后的流量) - 无需调整
tcp_max_syn_backlog:启用 syncookies 后该值失效,调大无意义 - 可保留
tcp_tw_reuse = 1:与 syncookies 兼容,有助于快速复用 TIME-WAIT 连接,不冲突
注意兼容性与适用边界
启用 syncookies 会禁用 SACK(选择性确认)和窗口缩放等高级 TCP 特性,但在绝大多数 HTTP/Web 场景中影响极小:
- 高丢包链路(如弱 Wi-Fi、跨境长延时)下,SACK 缺失可能略微降低吞吐,但不会导致连接失败
- 若业务明确依赖 SACK(如实时音视频传输),应评估是否改用前端 WAF 或负载均衡器做连接清洗
- 它无法防御混合型攻击(如 SYN Flood + 真实慢速 HTTP 请求),此时需上层协同防护











