内容分发网络 (CDN)

内容分发网络 (CDN)

这是一个典型问题关于 DoS 和 DDoS 缓解。

今天我发现我托管的一个网站流量激增;每秒有数千个连接,我发现我占用了所有 100Mbps 的可用带宽。没有人可以访问我的网站,因为所有请求都超时了,我甚至无法登录服务器,因为 SSH 也超时了!这种情况之前发生过几次,每次都持续几个小时然后自行消失。

偶尔,我的网站会出现另一个明显但相关的问题:我的服务器的平均负载(通常在 0.25 左右)猛增至 20 或更高,并且没有人可以访问我的网站,就像另一种情况一样。几个小时后,这个问题也会消失。

重新启动服务器没有帮助;我该怎么做才能让我的网站再次可访问,以及发生了什么?

与此相关的是,我曾经发现,一两天内,每次我启动服务时,它都会从特定 IP 地址获得连接,然后崩溃。当我再次启动它时,这种情况再次发生,它再次崩溃。这有什么相似之处?我该怎么办?

答案1

您正在遭受拒绝服务攻击。如果您看到来自多个网络(不同子网上的不同 IP)的流量,则您遇到了分布式拒绝服务 (DDoS);如果所有流量都来自同一个地方,则您遇到了普通的 DoS。如果可以,检查一下会很有帮助;使用 netstat 进行检查。不过这可能很难做到。

拒绝服务通常分为两类:基于流量的拒绝服务以及基于负载的拒绝服务。最后一类(导致服务崩溃)是基于漏洞的拒绝服务,这完全不同。

如果您试图确定正在发生的攻击类型,您可能需要捕获一些流量(使用 wireshark、tcpdump 或 libpcap)。如果可能的话,您应该这样做,但也要注意,您可能会捕获相当多的流量。

通常情况下,这些攻击来自僵尸网络(受某些攻击者集中控制的受感染主机网络,攻击者会按照他们的命令行事)。这是攻击者以非常低的成本获取不同网络上大量不同主机的上行带宽来攻击您的好方法,同时掩盖他们的踪迹。低轨道离子炮是僵尸网络的一个例子(尽管是自愿的,而不是由恶意软件衍生的);宙斯是一个更典型的僵尸网络。

基于流量

如果你遭遇了基于流量的 DoS 攻击,你会发现交通太拥挤了您的服务器与互联网的连接已完全饱和。从其他地方 ping 您的服务器时,数据包丢失率很高,并且(取决于使用的路由方法)有时您还会看到非常高的延迟(ping 很高)。这种攻击通常是 DDoS。

虽然这是一次非常“响亮”的攻击,而且很明显发生了什么,但服务器管理员很难缓解(对于共享主机用户来说,缓解基本上是不可能的)。您将需要 ISP 的帮助;让他们知道您遭受了 DDoS 攻击,他们可能会提供帮助。

然而,大多数 ISP 和传输提供商会主动意识到正在发生的事情,并发布黑洞路线为您的服务器。这意味着他们通过 以尽可能低的成本发布到您的服务器的路由0.0.0.0:它们使到您服务器的流量不再可在 Internet 上路由。这些路由通常是 /32s,最终会被删除。这对您没有任何帮助;目的是保护 ISP 的网络免受洪流的影响。在此期间,您的服务器实际上将失去 Internet 访问权限。

您的 ISP(或您,如果您有自己的 AS)能够提供帮助的唯一方法是他们使用可以检测和限制可能的 DDoS 流量的智能流量整形器。并非每个人都拥有这项技术。但是,如果流量来自一个或两个网络或一个主机,他们也可能能够阻止您前面的流量。

简而言之,你几乎无能为力了解这个问题。最好的长期解决方案是将您的服务托管在互联网上的许多不同位置,这些位置必须单独且同时进行 DDoS 攻击,这使得 DDoS 攻击的成本更高。此策略取决于您需要保护的服务;DNS 可以使用多个权威名称服务器进行保护,SMTP 可以使用备份 MX 记录和邮件交换器进行保护,HTTP 可以使用循环 DNS 或多宿主进行保护(但无论如何,在持续时间内可能会出现一些性能下降)。

负载均衡器很少能有效解决此问题,因为负载均衡器本身也存在同样的问题,并且只会造成瓶颈。IPTables 或其他防火墙规则无济于事因为问题在于你的管道已经饱和了。 一旦防火墙发现连接,就为时已晚;您网站的带宽已被消耗。无论您如何处理连接,当传入流量恢复正常时,攻击就会得到缓解或结束。

如果你能够这样做,请考虑使用内容分发网络(CDN)如 Akamai、Limelight 和 CDN77,或者使用 DDoS 清洗服务,如 CloudFlare 或 Prolexic。这些服务采取主动措施来缓解这些类型的攻击,而且在很多不同的地方都有大量可用带宽,因此通常无法淹没它们。

如果您决定使用 CloudFlare(或任何其他 CDN/代理),请记住隐藏服务器的 IP。如果攻击者发现 IP,他可以再次直接对您的服务器进行 DDoS 攻击,绕过 CloudFlare。要隐藏 IP,您的服务器永远不应与其他服务器/用户直接通信,除非它们是安全的。例如,您的服务器不应直接向用户发送电子邮件。如果您将所有内容托管在 CDN 上并且没有自己的服务器,则不适用此规定。

此外,一些 VPS 和托管服务提供商比其他服务提供商更善于缓解这些攻击。一般来说,规模越大,他们在这方面做得越好;一家网络防护良好且带宽充足的提供商自然会更具弹性,而一家拥有活跃且人员充足的网络运营团队的提供商将能够更快地做出反应。

基于负载

当你遇到基于负载的 DDoS 时,你会注意到平均负载异常高(或 CPU、RAM 或磁盘使用情况,具体取决于您的平台和具体情况)。虽然服务器似乎没有做任何有用的事情,但它非常繁忙。通常,日志中会有大量条目表明存在异常情况。通常,这些异常来自许多不同的地方,并且是 DDoS,但情况并非如此。 甚至不需要有很多不同的主持人

这种攻击基于让您的服务执行大量昂贵的操作。这可能是打开大量 TCP 连接并迫使您为它们维护状态,或者将过大或过多的文件上传到您的服务,或者执行非常昂贵的搜索,或者真正执行任何处理起来很昂贵的操作。流量在您计划的范围内,可以承受,但处理这么多类型的请求成本太高

首先,这种类型的攻击是可能的,这通常表明配置问题或错误在您的服务中。例如,您可能打开了过于详细的日志记录,并且可能将日志存储在写入速度非常慢的程序上。如果有人意识到这一点并做了大量导致您将大量日志写入磁盘的事情,您的服务器将变得非常缓慢。您的软件也可能在某些输入情况下执行了一些极其低效的操作;原因与程序一样多,但有两个示例,一种情况导致您的服务不关闭原本已完成的会话,另一种情况导致它生成子进程并离开它。如果您最终有数以万计的打开连接需要跟踪状态,或者数以万计的子进程,那么您将遇到麻烦。

你可以做的第一件事是使用防火墙阻止流量。这并不总是可行的,但如果您可以在传入流量中发现一个特征(如果流量较少,tcpdump 可以很好地解决此问题),您可以将其丢弃在防火墙处,这样它就不会再造成麻烦。另一件事是修复您服务中的错误(与供应商取得联系并准备好接受长期支持)。

然而,如果是配置问题,请从这里开始. 将生产系统中的日志记录调低到合理的水平(根据程序的不同,这通常是默认设置,并且通常需要确保“调试”和“详细”级别的日志记录已关闭;如果用户所做的每一件事都以准确和详细的细节记录下来,则您的日志记录太详细了)。此外,检查子进程和请求限制,可能风门传入请求、每个 IP 的连接数以及允许的子进程数(如果适用)。

毋庸置疑,您的服务器配置越好、配置越好,这种攻击就越难发生。尤其要避免吝惜 RAM 和 CPU。确保您与后端数据库和磁盘存储等的连接快速可靠。

基于漏洞利用

如果你的服务神秘崩溃得非常快被提起后,特别是如果您可以确定崩溃之前的请求模式,并且请求不典型或与预期的使用模式不符,则您可能正在经历基于漏洞的 DoS。这可能来自少至一台主机(具有几乎任何类型的互联网连接),或多台主机。

这是类似于基于负载的 DoS在许多方面,并且具有基本相同的原因和缓解措施。区别仅在于,在这种情况下,该错误不会导致您的服务器浪费,而是导致服务器崩溃。攻击者通常会利用远程崩溃漏洞,例如导致您的服务中出现空引用或其他问题的乱码输入。

以类似于未经授权的远程访问攻击的方式处理此问题。 防火墙如果可以的话,针对原始主机和流量类型进行分析。 使用验证反向代理如果适用的话。 收集法医证据(尝试捕获一些流量),向供应商提交错误单,并考虑针对来源提出滥用投诉(或法律投诉)。

如果能找到漏洞,这些攻击的发起成本相当低,而且威力很大,但也相对容易追踪和阻止。然而,对基于流量的 DDoS 有用的技术通常对基于漏洞的 DoS 无效。

答案2

如果你是企业,那么你有很多选择。如果你像我一样是个小人物,租用 VPS 或专用服务器来为小型网站提供服务,那么成本很快就会变得难以承受。

根据我的经验,我相信大多数专用和 VPS 提供商不会为您的服务器设置特殊的防火墙规则。但现在,您有几个选择。

内容分发网络 (CDN)

如果您正在运行 Web 服务器,请考虑将其置于 CloudFlare 或 Amazon CloudFront 等 CDN 后面。

CDN 价格昂贵。为了控制成本,请直接从您的服务器提供大型文件(大型图像、音频、视频),而不是通过 CDN。但是,这可能会将您的服务器 IP 地址暴露给攻击者。

私有云

私有云通常是昂贵的企业解决方案,但 Amazon VPC 的设置成本几乎为零。但是,Amazon 的带宽通常很昂贵。如果您负担得起,那么您可以设置 Amazon VPC 的安全组和网络 ACL 以在流量到达您的实例之前阻止它。您应该阻止除 TCP 服务器端口之外的所有端口。

请注意,攻击者仍然可以攻击您的 TCP 服务器端口。如果是 Web 服务器,请考虑使用 nginx 之类的东西,它使用非阻塞 IO 并可以处理大量连接。除此之外,除了确保运行最新版本的服务器软件外,您无能为力。

当你的 TCP 端口受到攻击,所有其他方法都失败时

这是我开发的解决方案,适用于无法隐藏在 CDN 后面的非 Web 服务器,例如 WebSocket、媒体内容/流媒体服务器。CloudFlare 支持 WebSocket,但目前仅适用于企业。

目标是以足够快的速度更改 TCP 侦听端口,使僵尸网络无法跟上,例如每 10 秒一次。这可以通过使用执行端口漫游的简单代理程序来实现。端口序列是伪随机的,但必须基于服务器时间。并且计算服务器时间和端口的算法必须隐藏在客户端 javascript/flash 代码中。程序还应在更改侦听端口时修改防火墙,并且防火墙需要具有状态。如果有人感兴趣,我会将与 Amazon 配合使用的 node.js 脚本上传到 GitHub。

答案3

将您的域名短时间更改为像 0.0.0.0 这样的黑洞。

与服务器提供商联系,看看他们是否可以向您提供另一个 IP 地址作为访问服务器的临时方式,或者看看服务器是否有远程控制台访问权限(就像您坐在它前面一样)。从这里您可以查看它是否是单个 IP 地址并将其从站点阻止或分布式攻击。

答案4

我们之前也遇到过类似的情况。以下是我们所做的。

首先,从服务器上拔下网线。现在,通过查看性能监视器和任务管理器检查服务器服务是否恢复正常。如果没有,请使用 malwarebytes 软件扫描服务器以确保服务器已清理。此步骤通常可确保断开连接的服务器再次恢复正常。

接下来,您是否安装了防火墙?如果是,您是否续订了订阅?请确保在防火墙中启用了 IPS 入侵功能。只需续订防火墙订阅即可解决我们的 DDOS 攻击。

我们了解到,我们应该续订安全订阅(例如防火墙或防病毒软件),不要掉以轻心。DDOS 攻击每天都在发生,小企业也可能遭遇。希望这能有所帮助。

相关内容