开启tcp_syncookies=1是防御SYN Flood最核心的无状态兜底机制,需同步调大tcp_max_syn_backlog和somaxconn、将tcp_synack_retries设为2、并配合iptables前置限速,缺一不可。

开启 tcp_syncookies 是防御 SYN Flood 攻击最核心的兜底机制,但它不是“开就万事大吉”的开关——必须配合队列调优、超时压缩和前置过滤,才能真正起效。
必须开启 tcp_syncookies=1
这是唯一能避免伪造 SYN 包耗尽内存的无状态响应机制:内核不为每个半连接分配结构体,而是把时间戳、MSS 等信息加密编码进 SYN+ACK 的初始序列号(即 cookie),只在收到合法 ACK 后才创建 socket。
- 临时启用:echo 1 > /proc/sys/net/ipv4/tcp_syncookies
- 永久生效:在 /etc/sysctl.conf 中添加 net.ipv4.tcp_syncookies = 1,再执行 sysctl -p
- 验证是否生效:sysctl net.ipv4.tcp_syncookies 应返回 1;也可用 netstat -s | grep -i syncookies 查看发送计数是否上升
- 设为 2 会强制跳过队列检查,掩盖真实压力,不推荐;现代内核(≥3.7)已支持带时间戳和 SACK 的 SYN Cookies,无需关闭这些特性
同步扩大两个关键队列上限
SYN Cookies 只在队列溢出时触发。若默认值(如 128 或 1024)太小,攻击几秒就打满,根本轮不到 Cookie 生效。
- net.ipv4.tcp_max_syn_backlog:控制半连接队列大小,建议设为 4096~65535(小内存服务器从 4096 起步,高并发可设 65535)
- net.core.somaxconn:控制全连接队列上限,必须 ≥ 应用层 listen() 的 backlog 值,推荐统一设为 65535
- 改完需重载服务(如重启 nginx 或 reload apache),否则新值对监听进程无效
- 注意:应用代码或配置(如 Nginx 的 listen 80 backlog=65535)也必须同步调整,否则实际生效值取 min(内核值, 应用值)
大幅缩短半连接等待时间
默认 tcp_synack_retries = 5 意味着一个伪造连接最多占用资源约 63 秒。这等于给攻击者白送资源窗口。
- 设为 2:最长等待约 1.5 秒;设为 1:约 1 秒;实测可将队列周转率提升两个数量级
- 设为 0 虽能压到 3 秒内释放,但可能影响弱网用户(如跨境、高丢包链路),仅建议作为应急手段且必须搭配 tcp_syncookies=1
- 写入 /etc/sysctl.conf 并执行 sysctl -p 即刻生效,不影响正常三次握手流程
配合 iptables 做轻量级前置过滤
内核参数是底层兜底,iptables 是第一道防线。把高频异常 SYN 包拦在协议栈之外,能显著降低 CPU 和内存压力。
- 允许每个 IP 每秒最多 10–15 个新 SYN 包,突发允许 20–30 个:
iptables -A INPUT -p tcp --syn -m limit --limit 15/sec --limit-burst 30 -j ACCEPT - 其余 SYN 包直接丢弃:
iptables -A INPUT -p tcp --syn -j DROP - 规则必须放在 INPUT 链靠前位置,避免被 ESTABLISHED 规则绕过
- 该策略不替代 SYN Cookies,而是让它更少被触发,延长系统可用时间


















