启用TCP SYN Cookies是防御SYN泛洪最核心的内核级手段,需同步调大tcp_max_syn_backlog与somaxconn、减少synack_retries、配合iptables限速四措并举。

启用 TCP SYN Cookies 是在不增加内存开销的前提下防范 SYN 攻击最直接有效的方式。它不为每个半连接分配内核结构,而是用加密哈希把连接关键信息编码进 SYN+ACK 的初始序列号中,只在收到合法 ACK 后才真正创建 socket。这意味着攻击者发再多伪造 SYN 包,服务器也不会因此耗尽内存或队列。
确认并开启 SYN Cookies
SYN Cookies 默认多数 Linux 发行版是关闭的(net.ipv4.tcp_syncookies = 0),必须显式启用:
- 临时生效:sysctl -w net.ipv4.tcp_syncookies=1
- 永久生效:在 /etc/sysctl.conf 中添加 net.ipv4.tcp_syncookies = 1,再运行 sysctl -p
- 验证是否启用:sysctl net.ipv4.tcp_syncookies 应返回 = 1
- 确认是否被调用:netstat -s | grep -i "syncookies" 查看 Syncookies sent 计数是否随异常流量上升
确保 SYN Cookies 能真正触发
SYN Cookies 只在半连接队列(SYN Queue)溢出时激活。如果队列上限太小,SYN 包会在触发前就被丢弃,看起来像“防护失效”,实则是根本没走到防护逻辑:
- 调大 net.ipv4.tcp_max_syn_backlog(如设为 4096 或 8192),这是内核 SYN 队列长度
- 同步调大 net.core.somaxconn(建议 ≥65535),它控制 accept 队列上限,也间接影响 SYN 队列水位判断
- 应用层 listen backlog 必须 ≥ somaxconn,例如 Nginx 加 listen 80 backlog=65535;Node.js 使用 server.listen(port, host, 65535)
缩短无效连接等待时间
默认 tcp_synack_retries=5,意味着服务器最多等约 63 秒才放弃一个未完成握手的连接。这会持续占用状态判断资源:
- 设为 2(总等待约 1–3 秒)可显著降低队列积压压力
- 写入:net.ipv4.tcp_synack_retries = 2 到 /etc/sysctl.conf 并 sysctl -p
- 切勿设为 0:会导致首次 SYN+ACK 失败即丢弃,对部分云负载均衡或跨境链路不友好
配合 iptables 做轻量级前置过滤
SYN Cookies 是兜底机制,iptables 是第一道防线,能大幅减少进入内核协议栈的恶意 SYN 包:
- 限制单 IP 每秒新建 SYN 数(如 15 个):
iptables -A INPUT -p tcp --syn -m limit --limit 15/sec --limit-burst 30 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP - 规则必须放在 INPUT 链靠前位置,早于 ESTABLISHED 放行规则
- 高并发场景慎用 recent 模块,推荐搭配 ipset + fail2ban 实现动态封禁


















