linux防御syn flood需三层协同:启用tcp_syncookies避免半连接队列耗尽;调大tcp_max_syn_backlog、减少tcp_synack_retries;结合iptables限速限连及前端负载均衡/waf清洗。

Linux 系统面对 SYN Flood 攻击时,核心是控制半连接队列(SYN Queue)行为、限制新建连接速率,并配合网络层协同过滤。关键不在于完全阻止 SYN 包,而是在资源耗尽前合理丢弃异常请求、加速合法连接完成。
启用内核级 SYN Cookie 防护
SYN Cookie 是应对 SYN Flood 最有效的内核机制,它不依赖内存保存半连接状态,而是用加密哈希编码初始序列号。当连接完成三次握手后才分配 socket 资源。
启用方式(临时生效):
- echo 1 > /proc/sys/net/ipv4/tcp_syncookies
- sysctl -w net.ipv4.tcp_syncookies=1
永久生效:在 /etc/sysctl.conf 中添加:
net.ipv4.tcp_syncookies = 1
注意:SYN Cookie 在启用 tcp_tw_reuse 或 tcp_fin_timeout 调优时仍可正常工作,但会禁用部分 TCP 扩展(如 SACK),对高丢包环境影响略大,一般互联网服务可放心开启。
调优半连接队列与超时参数
Linux 维护两个关键队列:SYN 队列(未完成三次握手)和 accept 队列(已完成握手、等待应用 accept)。攻击常填满 SYN 队列导致合法请求被丢弃。
关键参数建议:
- net.ipv4.tcp_max_syn_backlog:增大 SYN 队列长度(如设为 2048 或 4096),尤其在高并发短连接场景
- net.ipv4.tcp_synack_retries:减少 SYN+ACK 重传次数(默认 5 次 → 建议改为 2 或 3),加快释放无效连接占用的资源
- net.ipv4.tcp_syn_retries:客户端侧参数,不影响服务器防护,无需调整
示例配置:
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 2
结合 conntrack 与 iptables 限速限连接
内核防护之外,用 netfilter 层做前置过滤,成本低、见效快。
- 对单 IP 新建连接限速(每秒最多 20 个 SYN):
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 20 -j DROP - 限制同一源 IP 的并发半连接数(防慢速 SYN Flood):
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 50 -j DROP - 配合 recent 模块封禁高频发 SYN 的 IP(10 秒内超 30 次即拉黑 60 秒):
iptables -A INPUT -p tcp --syn -m recent --name synflood --rcheck --seconds 10 --hitcount 30 -j DROP
iptables -A INPUT -p tcp --syn -m recent --name synflood --set
注意:iptables 规则需放在 ESTABLISHED/RELATED 规则之后,避免误伤已建立连接。
部署前端协同防护(非内核但强推荐)
单纯系统调优无法替代网络层分流。生产环境应组合使用:
- 负载均衡器(如 Nginx、HAProxy)开启 limit_conn 和 limit_req,在七层拦截异常流量
- 云厂商 WAF 或 DDoS 高防 IP,在网络边缘清洗 SYN Flood 流量,避免到达服务器网卡
- 若用 Kubernetes,可在 Ingress Controller 或 NetworkPolicy 层设置连接限制
内核参数 + 主机防火墙 + 前端设备三层覆盖,才能兼顾性能、兼容性与防御深度。











