调优tcp_max_syn_backlog本身不能单独防御syn flood,必须同步调高net.core.somaxconn和nginx listen backlog,并启用tcp_syncookies=1、设tcp_synack_retries=2,三者对齐后reload服务才生效。

调优 tcp_max_syn_backlog 本身不能单独防御 SYN Flood,它只是半连接队列的容量上限,真正起效必须和 somaxconn、Nginx 的 listen backlog 严格对齐,并配合 syncookies、重试策略等协同生效。
必须同步调整的三个核心参数
这三个值不匹配,调了也白调:
-
net.ipv4.tcp_max_syn_backlog:控制内核半连接队列(SYN_RECV 状态)理论上限。云服务器建议设为
65535或262144(需内存支撑),小内存机器可从32768起步 -
net.core.somaxconn:控制全连接队列(accept 队列)上限,必须 ≥ Nginx listen 中指定的 backlog 值。推荐统一设为
65535或更高 -
Nginx listen backlog:例如
listen 443 ssl http2 backlog=65535;。若未显式设置,旧版本 Nginx 默认用511,会严重截断内核能力
关键操作与验证要点
改完参数不是结束,而是开始:
- 执行
sysctl -p加载内核参数,但不会自动更新已运行的 Nginx 进程 - 必须执行
systemctl reload nginx(优雅重载)或systemctl restart nginx,让 Nginx 重新调用listen()初始化新队列 - 用
ss -lnt查看 Recv-Q 列最大值,应接近你设置的 backlog 值;ss -s | grep synrecv观察半连接数量是否回落 - 检查
cat /proc/sys/net/ipv4/tcp_syncookies是否为1,确认 syncookies 已启用——这是应对突发攻击的兜底关键
配套加固不可跳过
只扩队列是“治标”,搭配策略才能“治本”:
-
降低重试次数:
net.ipv4.tcp_synack_retries = 2(默认 5)。伪造 IP 不响应,减少无效等待时间,加快资源释放 -
限制网卡软中断队列:
net.core.netdev_max_backlog = 262144,防止攻击包在进入 TCP 层前就被丢弃 -
iptables 前置限速:比如单 IP 每秒最多允许 5 个新 SYN:
iptables -A INPUT -p tcp --syn -m limit --limit 5/sec --limit-burst 10 -j ACCEPT
容器与云环境特别注意
在 Docker 或 Kubernetes 中,宿主机内核参数可能不被容器继承:
- Docker 启动时需加
--sysctl net.core.somaxconn=65535 --sysctl net.ipv4.tcp_max_syn_backlog=65535 - Kubernetes Pod 需在
securityContext.sysctls中显式声明,且集群节点需开启sysctl白名单 - 部分云厂商(如阿里云、腾讯云)的自定义镜像或安全组策略可能覆盖内核默认值,部署后务必验证











