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