启用tcp_syncookies=1是防范SYN洪水攻击的基础保命机制,通过加密编码客户端信息到SYN+ACK序列号实现无状态建连;调小tcp_synack_retries至2或3可将无效连接驻留时间压缩至1.5~3秒;tcp_max_syn_backlog与somaxconn需匹配设为8192或更高,并配合iptables源IP限速和并发连接限制协同防御。

要通过调整内核参数限制 TCP 半连接队列来防范 SYN 洪水攻击,核心不是“堵死连接”,而是让系统在高伪造流量下不崩溃、不丢真实请求——关键靠**缩短驻留时间 + 启用无状态兜底 + 匹配队列容量**三者协同。
必须启用 tcp_syncookies=1
这是最基础的保命机制。它让内核在半连接队列满时,不分配内存存状态,而是把客户端信息(IP、端口、时间戳等)加密编码进 SYN+ACK 的初始序列号里;只有收到合法 ACK 才真正建连。没有额外内存开销,也不依赖队列空间。
- 临时生效:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies - 永久生效:在
/etc/sysctl.conf中添加net.ipv4.tcp_syncookies = 1,再运行sysctl -p - 别设成 2:虽然表示“仅队列满时启用”,但实际触发前可能已丢大量合法 SYN;设为 1 才能全程兜底
调小 tcp_synack_retries 加速释放无效连接
默认值 5 意味着每个伪造 SYN 会占用半连接条目长达约 31 秒。设为 2 或 3,可将平均滞留时间压缩到 1~3 秒,队列周转率提升数十倍。
- 推荐值:2(对应总等待约 1.5 秒)或 3(约 3 秒),兼顾抗压与弱网兼容性
- 不要设为 0:虽能压到 3 秒内释放,但会禁用重传,导致高丢包链路(如移动网络)建连失败
- 设完立即生效:
sysctl -w net.ipv4.tcp_synack_retries=2
合理设置 tcp_max_syn_backlog 和 somaxconn
这两个值必须匹配且足够,否则队列还没用起来就溢出了。tcp_max_syn_backlog 控制半连接队列长度,somaxconn 控制全连接队列上限——而应用层 listen() 的 backlog 参数不能超过后者,否则会被静默截断。
- tcp_max_syn_backlog 建议值:4096~8192(中高并发),极端场景可设为 32768 或 65535
- somaxconn 必须 ≥ 应用 listen 的 backlog(如 Nginx 默认 511,Java 可能设 1024),统一建议设为 8192 或 65535
- 改完需重载服务(如
nginx -s reload)或重启监听进程,否则新值不生效
配合 iptables 做前置速率控制
内核参数是底层保障,iptables 是第一道过滤。把高频异常 SYN 拦在协议栈入口前,能大幅降低 CPU 和队列压力。
- 按源 IP 限速(防突发):
iptables -A INPUT -p tcp --syn -m limit --limit 3/sec --limit-burst 6 -j ACCEPT,其余丢弃 - 按并发数限半连接(防慢速攻击):
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 30 -j DROP - 规则必须加在 INPUT 链靠前位置,并确认
nf_conntrack模块已加载(lsmod | grep nf_conntrack)











