开启syn cookies是抵御syn洪水攻击最直接、低成本的内核级防御手段,它通过在syn+ack序列号中编码连接信息实现无状态响应,避免半连接队列耗尽导致服务中断;需配合扩大tcp_max_syn_backlog等队列参数及调优重试超时值协同生效。

开启内核 SYN Cookies 是高性能 Web 集群抵御 SYN 洪水攻击最直接、成本最低的冗余手段之一。它不依赖额外内存保存半连接状态,而是在 SYN+ACK 包的初始序列号中编码连接关键信息,使服务器在队列溢出时仍能完成三次握手,避免服务中断。
启用并验证 SYN Cookies 生效
SYN Cookies 默认在多数现代发行版中已编译进内核,但通常未启用。需显式打开:
- 临时启用:echo 1 > /proc/sys/net/ipv4/tcp_syncookies
- 永久生效:在 /etc/sysctl.conf 中追加一行 net.ipv4.tcp_syncookies = 1,再执行 sysctl -p
- 确认是否启用:sysctl net.ipv4.tcp_syncookies 应返回 1
配合关键队列参数协同防御
单独开启 SYN Cookies 不够,必须同步扩大连接队列容量,否则 Cookie 触发过早,影响正常连接体验:
- net.ipv4.tcp_max_syn_backlog = 262144:提升半连接队列上限(CentOS 6 默认仅 1024,小内存系统甚至为 128)
- net.core.somaxconn = 262144:匹配应用层 listen backlog(如 Nginx 的 listen ... backlog=65535),避免被内核截断
- net.core.netdev_max_backlog = 262144:防止网卡收包速率远超协议栈处理能力时丢包
适配高并发场景的重试与超时调优
在攻击压力下,快速释放异常连接资源比“等满再丢”更有效:
- net.ipv4.tcp_syn_retries = 1:客户端发 SYN 失败后只重试 1 次(默认 6 次),降低扫描类攻击成功率
- net.ipv4.tcp_synack_retries = 1:服务端发 SYN+ACK 后只重试 1 次(默认 5 次),加快无效连接清理
- net.ipv4.tcp_fin_timeout = 30:FIN-WAIT-2 状态保持时间缩至 30 秒(默认 60),缓解 TIME-WAIT 堆积
注意事项与兼容性说明
现代内核(≥3.7)已支持带 TCP 时间戳(tcp_timestamps)和 SACK 的 SYN Cookies,无需关闭这些特性。若使用较老内核(如 CentOS 6 默认 2.6.32),可保留 tcp_timestamps = 1,实际影响极小。真正需关注的是确保 tcp_tw_reuse = 1 和 tcp_tw_recycle = 0(后者在 NAT 环境下禁用),以安全复用 TIME-WAIT 连接。











