首页/新闻资讯/正文详情

SYN Flood 的防御链条:从半连接队列到 syncookies 的边界与盲区

发布时间:2026/11/10 23:51:10 来源:云帆数科 栏目:资讯中心
SYN Flood 的防御链条:从半连接队列到 syncookies 的边界与盲区
写后端的人迟早会撞上这么一个场景压测时 QPS 还远没到瓶颈客户端却开始大面积连接超时。服务进程活着CPU 个位数内存富余带宽空着一大截可连接就是建不起来。这时候登上机器翻一下 dmesg大概率会看到一行刷屏的日志TCP: request_sock_TCP: Possible SYN flooding on port 80. Sending cookies.机器很闲连接却失败这个矛盾组合指向的不是业务代码慢而是内核里一条容量有限的队列被打满了。这类问题不在任何一段 Java 或 Go 代码里但从 listen(fd, backlog) 那一行开始它就是后端开发的责任范围。这篇文章把这条链路完整拆一遍三次握手和两条队列的关系、SYN Flood 打的到底是哪个位置、怎么用几条命令定位病因、syncookies 的工作方式和它的代价最后用 hping3 亲手复现一次。1 半连接从哪里来1.1 握手是一次不对等的交易TCP 三次握手本身没有缺陷问题出在它的实现方式上。客户端发 SYN服务端回 SYNACK这一来一回之后服务端必须记住这条 “还没谈成” 的连接——记下四元组、协商好的 MSS、窗口缩放因子等着客户端的第三个包。这段等待期通常只有一个网络往返时间转瞬即逝。服务端之所以要记是因为协议规定了重传万一 SYNACK 在路上丢了服务端得重发所以状态必须留着。留着就得有地方放这个存放处就是半连接队列。等客户端的 ACK 到达连接从半连接队列摘出挪进全连接队列等应用调用 accept() 取走。两条队列的分界线很干净半连接队列里是握手没走完的连接全连接队列里是握手走完了、应用还没领走的连接。前者出问题说明大量连接卡在半路后者出问题说明握手都成了、应用自己接不过来。这两种病的排查方向完全不同混在一起谈就会越调越乱。1.2 队列的容量由谁决定半连接队列的长度不归单一参数管。现代内核里它的实际上限是 tcp_max_syn_backlog 与 listen 时传入的 backlog 等几个值取小后的结果换算公式随内核版本变过细节不必死记。需要记住的是一条工程规律调大半连接队列需要应用和内核两侧同时动只把 tcp_max_syn_backlog 改成 65535而应用的 backlog 还是默认的 128实际生效的仍然是那个 128。全连接队列的规则更直接实际长度等于 minlisten 的 backlognet.core.somaxconn。somaxconn 在不少发行版上默认只有 128这就是 “我明明在代码里写了 listen(fd, 1024) 却没有效果” 的根源——被内核参数悄悄截断了。写 Netty 时 SO_BACKLOG 的值、写 Go 时 net.ListenConfig 里的控制项最终都会汇入这条规则只是框架帮你包了一层。2 SYN Flood 打的是队列不是带宽2.1 攻击的构造方式攻击者要填满半连接队列做法简单得近乎朴素用伪造的源 IP 发送海量 SYN 包然后什么都不做。服务端忠实地为每个请求分配内存、回复 SYNACK、把连接放进半连接队列然后开始等——等到超时才清理。由于源 IP 是假的SYNACK 发到一个根本不存在的地址第三个 ACK 永远不会来。成本结构极度不对称攻击包每个只有几十字节服务端为它付出的内存和等待却是它的数倍。攻击者只需一台普通机器每秒几百个包就能在几十秒内塞满一条容量上千的队列因为半连接的默认超时周期长达一分多钟——协议为网络抖动准备的宽容在这里反过来成了帮凶。队列满后后续所有 SYN 被直接丢弃。正常用户的连接请求和伪造请求混在一起被一起扔掉服务对所有人不可用。此时半连接队列的占用信息不出现在任何常规监控里这就是 “机器很闲但连接失败” 的解释。2.2 全连接队列也会被殃及SYN Flood 之外还有一条容易被忽视的路径。假设攻击流量被 syncookies 挡在半连接阶段之外攻击者换一种打法真实完成握手然后立刻发 RST 或者干脆不发数据。这些连接会顺利进入全连接队列如果应用 accept 的速度跟不上队列照样打满。全连接队列满之后的行为由 tcp_abort_on_overflow 决定两档行为对应的客户端症状差别巨大tcp_abort_on_overflow内核行为客户端表现0默认丢弃最后的 ACK装作没收到连接 “成功” 但发数据无响应表现为卡慢1直接回 RST连接被拒绝表现为快速失败排查连接问题时先分清是 “握手根本没完成” 还是 “握手完成了没人接”这两种症状对应的病根不同治法也不同。后一种的病根多半在业务代码——accept 循环里有慢操作、单线程 accept 跟不上建连速度这才是开发侧真正的战场。3 几条命令定位病因3.1 半连接队列是否打满先看 dmesg。内核在半连接队列溢出时会打日志出现 Possible SYN flooding 字样说明队列已经满了并且 syncookies 在工作。再看丢弃计数netstat -s | grep -i SYNs to LISTEN sockets dropped # 或读 /proc/net/netstat 里的 ListenDrops 字段这个数字持续增长就是实锤要么是攻击要么是突发流量超过了队列容量。3.2 全连接队列是否积压用 ss 看ss -lnt sport :80 # State Recv-Q Send-Q Local Address:Port # LISTEN 0 128 0.0.0.0:80监听套接字的 Recv-Q 是全连接队列当前长度Send-Q 是它的上限。Recv-Q 长期逼近 Send-Q说明应用 accept 的速度跟不上建连速度。注意这个字段与 ESTABLISHED 状态下含义不同——后者表示应用没读走的字节数别混淆。3.3 是攻击还是自己接得慢判定方法看来源分布。用 tcpdump 只抓 SYN 包如果源 IP 高度分散、只发 SYN 不回 ACK多半是伪造源的洪水如果源 IP 集中在正常用户网段更可能是真实并发压力或者应用 accept 太慢。前者要动防御后者要修业务代码里的 accept 逻辑。4 syncookies内核的兜底机制4.1 工作方式syncookies 的思路是把 “记住状态” 变成 “无状态应答”。队列满时内核不再为新的 SYN 分配内存而是把四元组、MSS、时间戳等信息经加密哈希编码成一个序列号作为 SYNACK 的初始序列号发给客户端自己什么都不存。客户端如果是真人会按协议回一个 ACK确认号正好是收到的序列号加一。服务端收到这个 ACK反推出原始信息验证合法性验证通过才真正建立连接、分配资源。伪造源的攻击包因为收不到 SYNACK永远回不了正确的 ACK也就永远占不到服务器的任何内存。4.2 三档语义net.ipv4.tcp_syncookies 有三个取值行为差异需要分清0关闭。队列满时新 SYN 直接丢弃1默认值。仅在半连接队列满时启用平时不影响正常握手2无条件启用。所有连接都走 cookie 编码路径。推荐保持 1。设成 0 意味着完全靠队列容量硬扛遇到攻击风险极高设成 2 防护最强但会让每个连接都付出额外的编码开销正常业务也跟着受影响。4.3 代价与盲区syncookies 不是免费的午餐它有三条明确的代价编码进序列号的空间有限MSS 只能取少数几档窗口缩放、SACK 等 TCP 扩展选项无法完整保存。高带宽高延迟的长肥网络里这些选项缺席会直接拖累吞吐。内核 v2.6.26 之后可以借助 TCP Timestamps 的低位比特部分携带选项信息但需要两端都支持时间戳。它的防护范围只覆盖半连接资源耗尽。带宽被打满、UDP Flood、完成握手后的连接洪水syncookies 一概无能为力。攻击者完全可以用真实源 IP 完成三次握手、然后立刻 RST绕开这层防御去打全连接队列和应用层。部分中间设备对带 cookie 序列号的 SYNACK 报文处理不当可能造成兼容性问题。正因为这些代价内核文档把 syncookies 定位成兜底设施而不是调优手段——正确的目标是通过扩容队列和加快 accept 让 Possible SYN flooding 这条日志消失而不是开着 cookie 硬扛。4.4 配套参数单靠一个开关不够完整的内核配置长这样# 兜底队列满时改用 cookie 应答 net.ipv4.tcp_syncookies 1 # 扩容半连接与全连接队列上限需配合应用侧 backlog net.ipv4.tcp_max_syn_backlog 8192 net.core.somaxconn 8192 # 回收缩短 SYNACK 重传次数加速僵尸半连接清理 # 默认 5 次、指数退避半条连接要挂一分多钟调成 2 大幅缩短 net.ipv4.tcp_synack_retries 2 # 可选让全连接队列溢出时客户端快速失败便于暴露问题 # net.ipv4.tcp_abort_on_overflow 1两点提醒。tcp_tw_recycle 这个老参数在内核 4.12 之后已被移除网上还在流传的调优文章别再照抄。容器环境里 net.core 与 net.ipv4 的多数项属于全局命名空间在容器内改往往报只读文件系统需要宿主机上操作。5 用 hping3 复现一次道理讲完了动手验证才算数。找两台测试机虚拟机即可一台起 HTTP 服务另一台发起攻击# 攻击端伪造随机源 IP洪水模式打 80 端口 hping3 -S --flood --rand-source -p 80 192.168.1.10-S 表示发 SYN 包–flood 让发包速度不设上限–rand-source 为每个包随机一个源 IP。与此同时在服务端观察# 终端一看半连接状态堆积 watch -n1 ss -tan state syn-recv | wc -l # 终端二看内核告警与丢弃计数 dmesg -T | grep -i SYN flooding netstat -s | grep -i SYNs to LISTEN sockets dropped # 终端三验证正常连接是否还能建立 curl -m 3 http://192.168.1.10/把 tcp_syncookies 临时关掉sysctl -w net.ipv4.tcp_syncookies0再重复一遍实验对比效果会更直观关闭时队列打满、curl 超时开启后内核日志出现 Sending cookies、半连接队列不再堆积、正常连接恢复。整个实验五分钟能做完一次就能看到队列打满和 cookie 兜底两种状态的切换比背参数表管用得多。复现之后还能顺带观察自己服务的 accept 表现——把业务代码里的 accept 循环故意加个 sleep看看全连接队列的 Recv-Q 怎么涨上去对两条队列的分工会有更踏实的体感。实验做完记得收尾测试机上的 sysctl 改动如果没有写进 /etc/sysctl.d/ 下的配置文件重启即失效正好当作一次清理。6 防御是有边界的把这套机制从头捋一遍会发现 SYN Flood 的防御是一条多层链条每一层管一段syncookies 兜住半连接队列的溢出tcp_max_syn_backlog 和 somaxconn 提供缓冲余量应用的 accept 速度决定全连接队列的健康而在所有这些之上真正的第一道防线其实在网络边界——上游限速、流量清洗、源地址过滤这些不是内核参数能替代的。对后端开发来说这条链条上属于自己的环节是两个框架配置里 backlog 的取值以及业务代码 accept 与建连之后的处理速度。内核参数更像安全气囊——撞击发生时保住可用性但它的存在不是为了让你放心去撞。理解 syncookies 牺牲了什么TCP 扩展选项、编码开销、防护范围才能判断什么场景该开、什么场景该配合什么手段。把三档语义、两条队列、几个参数各自的管辖范围记清楚下次压测再遇到低负载下连接超时五分钟内就能定位问题出在哪一层。

相关推荐

农业AI自动识别茶叶嫩芽 AI机器人茶园智能采摘 茶芽识别模型训练 第10845期
农业AI自动识别茶叶嫩芽 AI机器人茶园智能采摘 茶芽识别模型训练 第10845期

文章目录怎么用AI自动识别茶芽?这套茶叶嫩芽目标检测数据集适合茶园智能采摘、茶芽识别模型训练数据概况应用价值小白入手训练代码怎么用AI自动识别茶芽?这套茶叶嫩芽目标检测数据集适合茶园智能采摘、茶芽识别模型训练 茶园智能化采摘、茶芽分级是智慧… · 2026/11/8 23:25:42

Pycharm完成+运行
Pycharm完成+运行

1.计算1~100之间的所有奇数之和 2.计算100~500之间所有3倍数的数字之和 3.根据用户输入的数字,判断数字是奇数还是偶数 4.根据用户输入的年龄,判断该用户是否已经成年(>1,成年;否则未成年) 5.根据用户输入的数字… · 2026/11/8 9:44:26

九.数据结构——哈希表(2)
九.数据结构——哈希表(2)

哈希表(1)中我们简单的认识了一下哈希表的相关内容,本章,让我们一起完成哈希表的构建和相关操作的代码实现吧!代码:0.结构体的定义(hash表和hash桶节点)//hash表的默认负载因子 #def… · 2026/11/5 3:10:12

电工证复审难考吗 内部消息告诉你实操考试怎么过
电工证复审难考吗 内部消息告诉你实操考试怎么过

电工证复审难考吗 内部消息告诉你实操考试怎么过 实操考试心里没底怕挂科?你不是一个人。我跟你说,很多人拿到电工证后,复审时才发现, 电工证复审难考吗… · 2026/11/10 23:50:42

成都汽车电工证怎么考外省证怎么转电子证书怎么查
成都汽车电工证怎么考外省证怎么转电子证书怎么查

成都汽车电工证怎么考外省证怎么转电子证书怎么查 之前考的证在外省能不能转过来?别急,今天就给你讲清楚怎么把外省的电工证转到成都,并且怎么查电子证书,避免踩坑。 成都汽车电工证怎么考?… · 2026/11/10 23:50:42

郑州中铁特种工招聘良心建议:怕考不过白交培训费?这样避坑
郑州中铁特种工招聘良心建议:怕考不过白交培训费?这样避坑

郑州中铁特种工招聘良心建议:怕考不过白交培训费?这样避坑 怕考不过白交培训费?这几乎是每个想考特种作业证的工友心里最怕的事。特别是像郑州中铁特种工招聘这类项目,对证书要求严格,培训费动辄上千,如果没考过,钱就打水漂了。别急,我这有… · 2026/11/10 23:50:42

电工证哪里可查真伪?2026河南最新政策全解析
电工证哪里可查真伪?2026河南最新政策全解析

电工证哪里可查真伪?2026河南最新政策全解析 不知道去哪报名怕被中介坑?2026年河南最新政策已经落地,很多人还停留在“找熟人介绍”或“网上随便找家机构”的状态,结果不仅花了冤枉钱,还办了个假证。别慌,这篇文章帮你从头理清流程,告诉你电工… · 2026/11/10 23:50:42

明港特种工证书多久拿证?找工作必须知道的真相
明港特种工证书多久拿证?找工作必须知道的真相

明港特种工证书多久拿证?找工作必须知道的真相 你现在正愁找不到工作,手里又没有特种作业操作证,这事儿你不是第一个,也不是最后一个。特别是在河南明港这种工业聚集区, 特种作业证 几乎是所有工程类岗位的“入场券”。而你最关心的,就是… · 2026/11/10 23:50:42

阳信电工证哪里考的好 低压电工证全国通用怎么考
阳信电工证哪里考的好 低压电工证全国通用怎么考

阳信电工证哪里考的好 低压电工证全国通用怎么考 学历不高怕报不上名,这事儿我懂,去年我帮驻马店一家中小施工企业的老李办电工证时,他也跟我这么说。后来他考下来了,现在在工地上干得风生水起。阳信电工证哪里考的好?这个问题其实很多人都问过,但关键… · 2026/11/10 23:49:42

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/10 2:16:10

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/10 17:46:39

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/10 17:11:43

丹寨电工证怎么考?内部消息透露报考条件和流程
丹寨电工证怎么考?内部消息透露报考条件和流程

丹寨电工证怎么考?内部消息透露报考条件和流程 急需特种作业证才能上岗找工作,这是很多电工朋友最真实的焦虑。尤其是像丹寨电工证这样的证书,直接影响你的职业发展和薪资待遇。但你知道吗?很多人都在报考过程中踩坑,有的甚至花了几千块最后白忙一场。今… · 2026/11/10 0:00:13

成都建筑电工证办理郑州报考避坑指南
成都建筑电工证办理郑州报考避坑指南

成都建筑电工证办理郑州报考避坑指南 证书过期了不知道怎么复审延期?别慌!这篇文章手把手带你解决成都建筑电工证办理的难题,顺便避掉郑州报考的那些坑。不管你是刚拿到证的新手,还是准备复审的老电工,这波干货都别错过。… · 2026/11/10 0:00:13

梅州低压电工证怎么考?怕被中介坑?手把手教你全国通用流程
梅州低压电工证怎么考?怕被中介坑?手把手教你全国通用流程

梅州低压电工证怎么考?怕被中介坑?手把手教你全国通用流程 你是不是正为梅州低压电工证发愁?不知道去哪报名,怕被中介骗钱,又担心证书是不是全国通用?其实,这些顾虑都是正常人会有的。今天我就从一个在开封房建工程一线干了几年的电工角度,手把手教你… · 2026/11/10 0:00:13

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 20:19:29

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 19:22:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 17:00:47

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码