我在DDoS下。 我能做什么?

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

我在今天主持的网站上发现了一个巨大的stream量高峰; 我每秒获得数千个连接,而且我看到我正在使用全部100Mbps的可用带宽。 没有人可以访问我的网站,因为所有的请求超时,我甚至不能login到服务器,因为SSH超时! 这已经发生了几次,每次都持续了几个小时,然后自行消失。

有时候,我的网站有另外一个不同的但相关的问题:我的服务器的平均负载(通常在.25左右),火箭高达20或更多,没有人可以访问我的网站,就像其他情况一样。 几个小时后它也会消失。

重新启动我的服务器没有帮助; 我能做些什么使我的网站再次访问,发生了什么?

与此相关的是,我曾经发现,有一两天,每次我开始服务时,都会从一个特定的IP地址获得连接,然后崩溃。 一旦我再次启动,这又发生了,它再次坠毁。 这有什么相似的,我能做些什么呢?

    您正在经历拒绝服务攻击。 如果您看到来自多个networking的stream量(不同子网上的不同IP),则会出现分布式拒绝服务(DDoS); 如果它们都来自同一个地方,那么你有一个普通的旧DoS。 如果可以的话,检查是有帮助的; 使用netstat来检查。 虽然这可能很难做到。

    拒绝服务通常分为几类:基于stream量的和基于负载的。 最后一项(崩溃的服务)是基于漏洞的DoS,而且是完全不同的。

    如果您试图确定发生了什么types的攻击,您可能需要捕获一些stream量(使用wireshark,tcpdump或libpcap)。 如果可能的话,您应该知道,您可能会捕获相当多的stream量。

    通常情况下,这些将来自僵尸networking(在一些攻击者的中央控制下,他们会这样做)的受损主机的networking。 这是攻击者(非常便宜地)获取不同networking上的许多不同主机的上行带宽来攻击你的好方法,同时覆盖他们的踪迹。 低轨道离子炮是一个僵尸networking的例子(尽pipe是自愿的,而不是恶意软件)。 宙斯是一个更典型的。

    基于stream量

    如果您使用的是基于stream量的拒绝服务攻击(DoS),则会发现您的服务器上只有很多stream量因此与Internet的连接已经完全饱和。 从其他地方ping您的服务器时会有很高的数据包丢失率,并且(取决于正在使用的路由方法),有时您也会看到非常高的延迟(ping很高)。 这种攻击通常是一个DDoS。

    虽然这是一个非常“大声”的攻击,而且很明显发生了什么,服务器pipe理员很难减轻(共享主机的用户基本上不可能减轻)。 你将需要你的ISP的帮助; 让他们知道你正在使用DDoS,他们可能会提供帮助。

    但是,大多数ISP和运输服务提供商会主动地意识到发生了什么,并为您的服务器发布黑洞路由 。 这意味着他们通过0.0.0.0尽可能低的成本发布一条到你的服务器的路由:它们使你的服务器的stream量不能再通过Internet进行路由。 这些路由通常是/ 32s,并最终被删除。 这完全不能帮助你; 目的是保护ISP的networking不受洪水侵袭。 在此期间,您的服务器将实际上失去Internet访问权限。

    如果您的ISP(或您,如果您拥有自己的AS)能够提供帮助,唯一的方法就是他们正在使用可以检测和限制可能的DDoSstream​​量的智能stream量整形器。 不是每个人都有这种技术。 但是,如果stream量来自一个或两个networking或一个主机,则它们也可能会阻止您前面的stream量。

    总之,这个问题你可以做的很less 。 最好的长期解决scheme是在互联网上的许多不同地点托pipe你的服务,这将不得不单独和同时进行DDoS,使得DDoS更加昂贵。 这个战略取决于你需要保护的服务; DNS可以使用多个权威域名服务器,具有备份MXlogging和邮件交换器的SMTP,以及使用循环DNS或多重归属的HTTP进行保护(但是,无论如何,某些降级可能会引起注意)。

    对于这个问题,负载平衡器很less有效的解决scheme,因为负载平衡器本身也会遇到同样的问题,只会造成一个瓶颈。 IPTables或其他防火墙规则将无济于事,因为问题在于您的pipe道已饱和。 一旦防火墙看到连接,就已经太晚了 。 到您的网站的带宽已被消耗。 不pipe你用连接做什么, 当传入的stream量回落到正常时,攻击被缓解或完成。

    如果可以,请考虑使用Akamai,Limelight和CDN77等内容分发networking (CDN),或使用CloudFlare或Prolexic等DDoS清理服务。 这些服务采取积极的措施来减轻这些types的攻击,并且在许多不同的地方也有如此多的可用带宽,使其泛滥成灾并不普遍。

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

    此外,一些VPS和托pipe服务提供商在缓解这些攻击方面比其他的更好。 一般来说,他们越大,他们会越好。 一个拥有很多带宽的提供商自然会更有弹性,而一个拥有一支活跃且人员配备齐全的networking运营团队的提供商将能够更快地做出反应。

    基于负载

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

    这种攻击是基于使你的服务做了很多昂贵的东西。 这可能是像打开大量的TCP连接,迫使你为他们维护状态,或者上传过多或者大量的文件到你的服务,或者做了真正的昂贵的search,或者真正做任何代价高昂的事情。 stream量在你计划和可以承担的范围之内,但是所做的请求types太昂贵,无法处理这么多的stream量。

    首先,这种types的攻击是可能的,通常表明您的服务中存在configuration问题或错误 。 例如,您可能打开了过于详细的日志logging,并可能将日志存储在写入速度非常慢的事件上。 如果有人意识到这一点,并做了很多事情导致你写大量的日志到磁盘,你的服务器将慢慢爬行。 某些input情况下,您的软件可能也会做一些非常低效的事情; 原因和程序一样多,但是有两个例子会导致你的服务不能closures一个完成的会话,导致它产生一个subprocess并离开它。 如果最终有成千上万的与国家开放的连接跟踪,或成千上万的subprocess,你会遇到麻烦。

    你可以做的第一件事是使用防火墙来丢弃stream量 。 这并不总是可能的,但是如果有一个特性,你可以在传入的stream量中find(tcpdump可以很好,如果stream量很小),你可以把它放在防火墙,它不会再造成麻烦。 另一个要做的就是修复你的服务中的错误(与供应商联系并准备好长时间的支持体验)。

    但是, 如果这是一个configuration问题,请从这里开始 。 closures生产系统上的日志logging到一个合理的水平(取决于程序通常是默认的,通常涉及确保“debugging”和“详细”的日志logging级别closures;如果用户所做的一切都login在确切的和细节,你的日志logging太冗长)。 此外, 检查subprocess和请求限制 ,可能会限制传入的请求,每个IP的连接数以及允许的subprocess数(如果适用)。

    不言而喻,configuration越好,服务器configuration越好,这种攻击就越困难。 避免对RAM和CPU特别小心。 确保您与后端数据库和磁盘存储之间的连接快速可靠。

    利用基于

    如果你的服务在被提出后神秘地崩溃 ,特别是如果你能build立一个在崩溃之前的请求模式,并且请求是非典型的或者与预期的使用模式不匹配的话,你可能会遇到一个基于漏洞的DoS。 这可以来自只有一个主机(几乎没有任何types的互联网连接)或许多主机。

    这在很多方面类似于基于负载的DoS ,并且具有基本相同的原因和缓解。 不同的是,在这种情况下,错误不会导致你的服务器浪费,而是死亡。 攻击者通常利用一个远程崩溃漏洞,比如在您的服务中导致null-dereference或者其他东西的乱码input。

    类似于未经授权的远程访问攻击来处理。 针对始发主机的防火墙和可以固定的stream量types。 如果适用, 请使用validation反向代理收集法庭证据 (试图捕获一些stream量),向卖方提交错误通知单,并考虑针对原产地提交滥用投诉(或法律投诉)。

    这些攻击相当便宜,如果可以find漏洞,它们可以非常有效,但也相对容易追踪和停止。 然而,对基于stream量的DDoS有用的技术对于基于漏洞的DoS通常是无用的。

    如果你是一个企业,你有很多select。 如果你是一个像我这样的小家伙,租用一个VPS或专用服务器来服务一个小型网站,成本很快就会变得过高。

    根据我的经验,我相信大多数专用和V​​PS提供商不会为您的服务器设置专门的防火墙规则。 但是现在,你有几个select。

    CDN

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

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

    私有云

    私有云通常是昂贵的企业解决scheme,但亚马逊VPC成本几乎没有设置。 但是,亚马逊的带宽一般来说是昂贵的。 如果您可以负担得起,那么您可以设置Amazon VPC的安全组和networkingACL,以阻止stream量到达您的实例之前。 您应该阻止除TCP服务器端口之外的所有端口。

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

    当您的TCP端口被攻击,并且所有其他失败

    这是我开发的解决scheme,适用于不能隐藏在CDN后面的非Web服务器,如WebSocket,媒体内容/stream媒体服务器。 CloudFlare目前支持WebSocket,但仅限于企业。

    我们的目标是尽快改变你的TCP侦听端口,僵尸networking不能跟上,每10秒钟一次。 这是通过使用执行端口漫游的简单代理程序来完成的。 端口序列是伪随机的,但必须基于服务器时间。 而计算服务器时间和端口的algorithm必须隐藏在客户端的JavaScript / flash代码中。 该程序还应修改防火墙,因为它更改侦听端口,防火墙需要有状态。 如果有人有兴趣,我会上传我的Node.js脚本,与亚马逊合作,GitHub。

    改变你的域名在短时间内进入0.0.0.0这样的黑洞。

    向服务器提供信息,看看他们是否可以使用另一个IP地址作为访问服务器的临时方式,或者查看服务器是否具有远程控制台访问权限(就像坐在它的前面一样)。 从这里你可以看到它是否是一个单一的IP地址,并阻止它从网站或分布式攻击。