DDoS(分布式拒绝服务攻击)通常在服务器级别被阻止,对吗?
有没有办法在 PHP 级别阻止它,或者至少减少它?
如果没有,阻止 DDoS 攻击的最快和最常用的方法是什么?
DDoS(分布式拒绝服务攻击)通常在服务器级别被阻止,对吗?
有没有办法在 PHP 级别阻止它,或者至少减少它?
如果没有,阻止 DDoS 攻击的最快和最常用的方法是什么?
DDOS 是一系列攻击,它们压倒数据中心的关键系统,包括:
在开始构建 DDOS 防御之前,请考虑最坏情况下的风险价值是什么。对于小型社区的非关键、免费使用服务,风险的总价值可能微不足道。对于已建立的数十亿美元业务的付费、面向公众的关键任务系统,其价值可能就是公司的价值。在后一种情况下,您不应该使用 StackExchange :) 无论如何,要防御 DDOS,您需要一种深度防御方法:
使用最新的安全补丁更新您的所有系统和软件包- 我的意思是所有这些:
确保您设置了良好的防火墙或安全设备,并由合格的安全专家定期审查。防火墙上的强规则可以很好地防御许多简单的攻击。能够管理每个开放服务的可用带宽也很有用。
拥有良好的网络监控工具- 这可以帮助您了解:
攻击可能只是大量使用合法网站服务(例如,点击运行查询或插入/更新/删除数据的“合法”URI)——来自数千万到数百万个不同 IP 地址的数千或数百万个请求会将网站带到它的膝盖。或者,某些服务的运行成本可能非常高,以至于只有少数请求会导致 DOS - 认为这是一个非常昂贵的报告。因此,您需要对正在发生的事情进行良好的应用程序级别监控:
应用程序中的合理约束和限制。例如,您可能:
最后但并非最不重要的一点是,编写一份DOS 响应计划文档,并由所有相关方进行内部审查:业务、管理、软件开发团队、IT 团队和安全专家。编写文档的过程将使您和您的团队仔细考虑问题,并帮助您做好准备,以防最坏的情况发生在您休息日的凌晨 3 点。该文件应涵盖(除其他外):
所以,除了序言,这里有一些具体的答案:
DDOS 通常在服务器级别被阻止,对吗?
并非如此 - 大多数最严重的 DDOS 攻击都是低级别的(在 IP 数据包级别),并由为处理 DDOS 攻击而开发的路由规则、防火墙和安全设备处理。
有没有办法在 PHP 级别阻止它,或者至少减少它?
一些 DDOS 攻击针对应用程序本身,发送有效的 URI 和 HTTP 请求。当请求率上升时,您的服务器开始挣扎,您将遇到 SLA 中断。在这种情况下,您可以在 PHP 级别执行以下操作:
应用程序级别监控:确保每个服务/页面都以您可以看到正在发生的事情的方式记录请求(这样您就可以采取措施来减轻攻击)。一些想法:
拥有可以轻松加载到日志工具(或 Excel 或类似工具)中的日志格式,并使用命令行工具(grep、sed、awk)进行解析。请记住,DDOS 将生成数百万行日志。您可能需要对您的日志进行切片(尤其是关于 URI、时间、IP 和用户)以了解正在发生的事情,并且需要生成以下数据:
记录每个请求的 IP 地址。不要反向 DNS - 具有讽刺意味的是,这样做的成本使攻击者更容易进行 DDOS
合理的速率限制:您可以对给定 IP 或用户在给定时间段内可以发出的请求数实施限制。合法客户每秒可以发出超过 10 个请求吗?匿名用户可以访问昂贵的报告吗?
匿名访问验证码:为所有匿名请求实施验证码,以验证用户是个人,而不是 DDOS 机器人。
阻止 DDOS 攻击的最快和最常用的方法是什么?
最快的可能是屈服于勒索,尽管这可能是不可取的。
否则,您要做的第一件事是联系您的托管和/或 CDN 提供商并与他们合作(如果他们还没有联系您,已经询问到底发生了什么......)。当 DDOS 发生时,它可能会附带影响托管服务提供商的其他客户,并且提供商可能会承受相当大的压力来关闭您的网站以保护他们的资源。准备好与提供商共享您的日志(任何和所有信息);这些日志与它们的网络监视器相结合,可以共同提供足够的信息来阻止/减轻攻击。
如果您期待 DDOS,最好让您的托管服务提供商获得他们可以提供的保护级别的资格。他们应该有 DDOS 经验和缓解它的工具 - 了解他们的工具、流程和升级程序。还要询问托管服务提供商从其上游提供商那里获得了哪些支持。这些服务可能意味着更多的前期或每月费用,但将其视为保险单。
在受到攻击时,您需要获取日志并挖掘它们 - 尝试找出攻击的模式。您应该考虑关闭匿名访问并限制受到攻击的服务(即降低应用程序对服务的速率限制)。
如果幸运并且您有一个小的固定客户群,您也许能够确定您的有效客户 IP 地址。如果是这种情况,您可能会在短时间内切换到白名单方法。确保您的所有客户都知道这是怎么回事,以便他们在需要从新 IP 访问时可以致电:)
Doug McClean有一些很好的建议:https ://stackoverflow.com/a/1029613/1395668
根据问题的PHP部分;
虽然我不依赖 PHP,但它可以实现但需要考虑所有这些可能性或更多;
简单的伪;
<?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;
?>
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 中拯救你的屁股. 太棒了!
您不能在 PHP 级别执行此操作。DDOS 是一种向您的网络服务器发送过多请求的攻击。您的网络服务器将在调用您的 PHP 脚本之前拒绝请求。
如果您使用的是 Apache,这里有一些来自 Apache 的提示: http ://httpd.apache.org/docs/trunk/misc/security_tips.html
DDoS 最好由非常昂贵的专用网络设备来处理。主机通常不擅长进行 DDoS 保护,因为它们会受到性能相对较低、状态耗尽、带宽有限等的影响。如果您无法访问 DDoS 缓解硬件,则在某些情况下使用 iptables、apache mods 和类似服务会有所帮助或 DDoS 缓解服务,但它远非理想,仍然使您面临攻击风险。
您可以在 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
这些都是很好的廉价起点。
在 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;
}
不要使用基于 PHP 的保护,这太可怕了,几乎不会产生影响!将您的网络服务器配置为对请求进行速率限制,例如在 Nginx 中使用 limit_req 模块 ( http://nginx.org/en/docs/http/ngx_http_limit_req_module.html )
虽然,我建议使用 CloudFlare 来对抗第 4 层 - 但除非您愿意付费,否则不要使用基于第 7 层的攻击。
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 指令以允许服务器在不耗尽资源的情况下处理最大数量的同时连接。
防DDOS步骤: