被人DDoS攻击了,分析一下原理和防护

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cyzshenzhen/article/details/97662694

一、行业现象

1.1 为什么要攻击?

常见的,一个是同行恶意竞争,一个是敲诈勒索。

无论是传统行业的线下门店,还是互联网行业的门户网站、APP产品,都存在着竞争关系,争相获得更多客源,究其目的,无非是为了赚钱。

1.2 被攻击有什么症状?

传统行业线下门店来讲,你开了一家饭店,正正经经做生意,生意也还不错。这两天经常有一大堆人进饭店,但是不点菜就占着位置不消费,或者动不动有乞丐在门口守着,有人在饭菜里面吃到虫子等等,这就是传统行业的恶意竞争。

互联网行业同理,你的门户网站或者APP产品一直正常运行,也没有做推广导流大量用户,但是系统突然无法访问,或者卡的要死,技术检查说是服务器流量暴增,导致服务器崩溃,阿里云ECS被拉入黑洞,无法访问。

用户无法正常使用你的产品,自然会觉得你的系统不稳定,导致用户流失。

1.3 恶意竞争的对手一般是不会攻击,那他是怎么做到的?

  • “发单者”,发起恶意竞争的对手,或者是敲诈勒索的主,即“老板”;
  • “攻击者”,收到发单者的订单,通过专业技术手段对目标进行攻击操作,即“项目经理”;
  • “肉鸡供应商”,即给攻击者提供资源的供应商,资源即“捣乱者”;

攻击产业简述.png

另,本图只是简单介绍攻击产业链,还有其他角色此处就不做详细介绍,后续我们再出专题讨论。

1.4 哪些行业更有可能被攻击?

  • 游戏(棋牌、网游私服)类
  • 某颜色类网站类
  • 金融类
  • 虚拟货币类

简单分析下上述类行业,他们至少有一个非常关键的共同点:有钱!

二、常见攻击方式

2.1 DDoS攻击

DDoS攻击是利用网络上被攻陷的电脑作为“肉鸡”,通过一定方式组合形成数量庞大的“僵尸网络”,采用一对多的方式进行控制,向目标系统同时提出服务请求,超出服务器的承载量,导致服务器崩溃的攻击技术。

简单的说,就是你的饭馆最多承载100个客人在店里面消费,当被人家恶意攻击时,突然有很多人往店里挤,不光是从大门进,还有后门,爬窗,各式各样的,导致店里没办法控制,并且人满为患,真正的消费者无法进入饭店消费,最后歇菜。

一般DDoS攻击有 NTP Flood、ICMP Flood、UDP Flood、SYN Flood、DNS Query Flood 等,由于专业描述过于复杂,此处不做详细介绍。

2.2 cc攻击

cc攻击主要分代理cc和肉鸡cc,其目的都是通过控制大量的请求,访问受害主机的合法网页或接口,导致服务端应用层(如java的tomcat)无法正常响应,服务器CPU长时间处于100%状态,网络带宽被占满,数据库被拖死等情况。

简单的说,当你的饭馆被恶意cc攻击时,突然来了很多客人,他们虽然不爬窗不抄后门,但是仍然把你的大门给挤满堵死,真正的客人无法进入,人又多,饭馆的服务员忙不过来,最后歇菜。

这种攻击技术性含量高,见不到真实源IP,见不到特别大的异常流量,但服务器就是无法进行正常连接。所以cc攻击成本也相对高一些,如果不是真的有什么深仇大恨,一般不会持续多久。

三、DDoS攻击防护

3.1 理解DDoS攻击原理

首先我们要知道,最基础的网站部署是怎么实现的,用户通过浏览器访问域名,域名再转发到你的源服务器。

基础的网站部署.png

然后我们要了解DDoS攻击原理,他们攻击的,是你的源服务器,也就是你的饭馆门店。因为一般域名都是显示指向服务器的ip,也就是你的门店定位是暴露给客户的,所以攻击者是可以直接找到门店进行攻击。

3.2 前置路由服务器,保护源服务器

所以要防护DDoS攻击第一步,是要保护好我们的源服务器,不让对方知道我们的源服务器地址,即加一个前置路由服务器,一般我们是使用NGINX、Apache等软路由,部署如下图。

保护源服务器部署.png

3.3 路由服务器被打死怎么办

上述架构图中,只是保证了源服务器不被影响,但是前置路由服务器被打死,用户依然访问不了,所以有的朋友已经想到了,我们再换一个路由服务器,部署如下图。

多路由服务器部署.png

但这种方式,必须要人工将域名转发配置重新改成新的路由服务器,并且域名转发最慢可能要10分钟,所以存在部分用户短时间内无法正常访问的弊端。

3.4 高富帅的完美做法

前面讲到的多路由服务器的方式,存在明显的体验差的弊端,那么有没有更好的方式呢?当然有,就是费点钱。比如阿里云,就有他们自己的高防服务,20000元包月,打底30G流量,超出的流量按量付费。
举个例子,这个月,你被攻击了5次,每次平均流量时100G,那么也就是说,你要额外再出 70G * 5 * 平均小时 的额外流量费用。(我一个搞游戏的朋友被同行恶意攻击,一个晚上的功夫,就是1万多的超额费用。。。),部署架构图如下。

阿里云高防IP部署.png

阿里云DDoS报价.png

3.5 想要有阿里云高防IP的服务又想节省成本

阿里云高防IP的做法,其实就是自己做了一套清洗规则,我们百度阿里云高防可以看到,很多竞价排名在前面的都是一些机房,他们的做法跟阿里云的做法原理也是差不多的,并且价格要比阿里云便宜不少,那么靠谱吗?

竞价排名嘛,羊毛出在羊身上,所以对于他们的同行来说,价格肯定也是偏高的,稳不稳定得看口碑了。我们之前做互联网金融的时候,被别人敲诈勒索,最后也是找到一个比较靠谱的机房做的防护,他们24小时在线查处问题,后面也一直处于比较清静的状态。

四、cc攻击防护

4.1 理解cc攻击原理

cc攻击不同于普通的DDoS攻击,玩的是合法的网络请求,也就是说他就是通过域名网页请求过去的,也是因为他本身就不需要绕过门面直接攻击源服务器,那么即使加上普通的前置路由服务器,也是没用的。

既然不需要隐式保护源服务器,那要怎么处理呢?

一般cc攻击都是有策略的,通过识别出当时攻击的策略,防护修改对应的应对策略即可。(当然,没点专业技术能力的,这个应对策略也是做不到的)

4.2 如何找到专业的cc攻击策略防护

同样,也是使用类阿里云的高防IP,当服务器被攻击时,会提示你的服务器当前在被什么策略的cc攻击,对应的人为在高防管理后台修改防护策略即可应对。

另一个就是前面说的机房,他们也是同样的方式,只是因为接入了机房,被攻击的对象就是他们的服务器,所以就让他们机房自己修改策略应对就好了,你只需要观察你的客户是否可以正常访问即可。

五、防护方式用户体验与成本对照表

防护方式 用户体验 价格成本 人工成本 稳定程度
多前置路由服务器 部分用户短时间内无法访问,体验差 主备模式,备用可以需要时再临时适用,成本较低 略高 一般
阿里云高防IP 用户体验基本没有感知 2万保底30G,成本非常高 较少 稳定
靠谱IDC机房 用户体验基本没有影响 3千左右保底50G,免费弹性到100G,成本较低 较少 稳定

My Blog

blog.guijianpan.com

技术交流

weixin-x175.jpg

展开阅读全文

帮忙分析一下原理

07-28

[Timer1.Timer] rn:00401E74 0002 LargeBos ;IDE beginning of line With 02 Byte codes rn:00401E76 0005 LargeBos ;IDE beginning of line With 05 Byte codes rn:00401E78 4BFFFF OnErrorGoto ; rn:00401E7B 0034 LargeBos ;IDE beginning of line With 34 Byte codes rn:00401E7D 0478FF FLdRfVar ush LOCAL_0088 rn:00401E80 080800 FLdPr ;[SR] = [STACK_0008] rn:00401E83 0D58000300 VCallHresult ;Call ptr_004018C4 rn:00401E88 F503000000 LitI4 ush 00000003 rn:00401E8D F500000000 LitI4 ush 00000000 rn:00401E92 F500000000 LitI4 ;Push 00000000 rn:00401E97 F500000000 LitI4 ;Push 00000000 rn:00401E9C F500000000 LitI4 ;Push 00000000 rn:00401EA1 F5FFFFFFFF LitI4 ;Push FFFFFFFF rn:00401EA6 6C78FF ILdRf ;Push DWORD [LOCAL_0088] rn* * * * * * * * * * * Reference To:user32.SetWindowPos rn| rn:00401EA9 0A06001C00 ImpAdCallFPR4 ;Call ptr_00401B0C; check stack 001C; Push EAX rn:00401EAE 3C SetLastSystemError ;Kernel GetLastError rn:00401EAF 000E LargeBos ;IDE beginning of line With 0E Byte codes rn:00401EB1 080800 FLdPr ;[SR] = [STACK_0008] rn:00401EB4 063400 MemLdRfVar ;Push [SR] + STACK_0034 rn* * * * * * * * * * * Reference To:user32.GetCursorPos rn| rn:00401EB7 0A07000400 ImpAdCallFPR4 ;Call ptr_004019CC; check stack 0004; Push EAX rn:00401EBC 3C SetLastSystemError ;Kernel GetLastError rn:00401EBD 001D LargeBos ;IDE beginning of line With 1D Byte codes rn:00401EBF 080800 FLdPr ;[SR] = [STACK_0008] rn:00401EC2 8A3800 MemLdStr ;Push DWORD [[SR] + 0038] rn:00401EC5 080800 FLdPr ;[SR] = [STACK_0008] rn:00401EC8 8A3400 MemLdStr ;Push DWORD [[SR] + 0034] rn* * * * * * * * * * * Reference To:user32.WindowFromPoint rn| rn:00401ECB 5E08000800 ImpAdCallI2 ;Call ptr_00401A0C; check stack 0008; Push EAX rn:00401ED0 7178FF FStR4 ;Pop DWORD [LOCAL_0088] rn:00401ED3 3C SetLastSystemError ;Kernel GetLastError rn:00401ED4 6C78FF ILdRf ;Push DWORD [LOCAL_0088] rn:00401ED7 7170FF FStR4 ;Pop DWORD [LOCAL_0090] rn:00401EDA 000F LargeBos ;IDE beginning of line With 0F Byte codes rn:00401EDC FCED58FF FLdVar ; rn:00401EE0 0448FF FLdRfVar ;Push LOCAL_00B8 rn:00401EE3 FD9F LdPrVar ; rn:00401EE5 FE9B0900 LateMemSt ; rn:00401EE9 000F LargeBos ;IDE beginning of line With 0F Byte codes rn:00401EEB FCED38FF FLdVar ; rn:00401EEF 0448FF FLdRfVar ;Push LOCAL_00B8 rn:00401EF2 FD9F LdPrVar ; rn:00401EF4 FE9B0A00 LateMemSt ; rn:00401EF8 0019 LargeBos ;IDE beginning of line With 19 Byte codes rn:00401EFA F5FF000000 LitI4 ;Push 000000FF rn:00401EFF 0428FF FLdRfVar ;Push LOCAL_00D8 rn* * * * * * * * * * Reference To - > msvbvm50.rtcSpaceVar rn| rn:00401F02 0A0B000800 ImpAdCallFPR4 ;Call ptr_0040100C; check stack 0008; Push EAX rn:00401F07 0428FF FLdRfVar ;Push LOCAL_00D8 rn:00401F0A 60 CStrVarTmp ; rn:00401F0B 316CFF FStStr ;SysFreeString [LOCAL_0094]; [LOCAL_0094] = Pop rn:00401F0E 3528FF FFree1Var ;Free LOCAL_00D8 rn:00401F11 0009 LargeBos ;IDE beginning of line With 09 Byte codes rn:00401F13 6C6CFF ILdRf ;Push DWORD [LOCAL_0094] rn:00401F16 4A FnLenStr ;vbaLenBstr rn:00401F17 7168FF FStR4 ;Pop DWORD [LOCAL_0098] rn:00401F1A 002C LargeBos ;IDE beginning of line With 2C Byte codes rn:00401F1C 6C68FF ILdRf ;Push DWORD [LOCAL_0098] rn:00401F1F 6C6CFF ILdRf ;Push DWORD [LOCAL_0094] rn:00401F22 0424FF FLdRfVar ;Push LOCAL_00DC rn:00401F25 34 CStr2Ansi ;vbaStrToAnsi rn:00401F26 6C24FF ILdRf ;Push DWORD [LOCAL_00DC] rn:00401F29 6C70FF ILdRf ;Push DWORD [LOCAL_0090] rn* * * * * * * * * * * Reference To:user32.GetClassNameA rn| rn:00401F2C 5E0C000C00 ImpAdCallI2 ;Call ptr_00401A8C; check stack 000C; Push EAX rn:00401F31 7178FF FStR4 ;Pop DWORD [LOCAL_0088] rn:00401F34 3C SetLastSystemError ;Kernel GetLastError rn:00401F35 6C24FF ILdRf ;Push DWORD [LOCAL_00DC] rn:00401F38 046CFF FLdRfVar ;Push LOCAL_0094 rn:00401F3B FC58 CStr2Uni ;vbaStrToUnicode rn:00401F3D 6C78FF ILdRf ;Push DWORD [LOCAL_0088] rn:00401F40 7174FF FStR4 ;Pop DWORD [LOCAL_008C] rn:00401F43 2F24FF FFree1Str ;SysFreeString [LOCAL_00DC]; [LOCAL_00DC] = 0 rn:00401F46 000E LargeBos ;IDE beginning of line With 0E Byte codes rn:00401F48 6C74FF ILdRf ;Push DWORD [LOCAL_008C] rn:00401F4B F500000000 LitI4 ;Push 00000000 rn:00401F50 C7 EqI4 ;Push (Pop1 == Pop2) rn:00401F51 1CE300 BranchF ;If Pop = 0 Then ESI = 00401F57 rn:00401F54 0003 LargeBos ;IDE beginning of line With 03 Byte codes rn:00401F56 13 ExitProcHresult ; rn:00401F57 001C LargeBos ;IDE beginning of line With 1C Byte codes rn:00401F59 046CFF FLdRfVar ;Push LOCAL_0094 rn:00401F5C 4D14FF0840 CVarRef ; rn:00401F61 0428FF FLdRfVar ;Push LOCAL_00D8 rn 论坛

没有更多推荐了,返回首页