如何启用DDoS保护?


85

通常在服务器级别阻止DDoS(分布式拒绝服务攻击),对吗?

有没有办法在PHP级别上阻止它,或者至少减少它?

如果没有,阻止DDoS攻击的最快,最常见的方法是什么?


从没有更好的方面开始,这里列出了可能有帮助的Apache模块。但是,它似乎并不十分丰富,并且四个项目(按“ dos”进行搜索)似乎指向无处。
Audrius Meskauskas


当系统无法再处理攻击所引发的所有请求时,DDOS成功。如果您在应用程序中添加了检查每个请求是否“这是DDOS攻击”的代码,则该代码实际上弊大于利,因为每个请求只占用更多资源。无论如何,这仅在非常严格的环境中有效,在该环境中匿名请求arent仍然允许。
雨果·德辛

Answers:


188

DDOS是一系列攻击,它们淹没了数据中心的关键系统,其中包括:

  • 托管中心与互联网的网络连接
  • 托管中心的内部网络和路由器
  • 您的防火墙和负载平衡器
  • 您的Web服务器,应用程序服务器和数据库。

在开始构建DDOS防御之前,请考虑一下最坏情况下的风险价值是什么。对于小型社区的非关键,免费使用的服务,总的风险价值可能是花生。对于一个已建立的数十亿美元业务的付费,面向公众的,关键任务系统,其价值可能就是公司的价值。在后一种情况下,您不应该使用StackExchange :)无论如何,要防御DDOS,您需要一种深度防御方法:

  1. 与您的托管中心合作,以了解他们提供的服务,包括他们与Internet的网络连接处的IP和端口过滤以及他们提供的防火墙服务。这很关键:托管公司将许多站点从Internet撤出,因为托管公司处理DDOS对一个客户造成的整个数据中心范围的中断。另外,在DDOS攻击期间,您将与托管中心的工作人员非常紧密地合作,因此请了解他们的紧急电话号码并与他们保持良好的关系:)他们应该能够阻止整个国际区域,完全阻止特定的服务或网络协议和其他广谱防御措施,或者仅允许列入白名单的IP(取决于您的业务模型)
  2. 在托管中心上时-使用内容交付网络在最终用户附近分发(主要是静态的)服务,并向DDOS架构师隐藏真正的服务器。完整的CDN太大了,DDOS无法提取所有国家/地区的所有节点。如果DDOS集中在一个国家,则至少其他用户仍然可以。
  3. 使用最新的安全补丁更新所有系统和软件包-我的意思是全部:

    • 托管交换机-是的,有时有时需要更新
    • 路由器
    • 防火墙
    • 负载均衡器
    • 操作系统
    • 网络服务器
    • 语言及其库
  4. 确保你有一个好的防火墙或安全设备设置,并定期由合格的安全专家审查。防火墙上的严格规则可以很好地抵御许多简单的攻击。能够管理每个开放服务可用的带宽也很有用。

  5. 拥有良好的网络监控工具-这可以帮助您了解:

    • 遭受攻击,而不只是承受沉重的负担
    • 攻击的来源(可能包括您通常不与之开展业务的国家)和
    • 攻击实际上是什么(端口,服务,协议,IP和数据包内容)
  6. 攻击可能只是大量使用合法的网站服务(例如,击中运行查询的“合法” URI或插入/更新/删除数据)-来自成千上万个不同IP地址的成千上万个请求会将网站带到其膝盖 另外,某些服务可能运行起来非常昂贵,以至于只有很少的请求会导致DOS-想想一个非常昂贵的报告。因此,您需要对正在发生的事情进行良好的应用程序级别监视

    • 调用了哪些服务以及发送了哪些参数/数据(即登录您的应用程序)
    • 哪些用户正在执行调用以及从哪个IP(即登录您的应用程序)
    • 数据库正在执行哪些查询和插入/更新/删除操作
    • 系统中所有计算机(和VM)上的平均负载,CPU利用率,磁盘I / O,网络流量
    • 确保所有这些信息都易于检索,并且您可以关联来自不同计算机和服务的日志(即,确保所有计算机都使用ntp进行时间同步)。
  7. 您的应用程序中的合理约束和限制。例如,您可能会:

    • 使用负载平衡器中的QoS功能,将所有匿名会话发送到群集中的单独应用程序服务器,而已登录用户则使用另一组。这样可以防止应用程序级匿名DDOS吸引有价值的客户
    • 使用强大的CAPCHA保护匿名服务
    • 会话超时
    • 对某些类型的请求(例如报告)设置会话限制或速率限制。确保必要时可以关闭匿名访问
    • 确保用户对并发会话数有限制(以防止被黑客入侵的帐户登录一百万次)
    • 具有不同的数据库应用程序用户以提供不同的服务(例如,交易性使用与报告性使用),并使用数据库资源管理来防止一种类型的Web请求压倒所有其他请求
    • 如果可能的话,使这些约束成为动态的,或者至少是可配置的。这样,在受到攻击时,您可以设置积极的临时限制(“限制”攻击),例如每个用户只有一个会话,而不能进行匿名访问。对于您的客户来说,这当然不是很好,但比根本没有服务要好得多。
  8. 最后但并非最不重要的一点是,编写DOS响应计划文档,并由所有相关方进行内部审查:业务,管理,软件开发团队,IT团队和安全专家。编写文档的过程将使您和您的团队仔细考虑问题,并帮助您做好准备,如果最糟糕的事情应该在一天的凌晨3点发生。该文件应涵盖(除其他事项外):

    • 面临什么风险以及业务成本
    • 为保护资产采取的措施
    • 如何检测到攻击
    • 计划的响应和升级程序
    • 保持系统和本文档为最新的过程

因此,撇开序言,这里有一些具体答案:

DDOS通常在服务器级别被阻止,对吗?

并非如此-大多数最严重的DDOS攻击都是低级(在IP数据包级别),并由为处理DDOS攻击而开发的路由规则,防火墙和安全设备来处理。

有没有办法在PHP级别上阻止它,或者至少减少它?

一些DDOS攻击针对应用程序本身,发送有效的URI和HTTP请求。当请求率上升时,您的服务器开始出现问题,并且SLA中断。在这种情况下,您可以在PHP级别上做一些事情:

  • 应用程序级别监视:确保每个服务/页面都以能够查看正在发生的方式记录请求(以便您可以采取措施减轻攻击)。一些想法:

    • 具有一种日志格式,您可以轻松地将其加载到日志工具(或Excel或类似工具)中,并使用命令行工具(grep,sed,awk)进行解析。请记住,DDOS将生成数百万行的日志。您可能需要对日志进行切片(尤其是关于URI,时间,IP和用户),以弄清正在发生的事情,并需要生成如下数据:

      • 正在访问哪些URI
      • 哪些URI失败率很高(攻击者正在攻击的特定URI的可能指标)
      • 哪些用户正在访问服务
      • 每个用户从多少个IP访问服务
      • 匿名用户正在访问哪些URI
      • 给定服务使用了哪些参数
      • 审核特定用户的操作
    • 记录每个请求的IP地址。请勿反向DNS-具有讽刺意味的是,这样做的成本使攻击者更容易使用DDOS

    • 记录整个URI和HTTP方法,例如“ GET http://example.com/path/to/service?arg1=ddos
    • 记录用户ID(如果有)
    • 记录重要的HTTP参数
  • 合理的速率限制:您可以对给定IP或用户在给定时间内可以发出的请求数量实施限制。合法客户每秒可以发出10个以上的请求吗?匿名用户可以访问所有昂贵的报告吗?

  • 用于匿名访问的CAPTCHA:对所有匿名请求实施CAPTCHA,以验证用户是个人,而不是DDOS bot。

阻止DDOS攻击的最快,最常见的方法是什么?

最快的可能是屈服于勒索,尽管这可能不是理想的。

否则,您要做的第一件事就是联系您的托管和/或CDN提供商并与他们合作(如果他们还没有联系您,则已经在问这到底是怎么回事...)。发生DDOS时,可能会附带影响托管提供商的其他客户,并且提供商可能会承受巨大的压力,仅出于保护其资源的目的而关闭您的站点。准备与提供者共享您的日志(所有信息);这些日志及其网络监视器可以共同提供足够的信息来阻止/缓解攻击。

如果您期望使用DDOS,则最好让您的主机提供商在其提供的保护级别上合格。他们应该具有DDOS经验和减轻它的工具-了解他们的工具,过程和升级程序。还询问托管服务提供商从其上游提供商那里获得了哪些支持。这些服务可能意味着更多的前期或每月费用,但请将其视为保险单。

在受到攻击时,您将需要获取日志并进行挖掘-尝试找出攻击的模式。您应该考虑关闭匿名访问并限制受到攻击的服务(即降低应用程序对服务的速率限制)。

如果幸运的话,您有一个固定的小型客户群,则可以确定有效的客户IP地址。如果是这种情况,您可能会在短时间内切换到白名单方法。确保所有客户都知道这种情况在继续,以便他们在需要从新IP访问时可以打电话:)


道格·麦克林(Doug McClean)在以下方面提供了一些很好的建议:https : //stackoverflow.com/a/1029613/1395668


20

根据问题的PHP部分;

尽管我不依赖PHP,但是可以实现它,但是需要考虑所有这些可能性或更多。

  1. 攻击者可能会为每个请求更改IP
  2. 攻击者可能会将参数传递给目标站点不在乎这些参数的URI
  3. 攻击者可能会在到期前重新启动会话...

简单伪

<?php
// Assuming session is already started
$uri = md5($_SERVER['REQUEST_URI']);
$exp = 3; // 3 seconds
$hash = $uri .'|'. time();
if (!isset($_SESSION['ddos'])) {
    $_SESSION['ddos'] = $hash;
}

list($_uri, $_exp) = explode('|', $_SESSION['ddos']);
if ($_uri == $uri && time() - $_exp < $exp) {
    header('HTTP/1.1 503 Service Unavailable');
    // die('Easy!');
    die;
}

// Save last request
$_SESSION['ddos'] = $hash;
?>

8

php级别在请求链中为时已晚。

将apache服务器放在开源设备后面可能是一个不错的选择。

http://tengine.taobao.org/提供了一些文档和源代码以及更多旨在防止DDOS的模块。它是nginx的扩展,因此您可以轻松地将其设置为apache实例的反向代理。

请参阅:http : //blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/,了解如何对抗具有DoS攻击的冲突。

也完全忘记了,http://www.cloudflare.com是顶级的免费Web应用程序防火墙之一,它们有免费的和付费的计划,并且会从DDOS中省掉您的钱,我们将其用于大量的高流量站点,只是因为它具有缓存功能。太棒了!



5

DDoS最好由非常昂贵的专用网络设备来处理。主机通常不擅长DDoS防护,因为它们的性能相对较低,状态耗尽,带宽有限等。如果无法访问DDoS缓解硬件,在某些情况下使用iptables,apache mods和类似服务可能会有所帮助或DDoS缓解服务,但它远非理想之选,仍然使您有遭受攻击的风险。


8
我们需要一个解决方案,如果没有理想的解决方案,则需要部分解决方案。没有人需要那种“您做不到”的建议。
2013年

5

在PHP方面怎么样呢?

//if user does not change IP, then ban the IP when more than 10 requests per second are detected in 1 second
$limitps = 10;
if (!isset($_SESSION['first_request'])){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}
$_SESSION['requests']++;
if ($_SESSION['requests']>=10 && strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request'])<=1){
    //write the IP to a banned_ips.log file and configure your server to retrieve the banned ips from there - now you will be handling this IP outside of PHP
    $_SESSION['banip']==1;
}elseif(strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request']) > 2){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}

if ($_SESSION['banip']==1) {
    header('HTTP/1.1 503 Service Unavailable');
    die;
}

1
有这个代码的一些错误:10是硬编码的,不需要在服务器和会话变量的strtotime,和$ _SESSION [“ban_up”] == 1应该是= 1
贾森银


2

千万不要使用基于PHP的保护,这是可怕的,几乎不会有根本影响!将您的Web服务器配置为对请求进行速率限制,例如在Nginx中使用limit_req模块(http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

虽然,我建议您使用CloudFlare来抵抗第4层-但不要使用基于第7层的攻击,除非您愿意付费。


是的,我在这里的工作相当好,我的经验softwareengineeringsolutions.co.uk/...
猫王Ciotti

2

通常在服务器级别阻止DDOS,请在服务器级别启用DDOS保护。请检查以下注意事项以获取DDOS保护。

可帮助防止DDOS问题的Apache HTTP Server配置设置:

RequestReadTimeout指令允许限制客户端发送请求所花费的时间。

等待10秒以接收请求,包括标头,等待30秒以接收请求正文:

RequestReadTimeout header=10 body=30

至少等待10秒钟以接收请求正文。如果客户端发送数据,则每接收1000个字节将超时增加1秒,没有超时上限(LimitRequestBody间接给出的限制除外):

RequestReadTimeout body=10,MinRate=1000

RequestReadTimeout header=10-30,MinRate=500
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

在遭受DoS攻击的站点上,还可以降低KeepAliveTimeout指令。有些站点甚至通过KeepAlive完全关闭了keepalive,这当然在性能上还有其他缺点。应检查其他模块提供的与超时相关的各种指令的值。

应当仔细配置指令LimitRequestBody,LimitRequestFields,LimitRequestFieldSize,LimitRequestLine和LimitXMLRequestBody,以限制客户端输入触发的资源消耗。调整MaxRequestWorkers指令以允许服务器处理最大同时连接数而不会耗尽资源。


2

反DDOS步骤:

  • 首先重要的是首先确定ddos攻击。尽早识别ddos攻击对您的服务器意味着更好。
  • 获得更好的服务器可用带宽。始终保持超过服务器所需带宽的足够带宽。这不会阻止DDOS攻击,但是会花费更长的时间。借此您将有更多的时间采取行动。
  • 如果您拥有自己的Web服务器,则可以通过限制路由器的速率来防御网络参数,添加过滤器以将数据包丢弃到不同的攻击源,更积极地使一半打开的连接超时。同时设置较低的SYN,ICMP和UDP洪流丢弃阈值。
  • 如果您对这些事情不太了解,请迅速与您的托管服务提供商联系。他们可以尽最大努力防止DDOS攻击。
  • Cloudflare和许多其他公司还提供特殊的DDOS缓解服务。通过它们可以帮助您防止DDOS攻击。许多公司还提供廉价的ddos保护dos保护
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.