今天逛知乎看了个新问题:
觉得问题值得探讨,就尝试回答了该问题,并分享到公众号上一起交流
免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
回答原文
本质是让服务占用达到可用资源上限,无法再分配新的资源给新的用户,甚至使服务瘫痪。
而这个影响这个可用资源上线的因素是很多的,大体上遵循木桶原理,只要达到最稀缺的资源上限,就能实现一次成功的DDOS攻击。那么,到底受哪些因素的影响,这些因素又是如何影响服务的?举几个例子看看:
文件描述符上限
文件描述符(File Descriptor)是操作系统中用于标识和访问文件或其他输入/输出资源的整数。它是操作系统为每个打开的文件或设备分配的唯一标识符。
每一条网络连接,同样需要占用一个文件描述符。
我们可以通过lsof指令查看网络连接占用的文件描述符情况,比如我先查看ssh连接占用了几个文件描述符:
lsof -i :22
可以看到此时占用了3个,那么我多开几个ssh连接,再执行一次可以看到占用的数量明显变多了:
操作系统对文件描述符存在最大限制,比如这样查看某进程的文件描述符限制:
cat /proc/[pid]/limits
还可以用这条命令看操作系统所有进程可打开的最大文件描述符数量:
cat /proc/sys/fs/file-max
内存上限
在大多数情况下,每来一个新的连接,程序都要并行地去处理它,否则会造成阻塞。而并行处理的方案,一般为进程、线程、协程三种。
以Go Web服务为例,一般一个链接都是起一个新的Goruntine去处理。而这个新的Goruntine,必须要保存有上下文等信息,来保证服务并行的正常运行。也就是说,每一个新的Goruntine,都会占用一部分的内存(当然,Goruntine算是轻量的)。
服务器的内存同样时有上限的,连接越多,占用的内存就越多,当连接数大到占满内存的时候,同样DDoS攻击就成功了。
我们可以通过以下指令查看进程占用的CPU和内存情况:
ps -aux
端口数上限
有一些服务,使用的是一端口对应一条连接的模式,比较典型的有部分VPN。然而,服务器的允许进行临时网络连接的端口数是有上限的,可以通过这个命令查看:
cat /proc/sys/net/ipv4/ip_local_port_range
显然,我的机器可分配端口范围是32768-60999,一个28231个端口。那么,攻击者只需要同时发起28231个请求,把这些端口全占用了,当新的连接到来时,服务无法分配新的端口给用户,就无法建立新的有效连接,服务自然就失效了。
原文始发于微信公众号(赛博安全狗):【安全杂谈】聊聊DDoS攻击是怎么让网站停止服务的
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论