SYN Flood防护中,先做连接验证再做限速,验证是前提,限速是兜底,顺序错了,不仅挡不住攻击,还会把正常用户一起关在门外。
网络世界里,SYN Flood攻击算是历史最悠久、生命力也最强的DDoS手法之一,它盯上的是TCP协议三次握手的漏洞服务器发出SYN-ACK后,要留一块内存等客户端回ACK,攻击者假装要握手,发一堆SYN包然后消失,服务器的连接表瞬间被塞满,新用户再怎么SYN也进不来。
这就像一家餐厅,座位全被只点杯水就占着桌子不走的人占满了,服务器服务器做防护,思路不外乎两种:给每个进来的人先验明正身(验证),或者干脆限流,只放行一定数量的客人(限速),问题来了,进门的时候,是先查身份证,还是先按人数往外赶?
答案是先验证,验证能区分谁是真人谁是假鬼,限速不能,这是两者最本质的区别,也是一切讨论的起点。
为什么要先验证限速解决不了“真假”问题
有些团队习惯遇到攻击先拉限速,觉得把每秒新建连接数压到极低,服务器就安全了,这个思路在极端情况下有效,但副作用也很明显,假设你的正常业务峰值是每秒几千个新连接,攻击一来,你直接限到每秒200,攻击包确实是进不来了,你的真实用户也进不来了,这在游戏圈有个专有名词叫“误伤”,但在舆情上,这叫“服务中断”。
限速的代价是拖垮正常业务
具体场景很现实,一个电商网站正在搞大促,流量本来就比平时高出数倍,这时候如果运维人员接到告警,条件反射式地敲下iptables规则,把SYN包速率限到平时的一半,会造成什么后果?库存页加载不出来,购物车提交失败,支付回调超时,攻击者其实只用了很小规模的流量,就让你自己把自家大门给焊死了。
业内专家指出,在处理资源型攻击时,误伤正常用户的代价往往比攻击本身更严重,因为攻击总有结束的时候,但用户流失了很难再回来,限速更像是一个粗暴的防洪闸,它不看下来的是洪水还是自来水,只要水量大,一律截住。
验证机制能在攻击中分辨真伪
验证的思路完全不同,它的核心是给客户端出题,只有能正确回答的,才被认为是真实存在的用户,这个机制在Linux内核里对应的是SYN Cookie,在常见的防护设备上对应的是TCP Proxy,也就是代理握手。
当客户端发出SYN请求,服务器不立即分配资源,而是返回一个经过特殊算法生成的Cookie,正常用户的操作系统会自动处理这个Cookie,并正确回应,从而完成握手,而攻击者使用的工具通常是无状态的,它们只会盲目地发SYN包,根本不会处理和回应Cookie,这样一来,假连接在第一步就被过滤掉了,真实的连接则不受任何影响,验证的本质是让流量自己证明自己。
哪些场景需要先验证高并发业务让限速无从下手
行业共识认为,判断标准很简单:如果你的业务每秒新增连接数波动较大,或者存在明显的流量高峰,那就不能只用限速,限速需要一个明确的阈值,而动态业务最难确定的就是阈值。
社交App的深夜热点与抢票场景
社交平台常常在某个瞬间突然涌入大量新连接,比如某个明星半夜发了条动态,粉丝瞬间涌入刷新,如果此时限速规则卡死了新建连接频率,用户会不断看到“网络开小差”“加载失败”的提示,更麻烦的是,这类新闻事件往往没有预兆,限速策略根本来不及调整。
验证就没有这个问题,TCP Proxy模式下,新连接来了先过验证,是真人就放行,是僵尸就丢弃,即使是几万倍的流量冲击,服务器实际需要处理的完成验证的连接数,并没有超过系统能承受的范围,数据的核心指标是“有效连接”,而不是“总连接数”。
对SYN Cookie与代理机制的误读
很多运维人员有一个错觉,觉得验证流程会拖慢访问速度,说实话,SYN Cookie增加的那个计算和校验环节,在千兆乃至万兆网卡环境下,消耗的时间是微秒级的。
代理验证可能稍微多一步,但防护设备普遍支持硬件加速,相比之下,网络延迟、DNS解析、后端应用处理所花费的时间,远远大于验证环节的开销,如果后端接口本身要跑上百毫秒,纠结验证少用几微秒,属于抓小放大,把验证理解了,其实它就是给每个来访者发一个临时通行证,有证才能进门,没证就在门外等着,这个动作本身不需要多少资源,真正耗费资源的是让没证的也在里面逛。
限速适合放在什么位置兜底、防突刺、防穿透
先验证不代表限速没用,限速在防护体系里是兜底的角色,是最后一道保险丝,它负责解决验证机制还没来得及处理的“漏网之鱼”,比如验证机制本身也是要消耗运算资源的,如果有超大流量瞬间涌到防火墙,防火墙连计算Cookie的时间都没有,这时候,一个粗粒度的限速规则就很有必要它确保物理链路不被击穿。
防护链路中限速的三个关键档位
- 第一道限速:攻击流量进机房前。 这个一般在ISP或者高防机房的入口路由器上做,按IP或按端口限速,目的不是区分真假,而是防止带宽被打满。
- 第二道限速:防护设备接入层。 这道限速看的是新建连接速率,如果每秒超过某个体量,比如几十万PPS,直接丢包,防止设备本身被撑爆。
- 第三道限速:高性能应用层策略。 比如synproxy已经验证过的连接,再按源IP做一个频率控制,防止单IP异常发包。
限速参数设置和具体配置路径
以Linux服务器自带iptables为例,最常见的SYN限速命令是:
iptables -A INPUT -p tcp --syn -m limit --limit 50/s --limit-burst 100 -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP
第一条规则限制了每秒最多放行50个SYN包,瞬间峰值允许100个,第二条规则负责丢弃超出的部分,这套配置在小型业务上能应对小规模攻击,但对分布式大流量基本无能为力,在大型高防系统里,限速更多是内核态的数据平面基于DPDK或XDP实现的,策略同样遵循这个逻辑,直接说结论:限速是最后的大坝,任何时候都要见底,但你不能指望大坝来解决水质问题。
推荐的执行顺序验证前置,限速后置,链路各自独立
聊完原理,落到实际的防护部署上,通用的架构是三层。
- 第一层,DDoS高防清洗中心。 流量先到这里完成第一道清洗,核心处理步骤就是TCP Proxy验证,所有SYN包先接受代理验证,验证通过的流量才被转发到源站,攻击流量在这层就直接被剥掉了,这个过程叫做“回源”,这一层做的是真正的验证,也是考验高防服务器SYN Flood拦截效果的关键点。
- 第二层,源站本地内核防护。 高防清洗过后的流量相对干净,但保不齐有绕过清洗的漏网之鱼,或者来自内网的异常扫描,这时开启Linux内核的syncookies功能作为保险,sysctl参数设置如下:
sysctl -w net.ipv4.tcp_syncookies=1 sysctl -w net.ipv4.tcp_max_syn_backlog=8192 sysctl -w net.ipv4.tcp_synack_retries=2
tcp_syncookies=1开启Cookie验证,tcp_max_syn_backlog调大半连接队列,tcp_synack_retries降低重试次数,加速失效连接的回收,这个地方的本质是:验证为主,限速为辅助。
- 第三层,接入层或负载均衡器。 Nginx或者LVS上还会再做一次简单的并发连接限制,这层主要防止回源流量里某个单IP异常占用过多连接,相比之下更偏向于安全策略,而非DDoS对抗,当你的资源被一个特定来源拖垮时,限速就有它的用武之地了。
服务器性能不同,验证和限速的策略也不同
你的服务器配置决定了你能不能“先验证”,如果你手里是一台1核1G的入门级云主机,又没买高防,这时候执意要跑完整的TCP Proxy验证,CPU会先把资源耗尽,验证本身的成本比攻击还高。
小内存主机更要优先限速
小内存主机最怕的是半连接队列被塞满,这种情况下,系统层面只开syncookies就能达到验证目的,而把执行重点放在限速上宁可让所有人连不上,也不能让服务器死机,死机是最后的结果,只有系统活着才有继续操作的可能,这是保护自己的一种生存法则。
这类用户在百度搜索“服务器被SYN Flood怎么办”时,得到的标准答案往往也是先从单机iptables限速做起,这个答案本身没问题,但只适用于防御小规模攻击的场景,你需要清楚,如果攻击流量超过服务器所在机房的带宽上限,限速做得再完美,数据包也进不来。
高防服务器如何做SYN Flood防护方案对比
这个问题在网上被高频讨论,用户通常关心的是价格和性能之间的取舍,选高防服务器,本质上买的就是机房入口的那套“先验证”能力,高防机房的流量清洗设备,一般能扛住数百Gbps的流量,这意味着攻击流量在进入你的源站之前,就被TCP Proxy完成了验证,你源站上感觉到的只是少量正常请求,压根不需要额外做限速。
对比之下,没接入高防的源站“裸奔”在公网上,如果遭遇大流量SYN Flood,自己动手配置iptables限速,效果往往和把脑袋埋在沙子里差不多,带宽、CPU、内存全面吃紧,应用层早就没响应了。
运维里最难的不是技术,是先后顺序的判断
很多公司的线上事故,不是没有防护,而是防护策略互相对冲,安全团队设了验证,业务团队嫌麻烦又改了参数对象,结果验证模块没生效;或者运维团队为了求稳,设置了极低的新建连接限速,结果攻击一来,正常用户先被限掉。
这里有一个中间层可以绕开,看你业务能不能容忍一个“验证观察期”,如果有状态防火墙的会话同步功能,或者负载均衡的TCP健康检查功能,完全可以让这些模块先代替网关完成验证,再把连接移交后端的真实服务器,这个方案在客户真实场景中被验证过,可以大大节省服务器CPU资源,对抗小包型SYN Flood攻击尤其见效它利用更低的性能消耗实现了验证的效果。
观察指标很简单,就看总连接数、半连接数、CPU使用率三条曲线,如果半连接数飙升而总连接数不动,说明攻击正在填满队列,验证没能正常展开工作,需要立刻检查验证模块是否被限速规则压住了,如果总连接数和CPU同时飙升,说明验证已经放行了大量恶意流量,要检查验证算法是否被绕过,或者回源策略是否配置错误。
别再让限速打头阵了。先验证,后限速,这个顺序要刻在防护方案里验证负责区分真假用户,限速负责保护系统下限,把攻击流量的特性和防御策略之间的关系理顺,服务器抗压能力自然就上去了,机器的算力是固定的,但合理的防护逻辑可以在同样配置下释放成倍的战斗力。
SYN Flood防护常见问题解答
Q: SYN Cookie验证真的能完全防止SYN Flood吗?
A: SYN Cookie能有效缓解通过伪造源IP发起的盲SYN攻击,因为伪造方通常不回应Cookie,这个机制主要验证客户端是否真的活着,但对于基于真实IP的攻击,攻击者也能正常回应Cookie,这种情况下就需要配合IP黑白名单和限速策略共同处理。
Q: 高防服务器拦截SYN Flood的原理是什么?
A: 高防机房在流量入口部署专门的清洗设备,常采用TCP Proxy或TCB(传输控制块)复用技术,干净的请求会建立完整TCP连接,设备再向源站发起新的TCP连接,源站始终接收的是可信的完整连接,用户数据不经过源站网卡,即使有超大流量,源站感受到的也只是正常负载。
Q: 业务正在被攻击时,临时调整限速参数还来得及吗?
A: 来得及,但不建议手动改,多数情况下,手动登录服务器敲命令会消耗宝贵的故障处理时间,同时步骤之间还容易出错,更稳妥的方式是提前在云控制台或运维系统里预设几套防护模板,并明确触发条件,比如A模板用于攻击流量较小的情况(每秒5万SYN包以下),B模板适用于大流量攻击(每秒50万SYN包以上),切换时只触发模板,减少判断环节出错,国内的大型云厂商一般都提供这种等级防护的配置入口。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/785559.html


