必须协同调优tcp_max_syn_backlog、somaxconn与nginx listen backlog三者,缺一不可;推荐均设为65535或更高,并启用tcp_syncookies、降低tcp_synack_retries等防护机制。

调优 tcp_max_syn_backlog 本身不能单独抵御 SYN 攻击,必须和 somaxconn、Nginx 的 listen backlog 参数协同调整,并配合其他内核与应用层策略,才能真正提升抗压能力。
同步调大三个关键队列参数
SYN Flood 攻击会快速填满「半连接队列」(SYN_RECV 状态),但若后续环节不匹配,堵点会前移或后移,导致调优失效:
-
net.ipv4.tcp_max_syn_backlog:控制半连接队列上限。云服务器建议设为
4096~65535,高并发场景可设为262144(需内存支撑) -
net.core.somaxconn:控制全连接队列(accept 队列)上限。必须 ≥ Nginx listen 中指定的 backlog 值,推荐统一设为
65535或更高 -
Nginx listen 指令的 backlog 参数:例如
listen 80 backlog=65535;。若未显式设置,Nginx 默认用系统somaxconn值,但旧版本可能截断为 511;务必显式声明并匹配内核值
必须重启或重载 Nginx 才生效
这两个队列在内核中是监听 socket 初始化时一次性分配的,不是运行时动态伸缩的。修改 sysctl 后:
- 仅执行
sysctl -p只更新内核参数,不会影响已运行的 Nginx 进程 - 必须执行
systemctl reload nginx(支持优雅重载)或systemctl restart nginx(短暂停机),让 Nginx 重新调用listen(fd, backlog) - 验证是否生效:用
ss -lnt查看 Recv-Q 列最大值(即全连接队列容量),应接近你设置的 backlog 值
搭配其他内核防护手段
单靠扩大队列只是“扩容”,不能替代主动防御。建议组合启用:
-
开启 tcp_syncookies:
net.ipv4.tcp_syncookies = 1。当半连接队列满时,内核改用 Cookie 方式完成三次握手,不占队列空间,是应对突发攻击的关键兜底机制 -
降低重试次数:
net.ipv4.tcp_synack_retries = 2(默认 5)。减少无效 SYN-ACK 重发,加快超时释放,缓解资源堆积 -
限制网卡软中断队列:
net.core.netdev_max_backlog = 262144。防止攻击包在进入协议栈前就丢包,确保 SYN 包能稳定送达 TCP 层
注意容器与云环境的特殊性
在 Docker 或 Kubernetes 中,容器默认无法继承宿主机的 sysctl 设置:
- Docker 启动时需加
--sysctl net.ipv4.tcp_max_syn_backlog=65535 --sysctl net.core.somaxconn=65535 - Kubernetes Pod 需在
securityContext.sysctls中声明,且节点需开启unsafe-sysctls白名单 - 部分云厂商(如阿里云、腾讯云)的自定义镜像或安全组策略可能覆盖内核参数,部署后务必用
sysctl -a | grep syn实际确认











