启用TCP SYN Cookies是防御SYN泛洪攻击最核心的内核级手段,需配合调大somaxconn与tcp_max_syn_backlog、减少tcp_synack_retries、iptables限速四措施协同生效。

启用 TCP SYN Cookies 是防御高并发场景下 SYN 泛洪攻击最核心、最有效的内核级手段。它不靠“堆资源”硬扛,而是从根本上避免为伪造连接分配内存,让服务器只在真正完成三次握手后才创建 socket。
SYN Cookies 不是万能开关,必须配合关键配置才能生效
它只在半连接队列(SYN Queue)真正溢出时触发。如果 net.core.somaxconn 或应用层 listen() 的 backlog 过小,SYN 包会在触发前就被静默丢弃——此时你看到的不是防护起效,而是连接失败率上升。
以下四点是实际部署中必须同步落实的操作:
1. 正确开启并确认 SYN Cookies 生效
- 临时启用: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
- 检查是否真被调用:netstat -s | grep -i "syncookies",观察 Syncookies sent 计数是否增长
2. 同步调大两个关键队列上限
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
SYN Cookies 要起作用,前提是系统得先“撑到溢出那一刻”。否则流量还没触达阈值就丢了。
- net.core.somaxconn = 65535(全连接队列上限,影响 accept() 队列)
- 应用层 listen backlog 必须 ≥ 上述值,例如:
Nginx 配置中加 listen 80 backlog=65535;
Node.js 使用 server.listen(port, host, 65535)
Golang 默认已适配,但需确认 runtime 环境未限制
3. 缩短 SYN+ACK 重试等待时间
默认重试 5 次(最长等约 63 秒),攻击者就卡在这里占位。调低可加速释放无效状态:
- net.ipv4.tcp_synack_retries = 2(推荐)或 = 3
- 设为 2 时,总等待时间压缩至约 1–3 秒,大幅降低队列积压压力
- 切勿设为 0:会导致首次 SYN+ACK 发送失败即丢弃,对部分云厂商 LB 或跨境链路不友好
4. 配合 iptables 做前置限速,减轻内核负担
SYN Cookies 是兜底机制,iptables 是第一道过滤网。重点拦“高频发 SYN 却从不回 ACK”的行为:
- 允许每个 IP 每秒最多 15 个新 SYN 包,突发允许 30 个:
iptables -A INPUT -p tcp --syn -m limit --limit 15/sec --limit-burst 30 -j ACCEPTiptables -A INPUT -p tcp --syn -j DROP
- 规则必须放在 INPUT 链靠前位置(早于 ESTABLISHED 放行规则)
- 若需动态封禁,建议搭配 ipset + fail2ban,而非 recent 模块(高并发下性能差且易误伤 NAT 用户)
不复杂但容易忽略










