启用tcp_syncookies是防御SYN-Flood的核心手段,其通过无状态响应将连接信息编码进SYN+ACK序列号,仅在收到合法ACK时才分配内存,避免半连接队列耗尽资源。

启用 tcp_syncookies 是在不增加内存开销的前提下防御 SYN-Flood 的核心手段。它的原理不是“扩容”,而是“无状态响应”:内核不为每个伪造 SYN 保存半连接结构,而是把必要信息(时间戳、MSS、初始序列号等)加密编码进 SYN+ACK 的序列号中,只在收到合法 ACK 后才真正分配 socket 内存。
为什么它不增加内存
普通模式下,每个未完成三次握手的 SYN 请求都会在内存中占用一个 request_sock 结构;而开启 tcp_syncookies=1 后:
- 半连接队列(SYN Queue)满时,内核不再丢包,也不再分配内存,直接构造带 Cookie 的 SYN+ACK
- 只有客户端返回的 ACK 携带正确校验值,内核才创建完整 socket 并进入全连接队列
- 整个过程跳过了半连接状态的内存驻留,从根本上避免资源被耗尽
正确启用方式
临时生效(立即起效,重启失效):
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
永久生效(推荐):
- 编辑
/etc/sysctl.conf,添加一行:net.ipv4.tcp_syncookies = 1 - 执行
sysctl -p加载配置
注意:=1 表示始终启用(含队列未满时),比 =2(仅溢出时启用)更可靠,且现代内核(≥3.7)支持带时间戳的 Cookie,不会禁用 tcp_timestamps 或 tcp_sack。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
搭配关键参数才能真正落地
单独开 tcp_syncookies 能防资源耗尽,但若其他参数不合理,仍可能影响正常连接或降低防护效率:
-
net.ipv4.tcp_synack_retries = 2:将重试次数从默认 5 次(最长等待约 31 秒)降至 2 次(约 1.5 秒),让无效连接更快释放,提升队列周转率 -
net.core.somaxconn = 65535和net.ipv4.tcp_max_syn_backlog = 65535:确保全连接队列和半连接队列容量足够,避免因队列截断导致 Cookie 机制无法触发 - 应用层需匹配:如 Nginx 的
listen ... backlog=65535,否则内核设置再大也无效
验证是否生效
运行以下命令检查当前值:
sysctl net.ipv4.tcp_syncookies
观察连接状态变化:
ss -s | grep "synrecv" —— 正常防御下,synrecv 数量应明显低于攻击前,且不会持续堆积
注意:日志中出现 Possible SYN flooding 提示,往往说明 tcp_syncookies 已自动触发(前提是已启用),这是正常保护行为,不是错误。

















