首页/网络/协议速查/SYN flood 与 syncookies
TCP 与 UDP54 条

SYN flood 与 syncookies

半连接队列被打满时,内核可改用无状态 syncookies 响应 SYN(把连接信息编进序列号),抵御伪造源地址的洪水攻击。

协议速查网络更新于 2026-10-13

队列被打满时的兜底机制

正常握手时内核为每个 SYN 在半连接队列里建一条记录,等第三次握手完成再移入全连接队列。伪造源地址的 SYN 洪水会把这条队列占满,导致真实用户连不上。syncookies 的做法是把连接信息编码进初始序列号,服务器不再为未完成的连接保留状态,从源头上消除了队列被撑满的可能。

基本信息

适用平台Linux 内核参数 net.ipv4.tcp_syncookies
取值0 关闭、1 在队列溢出时启用、2 无条件启用
推荐设置保持 1,仅在极端环境用 2
代价启用期间部分 TCP 选项(如窗口缩放)未必能完整协商
相关参数tcp_max_syn_backlog、tcp_synack_retries、somaxconn

路径与兜底

环节行为观察点
正常路径SYN 队列与 Accept 队列两级排队ss -lnt 的 Recv-Q 与 Send-Q
syncookies队列满时改用无状态应答TcpExtSyncookiesSent 增长
溢出统计记录被丢弃的 SYNTcpExtListenDrops 增长
升级方案上游清洗加限速加缩短半连接超时攻击流量特征明显时优先用清洗

观测与配置

观测与配置
sysctl net.ipv4.tcp_syncookies            # 1=队列满时启用(推荐)
ss -tan state syn-recv | wc -l            # 当前半连接数量
cat /proc/net/netstat | grep -o 'TcpExtSyncookies[A-Za-z]*'   # 确认存在这些计数
netstat -s | grep -i -E 'SYNs to LISTEN|cookies'              # 溢出与 cookie 概况
sysctl -w net.ipv4.tcp_syncookies=1 net.ipv4.tcp_max_syn_backlog=65535

典型使用场景

  • 对外暴露的服务在遭受 SYN 洪水时保持可用
  • 排查「大量连接卡在 SYN 收到」:区分是真攻击还是后端 accept 太慢
  • 安全加固基线:把 syncookies 与队列参数一起纳入检查项
  • 容量评估时对比开启前后的握手成功率与延迟
开启 syncookies 后部分 TCP 选项协商可能受限:正常流量若能完整连通就没有问题,若发现窗口缩放异常再回头检查该参数与中间设备的兼容性。
syncookies 是兜底而不是护城河:它能避免服务器因队列耗尽而拒绝所有新连接,但带宽与吞吐仍会被攻击流量占用,大流量攻击必须在上游做清洗。
对比攻击前后的计数:cookie 发送量与监听队列丢弃数同时抬升说明队列确实被撑满;若只有 cookie 增长而丢弃数没动,应先优化队列参数再看攻击面。

易错点

  • syncookies 是兜底不是护城河:单机只能扛住一定程度,大流量仍需上游清洗与限速
  • 把 SYN-RECV 大量堆积都当成攻击:后端 accept 过慢或队列上限太小也会造成同样现象,要先看应用侧指标
  • 关闭 syncookies 以「避免选项协商受限」:等于放弃唯一的状态无关防御,风险远大于收益
  • 只调 syncookies 不调 tcp_max_syn_backlog:正常突发流量仍会在队列层被丢弃,问题只是延后出现

数据来源与参考

  • RFC 4987(SYN flood 防御)
  • man 7 tcp

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌