这是关于 DoS 和 DDoS 缓解的规范问题。
我在我今天托管的网站上发现了巨大的流量高峰;我每秒获得数千个连接,我看到我正在使用所有 100Mbps 的可用带宽。没有人可以访问我的站点,因为所有请求都超时了,我什至无法登录服务器,因为 SSH 也超时了!这种情况以前发生过几次,每次都持续几个小时并自行消失。
有时,我的网站还有另一个明显但相关的问题:我的服务器的平均负载(通常在 0.25 左右)飙升至 20 或更多,并且没有人可以像其他情况一样访问我的网站。几个小时后它也会消失。
重新启动我的服务器没有帮助;我该怎么做才能让我的网站再次可访问,发生了什么?
相关地,我发现有一两天,每次我启动我的服务时,它都会从特定的 IP 地址获得连接,然后崩溃。一旦我再次启动它,这种情况又发生了,它又崩溃了。这有什么相似之处,我该怎么办?
您正在遭受拒绝服务攻击。如果您看到来自多个网络的流量(不同子网上的不同 IP),则说明您遇到了分布式拒绝服务 (DDoS);如果它们都来自同一个地方,那么你就有了一个普通的旧 DoS。如果可以的话,检查一下会很有帮助;使用 netstat 检查。不过,这可能很难做到。
拒绝服务通常分为几类:基于流量的和基于负载的。最后一项(带有崩溃服务)是基于漏洞的 DoS,并且完全不同。
如果您试图确定正在发生的攻击类型,您可能想要捕获一些流量(使用 wireshark、tcpdump 或 libpcap)。如果可能,您应该注意,您可能会捕获大量流量。
通常情况下,这些将来自僵尸网络(在某些攻击者的中央控制下的受感染主机的网络,他们将进行竞标)。这是攻击者(非常便宜)获取不同网络上许多不同主机的上游带宽以攻击您的好方法,同时掩盖他们的踪迹。低轨道离子炮是僵尸网络的一个例子(尽管是自愿的,而不是恶意软件衍生的);宙斯是一个比较典型的。
基于流量
如果您处于基于流量的 DoS 之下,您会发现进入您的服务器的流量如此之多,以至于它与 Internet 的连接已经完全饱和。从其他地方 ping 您的服务器时,丢包率很高,并且(取决于使用的路由方法)有时您还会看到非常高的延迟(ping 很高)。这种攻击通常是 DDoS。
虽然这是一个非常“响亮”的攻击,而且很明显正在发生什么,但服务器管理员很难缓解(共享主机的用户基本上不可能缓解)。您将需要 ISP 的帮助;让他们知道您受到 DDoS 攻击,他们可能会提供帮助。
但是,大多数 ISP 和传输提供商会主动了解正在发生的事情并为您的服务器发布黑洞路由。这意味着他们以尽可能低的成本发布到您的服务器的路由,通过
0.0.0.0
:他们使到您的服务器的流量不再可在 Internet 上路由。这些路由通常是 /32s 并最终被删除。这对你一点帮助都没有;目的是保护 ISP 的网络免受洪水侵袭。在此期间,您的服务器将有效地失去 Internet 访问权限。您的 ISP(或者您,如果您有自己的 AS)能够提供帮助的唯一方法是,他们是否使用可以检测和限制可能的 DDoS 流量的智能流量整形器。不是每个人都拥有这项技术。但是,如果流量来自一两个网络或一台主机,它们也可能会阻止您前面的流量。
简而言之,您对这个问题几乎无能为力。最好的长期解决方案是将您的服务托管在 Internet 上的许多不同位置,这些位置必须单独和同时进行 DDoS,从而使 DDoS 变得更加昂贵。这方面的策略取决于您需要保护的服务;可以使用多个权威名称服务器、带有备份 MX 记录和邮件交换器的 SMTP 以及带有循环 DNS 或多宿主的 HTTP 来保护 DNS(但在此期间可能会出现一些退化)。
负载均衡器很少能有效解决这个问题,因为负载均衡器本身也会遇到同样的问题,只会造成瓶颈。IPTables 或其他防火墙规则将无济于事,因为问题在于您的管道已饱和。 一旦你的防火墙看到连接,就已经太晚了;您站点的带宽已被消耗。你对连接做什么并不重要。当传入流量恢复正常时,攻击会得到缓解或完成。
如果可以,请考虑使用Akamai、Limelight 和 CDN77 等内容分发网络(CDN),或使用 CloudFlare 或 Prolexic 等 DDoS 清理服务。这些服务采取积极措施来缓解这些类型的攻击,并且在许多不同的地方拥有如此多的可用带宽,以至于泛滥它们通常是不可行的。
如果您决定使用 CloudFlare(或任何其他 CDN/代理),请记住隐藏您服务器的 IP。如果攻击者找到了 IP,他可以绕过 CloudFlare 再次直接对您的服务器进行 DDoS。要隐藏 IP,您的服务器不应直接与其他服务器/用户通信,除非它们是安全的。例如,您的服务器不应直接向用户发送电子邮件。如果您在 CDN 上托管所有内容并且没有自己的服务器,则这不适用。
此外,一些 VPS 和托管服务提供商在缓解这些攻击方面比其他服务提供商做得更好。一般来说,它们越大,他们在这方面的表现就越好;一家拥有良好同行且拥有大量带宽的供应商自然会更具弹性,而拥有活跃且配备齐全的网络运营团队的供应商将能够更快地做出反应。
基于负载
当您遇到基于负载的 DDoS 时,您会注意到平均负载异常高(或 CPU、RAM 或磁盘使用率,取决于您的平台和具体情况)。尽管服务器似乎没有做任何有用的事情,但它非常忙碌。通常,日志中会有大量条目指示异常情况。这通常来自许多不同的地方并且是 DDoS,但情况不一定如此。 甚至不必有很多不同的主机。
这种攻击是基于让你的服务做很多昂贵的事情。这可能类似于打开大量 TCP 连接并强制您为它们维护状态,或者将过大或过多的文件上传到您的服务,或者可能进行非常昂贵的搜索,或者真的做任何处理成本高昂的事情。流量在您计划的范围内并且可以承受,但是发出的请求类型太昂贵,无法处理这么多.
首先,这种类型的攻击是可能的,这通常表明存在配置问题或错误在您的服务中。例如,您可能打开了过于冗长的日志记录,并且可能将日志存储在写入速度非常慢的东西上。如果有人意识到这一点并做了很多事情导致您将大量日志写入磁盘,那么您的服务器将缓慢爬行。您的软件也可能在某些输入情况下效率极低;原因与程序的数量一样多,但有两个例子是导致您的服务不关闭否则已完成的会话的情况,以及导致它产生子进程并离开它的情况。如果你最终有数以万计的打开连接状态来跟踪,或者数以万计的子进程,你会遇到麻烦。
您可以做的第一件事是使用防火墙来丢弃流量。这并不总是可能的,但是如果您可以在传入的流量中找到一个特征(如果流量很轻,tcpdump 可能会很好),您可以将它放在防火墙上,它不会再造成麻烦。另一件事是修复服务中的错误(与供应商联系并为长期支持经验做好准备)。
但是,如果是配置问题,请从那里开始。将生产系统上的日志记录降低到一个合理的水平(取决于程序,这通常是默认值,并且通常会涉及确保“调试”和“详细”级别的日志记录已关闭;如果用户所做的一切都准确地登录并且很好的细节,你的日志太冗长了)。此外,检查子进程和请求限制,可能会限制传入请求、每个 IP 的连接以及允许的子进程数量(如果适用)。
不言而喻,您的服务器配置得越好,配置得越好,这种类型的攻击就越难。特别是避免对 RAM 和 CPU 吝啬。确保您与后端数据库和磁盘存储等事物的连接快速可靠。
基于漏洞利用
如果您的服务在启动后异常迅速地崩溃,特别是如果您可以在崩溃之前建立请求模式并且请求是非典型的或与预期的使用模式不匹配,那么您可能会遇到基于漏洞的 DoS。这可以来自少至只有一台主机(具有几乎任何类型的互联网连接)或多台主机。
这在许多方面类似于基于负载的 DoS ,并且具有基本相同的原因和缓解措施。不同之处仅在于在这种情况下,该错误不会导致您的服务器浪费,而是死机。攻击者通常利用远程崩溃漏洞,例如导致空解引用的乱码输入或您的服务中的某些内容。
处理这类似于未经授权的远程访问攻击。 防火墙针对原始主机和流量类型(如果可以固定)。 如果适用, 请使用验证反向代理。收集法医证据(尝试捕获一些流量),向供应商提交错误单,并考虑也针对来源提出滥用投诉(或法律投诉)。
如果可以找到漏洞利用,这些攻击的安装成本相当低,而且它们可能非常有效,但也相对容易追踪和阻止。但是,对基于流量的 DDoS 有用的技术通常对基于漏洞利用的 DoS 无用。
如果您是企业,您有很多选择。如果你是像我这样的小人物,租用 VPS 或专用服务器来为小型网站提供服务,成本很快就会变得令人望而却步。
根据我的经验,我相信大多数专用和 VPS 提供商不会只为您的服务器设置特殊的防火墙规则。但如今,您有几个选择。
内容分发网络
如果您正在运行 Web 服务器,请考虑将其放在 CloudFlare 或 Amazon CloudFront 等 CDN 后面。
CDN 很昂贵。为了控制成本,请直接从您的服务器而不是通过 CDN 提供大文件(大图像、音频、视频)。但是,这可能会将您的服务器 IP 地址暴露给攻击者。
私有云
私有云通常是昂贵的企业解决方案,但 Amazon VPC 的设置成本几乎为零。然而,亚马逊的带宽通常很昂贵。如果您负担得起,那么您可以设置 Amazon VPC 的安全组和网络 ACL 以在流量到达您的实例之前阻止它。您应该阻止除 TCP 服务器端口之外的所有端口。
请注意,攻击者仍然可以攻击您的 TCP 服务器端口。如果它是一个 Web 服务器,那么考虑使用像 nginx 这样的东西,它使用非阻塞 IO 并且可以处理大量连接。除此之外,除了确保运行最新版本的服务器软件之外,您无能为力。
当您的 TCP 端口受到攻击而其他一切都失败时
这是我开发的一个解决方案,适用于不能隐藏在 CDN 后面的非 Web 服务器,例如 WebSocket、媒体内容/流服务器。CloudFlare 支持 WebSocket,但目前仅适用于企业。
目标是快速更改您的 TCP 侦听端口,以使僵尸网络无法跟上,例如每 10 秒一次。这是使用执行端口漫游的简单代理程序来完成的。端口序列是伪随机的,但必须基于服务器时间。并且计算服务器时间和端口的算法必须隐藏在您的客户端 javascript/flash 代码中。该程序还应该在更改侦听端口时修改防火墙,并且防火墙需要是有状态的。如果有人感兴趣,我会将我的适用于 Amazon 的 node.js 脚本上传到 GitHub。
更改您的域以在短时间内进入像 0.0.0.0 这样的黑洞。
与您的服务器提供商交谈,看看他们是否可以向您提供另一个 IP 地址作为访问服务器的临时方式,或者查看服务器是否具有远程控制台访问权限(就像您坐在它前面一样)。从这里您可以查看它是否是单个 IP 地址并阻止它进入站点或分布式攻击。
当您受到 DDoS 攻击时,您的 ISP 可以为您提供最大的帮助,但如果他们没有 DDoS 保护,您很可能会停止服务,直到攻击停止。通常他们会看到被攻击的 IP 地址,并在他们的上游路由器上清空网络。如果您的流量不多,则有许多用于 DDoS 保护的在线服务,您的流量会被重新路由、过滤并发送回您的服务器。
我们以前也有类似的情况。下面是我们所做的。
首先,从服务器上拔下网线。现在,通过查看性能监视器和任务管理器检查您的服务器服务是否恢复正常行为。如果没有,请使用恶意软件字节软件扫描您的服务器,以确保您的服务器已清理。此步骤通常会确保您断开连接的服务器再次恢复正常。
接下来,您是否安装了防火墙?如果是,您是否续订了订阅?确保在防火墙中启用 IPS 入侵功能。只需更新防火墙订阅即可解决我们的 DDOS 攻击。
我们了解到我们应该更新安全订阅(例如防火墙或防病毒),而不是掉以轻心。DDOS 攻击每天都在发生,小型企业也可能发生。希望这可以帮助。