linux防syn洪水关键在于内核参数与iptables协同:必须启用tcp_syncookies(编码syn+ack序列号,零内存开销),调大tcp_max_syn_backlog(建议4096+)和somaxconn(需匹配应用backlog),设tcp_synack_retries为2或0以加速释放无效连接,并用iptables按源ip限速(如3/sec)和并发数(如--connlimit-above 30)过滤。

Linux 防 SYN 洪水,关键不在“堵死所有 SYN”,而在让系统不因伪造请求崩掉、同时快速放行真实连接。核心是内核参数 + iptables 协同,不是单靠防火墙规则。
必须开启的内核防护:tcp_syncookies
这是最基础也最关键的保命机制。它让服务器在半连接队列满时,不丢包也不占内存,而是把客户端信息编码进 SYN+ACK 的序列号里;等收到合法 ACK 再验证并建连。
- 临时启用:echo 1 > /proc/sys/net/ipv4/tcp_syncookies
- 永久生效:在 /etc/sysctl.conf 中添加 net.ipv4.tcp_syncookies = 1,再运行 sysctl -p
- 注意:启用后会禁用 SACK 等部分 TCP 扩展,但对绝大多数 Web、API 服务无感知,建议默认开启
调优半连接队列与响应节奏
光开 syncookies 不够——得给队列“留点余量”,还要让无效连接快进快出,避免卡住资源。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- net.ipv4.tcp_max_syn_backlog:控制半连接队列长度。默认常为 1024,建议设为 4096 或 8192(高并发可到 32768),避免秒级打满
- net.ipv4.tcp_synack_retries:SYN+ACK 重发次数。默认 5 次,等待超 30 秒;设为 2 或 0 可大幅缩短滞留时间(设为 0 时需确保 tcp_syncookies=1)
- 别碰 tcp_syn_retries:这是客户端参数,服务器上改了没用
iptables 实战限速:防突发、控并发
内核兜底,iptables 前置过滤。重点不是“禁止 SYN”,而是限制每个 IP 的行为节奏。
- 按速率限新连接(推荐):
iptables -A INPUT -p tcp --syn -m hashlimit \
--hashlimit-name syn_flood \
--hashlimit-mode srcip \
--hashlimit 3/sec \
--hashlimit-burst 10 \
-j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP - 按并发数限半连接(防慢速攻击):
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 30 -j DROP - 注意:这两类规则要加在 INPUT 链靠前位置,且必须确保 nf_conntrack 模块已加载(lsmod | grep nf_conntrack)
别漏掉全连接队列和应用层配合
半连接队列没满,不代表连接就能成功——accept 队列(全连接队列)同样可能成为瓶颈。
- net.core.somaxconn:系统级全连接队列上限,默认常为 128。建议同步设为 8192 或更高
- 应用层也要匹配:Nginx 要写 listen 80 backlog=8192;Java 的 ServerSocket(port, backlog) 第二个参数不能小于内核值
- 验证是否生效:ss -s | grep synrecv 查半连接数,netstat -s | grep -i overflow 看是否有 ListenOverflows










