什么是ddos攻击,如何低成本防御ddos攻击?

若干年前读大学时候我接触的第一门专业课是“网络基础课”,还记得第一节课时老师就以ping命令为切入点介绍DDoS攻击,当时还专门告诉我们要念成“D-D-O-S”,而非“D-DOS”。

时至今日,DDoS攻击依然是网络系统所面临的主要威胁之一,今天,我们就来详细聊聊。

目录

一、什么是DDOS攻击

二、DDOS攻击用途

三、DDOS攻击原理

四、DDOS攻击种类

五、常见ddos攻击

5.1、畸形报文

5.2、udp flood

5.3、icmp flood

5.4、syn flood

5.5、ack flood

5.6、udp reflect

5.7、ssl flood

5.8、http flood

六、如何防御DDOS攻击

6.1、减少暴露面

6.2、服务器安全加固

6.3、及时止损

6.4、识别异常流量

6.5、syn flood

6.6、ack/fin/rst flood

6.7、畸形报文

6.8、其他

七、低成本DDOS攻击防御手段

7.1、前端代理

7.2、离线访问

7.3、免费节点

7.4、演示

7.5、接口防御


一、什么是DDOS攻击

DDoS是Distributed Denial of Service的缩写,即分布式拒绝服务。

  • 拒绝服务:就是用某种技术手段让被攻击的服务器资源耗尽,拒绝正常请求;
  • 分布式:可以理解成多台计算机联合起来作为一个攻击平台;

简单来说是向服务器同时发布大量请求,让被攻击的服务器资源耗尽,服务器资源当然包括计算、网络、存储等,也就是通过一些手段使得服务器的计算性能达到上限、网络带宽被占满或者存储空间被用完,这样服务器就无法响应正常的请求了。

二、DDOS攻击用途

DDoS的用途非常广泛,是敲诈勒索、破坏竞争对手经营的一把利刃,甚至可以被用于提高网络游戏的胜率。

2020年1月,育碧游戏纽约地区法院起诉就DDoS攻击服务商,DDoS攻击服务商为玩家提供“炸房”服务,即玩家可以在一局游戏快失利之时对游戏服务器发动DDoS攻击,造成服务器卡顿,导致本局服务无效。

“炸房”在国内也不是新鲜的话题。2019年,暴雪旗下的游戏《守望先锋》中国运营团队配合上海公安等执法机关,对《守望先锋》游戏中性质恶劣的“炸房外挂”进行重点打击。

在2017年,腾讯旗下《英雄联盟》运营团队对2189名玩家因为使用“炸房”程序被全服封号。

三、DDOS攻击原理

如上所述,ddos攻击的目的是为了让被攻击的服务器资源耗尽,服务器资源当然包括计算、网络、存储等,也就是通过一些手段使得服务器的计算性能达到上限、网络带宽被占满或者存储空间被用完,这样服务器就无法响应正常的请求了。

四、DDOS攻击种类

大家肯定都熟悉OSI七层模型,ddos攻击最常出现在第三层(网络层)、第四层(传输层)、第六层(表示层)和第七层(应用层)。

第三层和第四层的ddos攻击一般被统称为基础设施层攻击,一般通过模拟大量三四层的报文如icmp、udp、tcp来让服务器进行响应,从而达到消耗服务器资源的目的。

这种攻击是最常见的,也是最简单的,甚至开源了很多工具如hping3来模拟这种ddos攻击。

正因为这类攻击有一些独有的特性,也使得开发者可以比较容易的识别出这类攻击从而进行防范。

第六层和第七层的ddos攻击一般可以归为应用层攻击,这类攻击通过模拟应用层的请求如http来让服务器进行响应。

这类攻击没有第一类常见,因为攻击者必须了解服务端应用程序工作方式,需要构造更加复杂的请求,比如某登陆页的http请求、某dns服务器的dns请求。

这一类攻击都是正常的请求,所以也更难防范。

五、常见ddos攻击

5.1、畸形报文

这种攻击有一点以巧取胜的意思,它并不需要很大的数量,也许只需要一个特殊的报文就可以导致服务器的崩溃。所谓畸形报文,就是指那些不符合协议规定的报文,比如tcp头的SYN、RST标志位都置1的报文;比如ip头例源地址和目的地址都是同一个的报文等等。

5.2、udp flood

攻击者利用udp无状态的特点,向服务器的不同端口发送udp报文,服务器收到之后会寻找对应端口的应用程序,如果没有找到,会返回“目标不可达”的消息。攻击者往往会通过伪造源ip来达到隐藏自己身份的目的。这种攻击方法以量取胜,一旦服务器被攻击流量淹没,那就无法响应正常用户的请求。

5.3、icmp flood

攻击者想服务器发送大量icmp报文,服务器收到之后会回复一个icmp echo给源地址。这种攻击和上面的udp flood攻击类似,可以看到攻击请求和服务器响应流量是1:1的关系,“性价比”并不高,现在已经很少看到了。

5.4、syn flood

最常见最知名的一种攻击,它的防御方法甚至被写进了linux内核。攻击者利用了三次握手的机制,发送大量第一次握手的syn包给服务器,并且无视服务器返回第二次握手的synack包,故意不发送第三次握手,导致服务器大量端口处于SYN_RECV状态。由于服务器收不到第二次握手的报文,超时重传,重传一定次数之后,才会释放连接。服务器的这个状态我们一般称为半连接,要知道服务器能每收到一个syn包时,都会将连接信息储存到一个队列中,这个队列肯定也是有长度的,当超过队列长度时,新来的syn包就无法被响应,服务器也就无法响应正常的tcp请求了。

5.5、ack flood

攻击者向服务器发送大量ack标志位置1的报文,服务器收到后,会在协议栈判断报文是否合法(是否有该四元组的连接,序列号是否正常等等),如果不合法,服务器会返回一个rst报文。跟这种攻击比较类似的还有rst flood和fin flood。

5.6、udp reflect

udp是无状态的,没有三次握手,攻击者利用udp的这个特点,向服务器发送大量业务请求,导致服务器返回远大于请求量的响应,从而达到占用大量带宽的目的。
udp reflect攻击主要针对哪些响应包远大于请求包的协议,如dns、ntp等,以达到四两拨千斤的效果。
以dns为例,由于dns大部分提供公网服务,会将53端口暴露到公网上。攻击者伪造一个源ip地址,向dns服务器的53端口发送大量的dns请求,dns服务器收到之后,会回给攻击者伪造的ip地址大量的dns响应。可以看到受攻击的对象有两个,一个是攻击者伪造的ip地址,另一个是dns服务器。

5.7、ssl flood

这是表示层的一种ddos攻击。SSL握手的过程中,在协商加密算法时服务器CPU的开销是客户端开销的15倍左右。攻击者利用这一特点,在一个TCP连接中不停地快速重新协商,从而达到耗尽服务器CPU资源的目的。
SSL客户端发送一条ClientHello消息来初始化一次新的握手,该消息大约100字节左右,不需要加密。服务器端响应ClientHello消息,需要连续发出3个消息,ServerHello、Certificate、ServerHelloDone,这3个消息一般在3000字节左右,需要用高级加密标准AES或流加密算法簇RC-4进行加密后再发送。每次ssl握手,SSL服务端发送的数据比客户端多了30倍,还要进行加密,从而导致服务端CPU计算资源大量占用。

5.8、http flood

http flood是最难模拟也是最难防范的一种攻击,攻击者模拟用户的真实操作对某些接口发送大量http请求,导致其他正常用户的请求响应速度变慢甚至被拒绝。

六、如何防御DDOS攻击

6.1、减少暴露面

  1. 尽可能少的把端口暴露在公网上,减少可能的攻击点。
  2. 配置安全组、acl访问控制或者iptables防火墙规则,这三种操作的目的其实都是一样的,都是为了限制不明客户端的访问,只是生效的地方不一样。一般来说,我们肯定希望把这些流量在离服务器更远的地方限制住。
  3. 将服务器放在cdn、负载均衡后面,目的其实是和第二点一样。cdn可以缓存服务器资源到各个边缘节点上,让用户就近访问最近的边缘节点,从而缓解服务器的压力。负载均衡可以配置调度算法,将流量按需分配给后端服务器,并且对后端进行个性化的健康监测,将不健康的服务器踢出,不继续处理请求。

6.2、服务器安全加固

  1. 及时更新安全补丁。
  2. 优化内核参数如半连接timeout时间、全连接队列长度、禁用icmp广播等等。

6.3、及时止损

如果我们没有防御成功,需要及时止损,将影响降到最低。

  1. 在部署服务的阶段,我们就应该尽可能一个集群只部署一个服务,让服务之间互不影响,即使某个服务受到了攻击,也可以把影响降到最小。
  2. 建立完善的监控告警机制。这个公司内部应该都有,监控cpu使用率、连接数之类的,如果达到阈值,就会发出告警,交由专人处理。
  3. 对系统进行压测,配置限速机制。我们需要对业务架构进行完善的压力测试,以评估现有架构的吞吐能力。并根据系统性能对业务进行限速,避免ddos攻击将服务器打挂。
  4. 集群具有可伸缩性。当集群某些指标达到阈值时,为了让业务不受损,应该及时对集群进行扩容。

6.4、识别异常流量

预防ddos攻击的关键其实就是怎么识别正常流量和异常流量。这需要我们对ddos攻击的方法非常了解,对不同的ddos攻击类型做出相应的防御动作。

服务器本身几乎没有识别异常流量的能力,所以大部分企业都会购买anti-ddos服务或者waf这样的专业设备来防御ddos攻击。

anti-ddos当然也分为硬件设备和软件。硬件anti-ddos一般会旁挂到汇聚或者核心交换机上,交换机将流量镜像一份发给ddos,ddos识别出异常流量后会做一些流量清洗动作。

软件antiddos可能会直接安装到四七层网关上,对经过四七层网关的流量进行过滤。显而易见,软件anti-ddos的优点就是便宜,简单;缺点是可能会拖累四七层网关的性能,可防护的ddos类型和防御能力肯定不如硬件anti-ddos。

但其实有的地方硬件和软件anti-ddos都会用,硬件antiddos主要是进行一个流量清洗的功能,软件antiddos在硬件的后面,主要做一个兜底的作用。

6.5、syn flood

syn flood是最常见的一种ddos攻击,在服务器、网关、anti-ddos每一个环节都有相应的手段可以进行防御。

  1. syn cookie。syn cookie已集成到了linux内核,是在服务器上防御syn flood的方法。服务器每当收到一个syn,就会创建一个半连接队列,来缓存连接信息,当半连接队列满了之后,服务器就无法处理正常请求了。所以我们需要找到一种方法,不用记录全部的连接信息。我们知道,服务器发出的第二次握手的序列号是服务器自己生成的,syn cookie将连接的部分信息(mss、时间戳、四元组)通过某种算法生成一个唯一的序列号给客户端,并且这个序列号是可以解码的。服务器收到第三次握手的确认序列号后,将这个值减1,就可以还原出之前的序列号。可以看到,服务器巧妙地通过这种方式间接保存了一部分SYN报文的信息,节省了服务器的部分资源,但是同时也增加了加解密的计算。
  2. syn proxy。syn proxy在四层网关中用的比较多,用法也比较简单。网关收到syn后,并不直接发送给后端服务器,而是代替后端,与客户端进行三次握手,当握手成功之后,再与后端服务器进行三次握手。syn proxy经常与syn cookie结合起来用,网关在于客户端三次握手的过程中可以使用syn cookie。syn proxy有一个问题就是两次握手的序列号不一样,所以网关在后续的数据传输阶段还要继续调整序列号和确认序列号。
  3. 首包丢弃。这种方法比较暴力,syn flood不会重传,所以我们只要把第一个syn包都丢弃了,正常请求后进行重传,异常请求就被丢弃了。
  4. 算法。antiddos可以通过统计syn包占到所有流量的比例,当这个比例达到某个阈值时,即判定受到了ddos攻击。然后就到了识别异常流量的时候了,如果antiddos可以查到会话信息,那就简单了,那些在几分钟内完成过三次握手的源ip地址,是ddos攻击的可能性较小,可以直接放行。剩下的ip地址是ddos攻击的可能性就比较大了。我们知道ddos攻击可以分为随机源ip和真实源ip两种。antiddos可以将syn包的个数除以源ip的数目,如果大于某个阈值,则可以判定为真实源ip攻击,直接将这几个源ip地址的syn包全部丢弃就可以了;如果小与某个阈值,则判定为随机源ip攻击,这时可以利用上面说的首包丢弃的方法,判断出正常流量,将正常的源ip地址放行。

6.6、ack/fin/rst flood

这三种ddos攻击比较类似,都依赖于会话。如果没有建立会话,那不管是在服务器还是在网关都会直接被丢弃的。判断是否收到攻击也比较简单,就比较命中会话的报文和没命中的比例就好了。

6.7、畸形报文

畸形报文往往有一些特征,antiddos可以提前识别以下畸形报文:

  1. 非法的tcp flag标志位,如SYN和FIN同时为1等。
  2. 源ip和目的ip一样的报文。
  3. 源ip为内网ip或预留ip。
  4. length字段与实际payload不一致。
  5. 有data的syn包或者无option的syn包。
  6. 无payload的udp包
  7. 分片包等等

其中4、5、6并不一定是异常流量,只是比较像由发包器发出来的报文,具体问题还得具体分析。

6.8、其他

其他的一些攻击比如udp reflect、http flood、ssl flood,都是一些接近正常流量的请求,感觉识别异常流量比较复杂,应该只能通过算法来识别。也可以借鉴syn flood的防御方法,主要还是得识别出异常流量和正常流量的源ip地址。

最后如果有条件的话,可以使用hping3模拟三四层的ddos攻击,测试antiddos的功能。hping3不支持ipv6,不过网上有很多开源的ipv6 ddos测试工具如thcsyn6。

七、低成本DDOS攻击防御手段

传统的 DDOS 防御通常使用“硬抗”的方式,导致开销很大,而且有时效果并不好。

  • 例如使用 DNS 切换故障 IP 的方案,由于域名会受到缓存等因素的影响通常有分钟级延时,前端难以快速生效。
  • 例如使用 CDN 服务,虽可抵挡大多网络层攻击,但对应用层攻击却常有疏漏,攻击者可通过恶意请求消耗流量、日志存储等费用,导致欠费停止服务。
  • 例如购买流量清洗等服务,虽然效果不错但费用十分昂贵。

今天再给大家分享一种超低成本的网站 DDOS 防御方案 —— 不使用任何后端防御服务,纯前端实现!当然效果也非常极端:

  • 如果用户之前未访问过该网站,这种防御不会生效,网站被打垮仍无法访问;
  • 如果用户之前访问过该网站,之后即可无视攻击,甚至服务器关机网站也能访问,并且还能更新!

7.1、前端代理

说到低成本、防攻击、离线访问等特性,大家可能会想到 Cloudflare 服务。不过前面提到,我们不使用后端防御,而是纯前端实现。

事实上,我们可以把 Cloudflare 搬到浏览器前端!这里不得不提 HTML5 中的一个 API ——Service Worker,它能拦截当前站点产生的所有请求,并能控制返回结果,相当于一个反向代理服务。有了这个黑科技,即可在前端实现 CDN 功能。

我们可为静态资源准备多个站点做冗余备份,当 Service Worker 加载资源出错时,可不返回错误给上层页面,而是继续从备用站点加载,直到获得正确结果才返回。这样,只要有一个备用站点可用,资源就不会加载失败。

相比传统使用 DNS 切换故障 IP 的方案通常有分钟级的延迟,这种 JS 控制的方案可精确到毫秒级,并且还能有多次试错的机会,从而大幅增加稳定性。

7.2、离线访问

Service Worker 的设计初衷就是为了增强网页的离线化体验,因此一旦安装即可在后台长期运行,即使服务器关机、浏览器重启,它也不会失效。

事实上,除了网页中的资源可被 Service Worker 拦截,网页本身也可以。Service Worker 安装后,用户在地址栏输入网址发起的那个请求其实也会被拦截,从而可从备用站点加载网页文件。

注意,这不是重定向,地址栏不会有变化。

因此即使网站被打垮,之前访问过的用户仍可通过 Service Worker 从备用站点加载页面,从而正常访问。

7.3、免费节点

使用冗余站点虽能提升稳定性,但攻击者仍可对备用站点发起攻击,尤其是恶意消耗流量费用的攻击,导致成本大幅上升。

为此,我们还可使用一种更极端的方案 —— 使用免费 CDN 作为备用站点,例如 jsdelivr.net、unpkg.com、IPFS Gateway 等等,图片则可上传到各大网站的相册。

对于非图片类型的文件,甚至还可以封装成图片上传,使用时再从中提取!

虽然单个免费 CDN 的稳定性可能不高,但多准备几个,稳定性就呈指数级上升了。

至于恶意攻击,几乎不可能打垮。DDOS(Distributed DOS)的精髓在于分布式,将分布在各地的流量汇聚到一起,从而增加伤害;而我们正好相反,将集中的流量分摊到各地,变成一个去中心化的分布式站点,从而化解攻击。

7.4、演示

这个方案原理虽不复杂,但实现起来还是有很多细节,例如节点的选择策略、资源清单格式等设计,还需注意三方站点内容完整性、离线资源被 XSS 篡改等安全问题。

演示案例:https://freecdn.etherdream.com/time.html

该页面通过 HTML 输出当前时间,刷新可变化。

关闭页面,退出浏览器。在 hosts 中加入0.0.0.0 freecdn.etherdream.com屏蔽该域名,模拟站点被打垮。

打开浏览器,再次访问该页面。页面不仅能正常访问,甚至还能刷新更新内容!

通过控制台可见,虽然当前站点无法连接,但通过 Service Worker 仍能从备用站点加载页面!

7.5、接口防御

对于纯静态资源的站点,我们可将所有资源甚至包含 HTML 文件都通过免费 CDN 加速,从而大幅降低成本、增加稳定性。

但对于动态接口,又该如何实现防御?动态接口的防御要复杂一些,但仍有一些巧妙的方案。

  • 例如通过云防火墙和 Service Worker 使用约定的算法生成端口号,从而不断更换端口拦截攻击流量;
  • 例如代理到多个云主机厂商“薅”免费额度的防御流量;
  • 例如通过最便宜的抢占式主机购买大量公网 IP;

细节下回讲解。

当然即使不考虑动态接口,网站被打垮后仍能访问静态内容,只是无法交互,相比完全打不开要好得多。

 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值