89

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

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

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

4

10 回答 10

196

DDOS 是一系列攻击,它们压倒数据中心的关键系统,包括:

  • 托管中心与 Internet 的网络连接
  • 托管中心的内部网络和路由器
  • 您的防火墙和负载平衡器
  • 您的 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 个请求吗?匿名用户可以访问昂贵的报告吗?

  • 匿名访问验证码:为所有匿名请求实施验证码,以验证用户是个人,而不是 DDOS 机器人。

阻止 DDOS 攻击的最快和最常用的方法是什么?

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

否则,您要做的第一件事是联系您的托管和/或 CDN 提供商并与他们合作(如果他们还没有联系您,已经询问到底发生了什么......)。当 DDOS 发生时,它可能会附带影响托管服务提供商的其他客户,并且提供商可能会承受相当大的压力来关闭您的网站以保护他们的资源。准备好与提供商共享您的日志(任何和所有信息);这些日志与它们的网络监视器相结合,可以共同提供足够的信息来阻止/减轻攻击。

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

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

如果幸运并且您有一个小的固定客户群,您也许能够确定您的有效客户 IP 地址。如果是这种情况,您可能会在短时间内切换到白名单方法。确保您的所有客户都知道这是怎么回事,以便他们在需要从新 IP 访问时可以致电:)


Doug McClean有一些很好的建议:https ://stackoverflow.com/a/1029613/1395668

于 2013-01-30T08:00:17.070 回答
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;
?>
于 2013-01-30T14:41:36.530 回答
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 中拯救你的屁股. 太棒了!

于 2013-02-04T23:23:58.213 回答
5

您不能在 PHP 级别执行此操作。DDOS 是一种向您的网络服务器发送过多请求的攻击。您的网络服务器将在调用您的 PHP 脚本之前拒绝请求。

如果您使用的是 Apache,这里有一些来自 Apache 的提示: http ://httpd.apache.org/docs/trunk/misc/security_tips.html

于 2013-01-29T05:52:26.743 回答
4

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

于 2013-01-29T16:30:50.110 回答
3

您可以在 apache 中为 ddos​​/dos 使用一些插件。好的开始 http://www.debianadmin.com/how-to-protect-apache-against-dosddos-or-brute-force-attacks.html

如果你在 LEMP,你可以在这里查看。 http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

这些都是很好的廉价起点。

于 2013-02-05T00:47:23.620 回答
3

在 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;
}
于 2015-02-19T11:24:56.070 回答
3

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

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

于 2015-04-24T23:17:38.737 回答
3

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 指令以允许服务器在不耗尽资源的情况下处理最大数量的同时连接。

于 2017-08-15T15:21:08.827 回答
2

防DDOS步骤:

  • 最重要的事情是首先识别 ddos​​ 攻击。更早地识别 ddos​​ 攻击意味着对您的服务器更好。
  • 为您的服务器获得更好的可用带宽。始终保持服务器所需的足够带宽。这不会阻止 DDOS 攻击,但需要更长的时间。借此,您将获得一些额外的时间来采取行动。
  • 如果您拥有自己的 Web 服务器,那么您可以通过限制路由器的速率来保护网络参数,添加过滤器以将数据包丢弃到不同的攻击源,更积极地超时一半打开的连接。还设置较低的 SYN、ICMP 和 UDP 洪水丢弃阈值。
  • 如果您对这些事情不太了解,请尽快联系您的托管服务提供商。他们可以尽力阻止 DDOS 攻击。
  • Cloudflare和许多其他公司也提供特殊的 DDOS 缓解服务。它们可以帮助您防止 DDOS 攻击。许多公司还提供廉价的ddos​​ 保护dos 保护
于 2016-11-29T17:09:03.213 回答