启用tcp_syncookies=1是防SYN Flood最核心手段,配合调大tcp_max_syn_backlog、somaxconn及降低synack_retries,并用iptables限速SYN请求,才能真正生效。

直接开启 tcp_syncookies=1 是防止 SYN Flood 类拒绝服务攻击最核心、最有效的内核级手段。它不依赖额外软件,也不靠堆内存硬扛,而是在半连接队列真正溢出时,用加密计算替代内存分配,只在收到合法 ACK 后才创建连接——从根本上规避资源耗尽。
确认并启用 SYN Cookies
现代 Linux 内核(如 5.4+)默认值常为 1,但不能假设已生效:
- 查看当前状态:
sysctl net.ipv4.tcp_syncookies,返回 1 表示已启用 - 临时启用:
sudo sysctl -w net.ipv4.tcp_syncookies=1 - 永久生效:编辑
/etc/sysctl.conf,添加或修改这一行:
net.ipv4.tcp_syncookies = 1,再运行sudo sysctl -p
必须同步调整的三个关键参数
SYN Cookies 只在半连接队列溢出时触发。如果队列太小、或全连接队列更小、或重试时间太长,SYN 包会在触发前就被丢弃,防护形同虚设:
- 增大半连接队列上限:
net.ipv4.tcp_max_syn_backlog = 4096(中小服务)或8192~32768(高并发) - 增大全连接队列上限:
net.core.somaxconn = 65535(同时需确保应用层 listen backlog ≥ 此值) - 缩短 SYN-ACK 重试次数:
net.ipv4.tcp_synack_retries = 2(总等待压缩至约 1–3 秒,避免无效连接长期占位)
这些参数同样要写入 /etc/sysctl.conf 并执行 sysctl -p 加载。
验证是否真实起效
仅看参数值不够,得确认系统确实在调用 SYN Cookie:
- 运行:
netstat -s | grep -i "syncookies" - 观察输出中 Syncookies sent 的计数是否随压力上升而增长
- 若始终为 0,说明流量未触达队列上限,或上游(如负载均衡、防火墙)已拦截,也可能是应用 listen backlog 设置过小导致提前丢包
搭配 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 ACCEPT - 之后立即跟一条丢弃规则:
iptables -A INPUT -p tcp --syn -j DROP - 这两条规则必须放在 INPUT 链靠前位置(早于 ESTABLISHED 放行规则)


















