先跟你说句大实话:高防服务器清洗流量的时候丢包,这事儿太常见了。不是你的设备有问题,也不是机房在搞鬼,而是高防机制本身就自带这个毛病。你想啊,所有的流量先经过一道清洗设备,正常的放过去,攻击的拦下来,这个"判断"的过程本身就需要时间,也需要规则。规则紧了,误杀就多;规则松了,攻击就漏过去。丢包,本质上就是误杀------清洗设备把你的正常用户当成了攻击流量,给拦了。
但理解归理解,业务丢包就意味着用户卡顿、视频加载不出来、游戏掉线、交易失败,这是要命的事。今天咱们就掰扯掰扯,遇到清洗丢包到底该怎么办,从原因到排查再到解决,一步步说清楚。
先搞清楚:丢包发生在哪个环节?
很多人一发现丢包就去找机房吵架,说你们设备不行。但其实丢包可能发生在好几个地方,你得先定位。
第一种是入向丢包。攻击流量打过来的时候,机房的边界路由器或者清洗设备扛不住了,直接开始随机丢包。这种情况通常表现为:攻击一来,所有用户都卡,不管是正常用户还是攻击来源,一视同仁地被丢。这时候你看服务器的CPU和带宽,可能根本没跑满,但就是丢包严重。为什么?因为丢包发生在清洗设备上,流量还没到你的服务器就被扔掉了。
第二种是清洗策略导致的定向丢包。清洗设备识别出某个IP段或者某个协议类型有问题,比如判断某个源IP在扫端口,就会把这个IP的所有包都丢掉。如果你的正常用户恰好用了类似的特征------比如公司出口IP是固定的,大量用户从同一个IP访问------就可能被误判为攻击源,整批用户被丢。
第三种是回注丢包。清洗完的干净流量要"回注"到你的服务器所在的内网,这个回注链路如果带宽不够或者路由有问题,也会丢包。这种丢包的特征是:攻击已经过去了,清洗设备也显示没有丢包记录,但你的服务器收包量明显对不上。
你得先把丢包的类型搞清楚,才能对症下药。最简单的方法是让机房给你看清洗设备的日志,哪一秒丢了哪些包、丢包原因是什么,正规设备都会记录。
最直接的解决办法:调整清洗阈值和策略
这是核心中的核心。清洗设备之所以会误杀,是因为它的触发阈值设得太低了。
举个例子,你服务器正常情况下每秒有1000个新连接,你把清洗阈值设成了1200。某天你的网站搞了个活动,正常用户涨到了1500个新连接每秒,这时候清洗设备一看,哟,超标了,立刻启动防御,开始丢包。但实际上根本没有人攻击你,只是正常流量上涨了而已。
这种情况太普遍了。很多机房为了省事,给你设一个固定的静态阈值,不管你的业务是涨是跌。你要做的第一件事,就是联系机房,把你的业务正常流量基线告诉他们,让他们把清洗阈值调高到正常峰值的1.5到2倍。比如你高峰期正常跑到200M带宽,阈值就设在300M-400M。这样一般的业务波动不会触发清洗,只有真正的攻击来了才会启动。
还有一个更高级的做法:开启学习模式。现在主流的清洗设备都有自学习功能,它会观察你一周到两周的流量特征,分析出你的正常流量模式、协议分布、包大小特征等等,然后自动生成一套专属的防御策略。这个比手动调阈值靠谱多了,但对机房的技术能力要求比较高。如果机房跟你说"我们没有这个功能",那你可能该考虑换一家了。
白名单机制:把你的重要用户保护起来
调整阈值只能解决一部分问题。有些丢包不是因为流量大小超标,而是因为包的特征被误判了。比如你的用户用了某些特殊的VPN、代理,或者你用的CDN回源IP段恰好跟某个攻击源IP段重叠了,清洗设备就会把这些包当成恶意的给拦了。
这时候白名单就是救命的东西。把你信任的IP段、你的核心合作伙伴的IP、你的CDN回源节点IP,全部加到清洗设备的白名单里。白名单里的流量不经过清洗规则检查,直接放行。
但是注意,白名单不能乱加。有些人图省事,把自己整个IP段都加进去了,结果攻击者只要伪造这个IP段的包,就能直接穿透清洗设备打到你的服务器上。白名单的原则是"能不加就不加,必须要加的时候加最小的范围"。
另外,协议级别的白名单也很重要。比如你的视频站主要用的是TCP 443端口做HTTPS,那你可以把UDP的其他端口全部设置成低优先级或者直接限速。很多攻击用的是UDP反射放大,把UDP端口限死,攻击量能直接少一大半,而你的正常业务基本不受影响。
换个思路:把清洗模式从"严格"改成"正常"或者"宽松"
这个很多人不知道。清洗设备通常有好几种防御模式,严格模式、正常模式、宽松模式,或者叫深度清洗、快速清洗之类的。
严格模式会检查每一个包的每一个字段,精确度最高,但处理速度慢,也最容易误杀。正常模式只检查关键特征,速度更快,误杀率低一些,但可能漏掉一些变种攻击。宽松模式基本只拦最明显的攻击,比如流量型的大包攻击,对小流量的扫描和CC攻击不怎么管。
如果你的业务对实时性要求很高,比如直播、游戏、实时通讯,那就别用严格模式。宁可漏掉一些小攻击,也不能误杀正常用户。你可以跟机房商量,平时用正常模式,等真的遇到大规模攻击的时候,再手动切到严格模式。很多机房为了省事,默认给你开严格模式,你问都不问,结果一直丢包一直难受。
TCP参数优化:从服务器端缓解丢包的影响
有些丢包你没办法完全避免,比如遇到超大流量的混合型攻击,清洗设备只能尽力而为,丢一些包是难免的。这时候你可以从服务器端做一些优化,让丢包对用户体验的影响降到最低。
TCP的快速重传和选择性应答是两个关键参数。开启这两个功能之后,客户端和服务器之间丢包了,不需要等到超时再重传,能很快补上。对于视频站来说,这意味着用户可能只是画面卡顿一下,而不是直接断线。
还有TCP的初始拥塞窗口,调大一点可以让传输更快地进入高速状态。这个跟丢包本身没有直接关系,但能减少因为丢包导致的重传次数。
Nginx或者其他Web服务器上,可以开启gzip压缩和缓存。压缩能减少传输的数据量,也就降低了丢包的影响面;缓存能让用户直接从边缘节点拿数据,绕开你的源站清洗设备。很多视频站把大部分流量推到CDN上,源站只处理少量动态请求,这样就算源站的高防偶尔丢包,影响也极其有限,因为大部分用户根本不会打到源站。
最后总结一下
高防服务器清洗丢包,本质上是安全性和可用性之间的平衡问题。你想要绝对的安全,就难免误杀;你想要完美的用户体验,就别指望能把所有攻击都拦得干干净净。
作为运营方,你要做的是找到那个平衡点。把阈值调到合理的范围,用好白名单,选对清洗模式,优化服务器参数,实在不行就换机房。别等到被攻击的时候才想起来研究这些问题,平时就做好准备,才能在真正的战斗中活下来。