只开tcp_syncookies=1不够,因其仅在半连接队列溢出时触发,若tcp_max_syn_backlog过小(如默认128),攻击包会被静默丢弃而无法触发syncookies;必须同步调大net.core.somaxconn、设tcp_synack_retries=2、匹配Redis的tcp-backlog配置,并启用tcp_tw_reuse与监控闭环。

Redis 本身不处理 TCP 握手,SYN Flood 攻击打的是 Linux 内核的 TCP 协议栈,不是 Redis 进程。连接超时本质是内核半连接队列被填满、SYN+ACK 发不出去或收不到 ACK,导致客户端卡在 SYN_SENT 状态——调 tcp_syncookies 是对的,但必须配对动作,否则可能无效甚至恶化。
为什么只开 tcp_syncookies=1 不够
很多人执行了 sysctl -w net.ipv4.tcp_syncookies=1 就以为万事大吉,结果攻击一来 Redis 还是连不上。根本原因是:tcp_syncookies 只在内核判定「半连接队列已溢出」时才触发。如果 tcp_max_syn_backlog 太小(比如默认 128),攻击包还没走到 syncookies 逻辑,就被静默丢弃了;而 Redis 客户端看到的只是连接超时或 Connection refused,误以为是 Redis 挂了。
- 验证是否真触发:攻击中执行
netstat -s | grep -i "syncookies",有非零输出才说明生效 -
tcp_syncookies=1启用后,tcp_max_syn_backlog的值会被忽略——调大它没意义,但调太小会阻止 syncookies 触发 - 必须同步确保
net.core.somaxconn≥ Redis 的 listen backlog(如redis.conf中未显式配置则默认 511)
tcp_synack_retries 必须设为 2,不能设 0
Redis 通常部署在云环境或穿透 LB/NAT 后,网络路径复杂。设 tcp_synack_retries = 0 意味着内核只发一次 SYN+ACK,收不到 ACK 就立即释放连接条目——这会让真实用户在高丢包、跨运营商或经云厂商 SLB 时首包丢失即断连,现象就是“偶发性连接失败”,比攻击还难排查。
- 默认值 5 → 最长等待约 63 秒(指数退避:1s, 3s, 7s, 15s, 31s),攻击者轻松卡满队列
- 设为 2 → 最长等待约 1.5 秒,实测
ss -s | grep synrecv峰值下降 80% 以上,且不影响弱网用户 - 设为 1 或 3 也可接受,但 2 是兼容性与响应速度的最优平衡点
Redis 自身配置要匹配内核调优
内核参数调得再好,Redis 启动时用的 listen() 系统调用 backlog 值太小,全连接队列(accept queue)先堵死,照样拒绝新连接。这个值由 redis.conf 的 tcp-backlog 控制(注意不是 maxclients)。
- 检查当前值:
grep "^tcp-backlog" /etc/redis/redis.conf,若无则默认为 511 - 推荐设为 8192 或更高,并确保
net.core.somaxconn≥ 该值(例如sysctl -w net.core.somaxconn=8192) - 修改后必须重启 Redis:
systemctl restart redis,reload 不生效 - 若用 Docker 部署,还需加
--sysctl net.core.somaxconn=8192参数透传
别漏掉 tcp_tw_reuse 和监控闭环
SYN Flood 往往伴随大量短连接,攻击缓解后容易堆积 TIME-WAIT 状态,占用端口和内存。此时 tcp_tw_reuse = 1 能帮上忙,但它依赖 tcp_timestamps = 1 才安全启用。
- 确认启用:
sysctl net.ipv4.tcp_tw_reuse net.ipv4.tcp_timestamps应都返回 1 -
tcp_tw_recycle必须为 0(已在 4.12+ 内核移除,设了会报错) - 必须建立监控:定时跑
ss -s | grep -E "(synrecv|time-wait)"和netstat -s | grep -i "listen.*overflow",发现TcpExtListenOverflows持续增长,说明队列仍在承压
真正容易被忽略的点是:syncookies 不是银弹,它解决的是「内存耗尽」,但 CPU 打满(比如每秒几万 SYN 包)时,内核处理每个包的开销才是瓶颈。这时候得靠 iptables 限速或前端 WAF 拦截,而不是继续堆内核参数。


















