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