SYN Cookies 挡的是半连接耗尽
TCP 三次握手中,服务器收到 SYN 后要先在半连接队列里占一个位置。攻击者伪造大量源地址只发 SYN、不回 ACK,队列被占满后正常连接也建不起来。开启 SYN Cookies 后,半连接队列满时服务器改用加密构造的序列号应答,不再为该连接保留状态,等收到合法 ACK 再重建连接信息,从而在攻击中维持可用性。现代内核通常默认开启,这一项多数时候只需核查。
基本信息
| 加固项 | SYN Flood 半连接耗尽缓解 |
|---|---|
| 适用平台 | Linux(RHEL/CentOS、Debian/Ubuntu) |
| 权限要求 | root |
| 基线值 | net.ipv4.tcp_syncookies = 1 |
| 持久化 | /etc/sysctl.d/*.conf 或 /etc/sysctl.conf |
典型使用场景
- 公网暴露的 Web、API 服务加固
- 基线巡检确认内核抗压参数没有被改回 0
- 遭遇 SYN Flood 时作为第一步确认缓解能力
- 高并发短连接场景(短信网关、代理服务)调优
- 新镜像或容器宿主机统一内核参数
核查与加固
核查与加固
sysctl net.ipv4.tcp_syncookies # 期望 1
sysctl net.ipv4.tcp_max_syn_backlog net.ipv4.tcp_synack_retries net.core.somaxconn # 一并看相关参数
echo 'net.ipv4.tcp_syncookies = 1' > /etc/sysctl.d/99-hardening.conf
sysctl --system # 使配置生效
sysctl net.ipv4.tcp_syncookies # 复核相关内核参数
| 参数 | 含义 | 常见取值 |
|---|---|---|
| net.ipv4.tcp_syncookies | 队列满时启用 SYN Cookies | 1 开启,基线值 |
| net.ipv4.tcp_max_syn_backlog | 半连接队列长度上限 | 随并发与内存调整,常见 1024-8192 |
| net.ipv4.tcp_synack_retries | SYN-ACK 重传次数 | 过大延长攻击占用,常设 2-3 |
| net.core.somaxconn | accept 队列上限 | 与 tcp_max_syn_backlog 匹配更稳 |
读法与判定
| 值 1 | 半连接队列溢出时启用加密序列号应答,达标 |
|---|---|
| 值 0 | 关闭,队列打满即拒绝新连接,不达标 |
| 配置位置 | /etc/sysctl.d/ 下的独立文件便于维护与复核 |
| 生效范围 | 立即对全部接口生效,无需重启 |
SYN Cookies 生效时会牺牲部分 TCP 扩展能力(如窗口缩放),高吞吐、大带宽时延积的场景属于已知折衷。内核只在半连接队列溢出时才启用,因此收益远大于代价,不必为了这点退化把它关掉。
开启 SYN Cookies 只是缓解手段,不是完整的抗 DDoS 方案。云环境下还需要安全组或防火墙限制来源、按源 IP 限速、以及上游清洗与连接数控制;把单机参数当成防护天花板会低估真实攻击的影响面。