开启tcp_syncookies是防御syn flood的核心兜底机制,它使内核在半连接队列满时用加密哈希生成syn+ack序列号,仅收到合法ack后才分配资源;同步调大tcp_max_syn_backlog和somaxconn至65535、将tcp_synack_retries降至2或3,并配合iptables限速,可显著延缓崩溃并维持正常连接。

直接调大内核参数不能“挡住”SYN Flood,但能显著延缓服务崩溃、维持部分正常连接能力。关键不是堆高数值,而是让服务器不为伪造连接分配资源、快速释放无效状态、并把压力控制在可响应范围内。
必须开启 tcp_syncookies
这是最核心的兜底机制。它让内核在半连接队列满时,不再丢弃 SYN 包,而是用加密哈希生成 SYN+ACK 序列号(即 cookie)。只有收到合法 ACK 后才真正分配内存和 socket 资源。
- 临时启用:echo 1 > /proc/sys/net/ipv4/tcp_syncookies
- 永久生效:在 /etc/sysctl.conf 中添加 net.ipv4.tcp_syncookies = 1,再执行 sysctl -p
- 注意:设为 1 即可,不要用 2;现代内核(≥3.7)已支持带时间戳的 SYN Cookies,SACK 和窗口缩放基本不受影响
同步调高两个队列上限
tcp_syncookies 是“保命机制”,但它只在队列溢出时触发。如果队列本身太小(如默认 128),攻击流量几秒就打满,根本轮不到 Cookies 生效。
- net.ipv4.tcp_max_syn_backlog:控制半连接队列大小,建议设为 4096~65535
- net.core.somaxconn:控制全连接队列上限,必须 ≥ 应用 listen() 的 backlog 参数,推荐统一设为 65535
- 改完需重启或重载监听服务(如 nginx、apache),否则新值不生效
缩短半连接等待时间
默认 tcp_synack_retries = 5 意味着服务器最长要等约 31 秒才放弃一个伪造连接。这等于给攻击者白送资源占用窗口。
- 建议设为 2 或 3:对应最长等待约 1.5 秒或 3 秒,大幅加快队列周转
- 设为 0 会禁用重传,导致真实弱网用户建连失败,不推荐
- 该参数不影响正常三次握手流程,只压缩无效等待
配合 iptables 做前置限速
内核参数是底层保障,iptables 是第一道过滤。把高频异常 SYN 包拦在进协议栈前,能极大减轻内核压力。
- 允许每个 IP 每秒最多 10 个新 SYN 包,突发允许 20 个:
iptables -A INPUT -p tcp --syn -m limit --limit 10/sec --limit-burst 20 -j ACCEPT - 其余 SYN 包直接丢弃:
iptables -A INPUT -p tcp --syn -j DROP - 规则必须放在 INPUT 链靠前位置,避免被 ESTABLISHED 规则绕过










