新睿云

> DDoS高防云服务器 > 防护DDoS,我们应当从哪几个方向着手?

防护DDoS,我们应当从哪几个方向着手?

作者/来源:新睿云小编 发布时间:2019-08-21

DDoS防御与DDoS攻击双方总是此消彼长,每一位系统管理员都为自己能够抵御DDoS攻击而自豪,因为这是对自己水平肯定。

面对现在DDoS泛滥的问题,新睿云把这里把自身的经验和小技巧分享给您!让您的网站避免遭受攻击,虽然它不一定是觉得的好用,但绝对可以让您避免受到大多数攻击风险。

DDoS

以下是新睿云这里总结的技巧:

1.尽量避免使用Windows Server

实践表明,在DDoS的情况下,在Windows上运行的站点(2003或2008 都一样)容易遭受DDoS攻击。使用Windows难以抵抗的原因就是网络堆栈:当存在大量连接时,服务器肯定会开始响应不佳。我们不知道为什么Windows Server在这种情况该怎么避免,或许是系统本身底层的问题,但我们遇到过这种情况不止一两次。因此,本文将重点讲述在Linux上运行时对DDoS攻击的防护。如果你是一个相对新内核(2.6以上版本)的使用着,那么iptables和ipset实用程序(用于快速添加IP地址)作为主要工具,您可以使用它快速禁止机器人。

2.如非必要可以放弃Apache

第二个重要条件是放弃Apache。Apache从根本上(简直不可救药)容易受到最危险的Slowloris攻击,这种攻击几乎可以充斥服务器。为了对抗各种类型的Slowloris,Apache用户首先发明了Anti-slowloris.diff补丁,然后是mod_noloris,然后是mod_antiloris,mod_limitipconn,mod_reqtimeout ...但是如果你想在晚上安静地睡觉,那么在架构层面上采用对Slowloris无懈可击的HTTP服务器会更容易代码。因此,我们所有进一步的配方都基于nginx用于前端的假设。

抵御DDoS

如果DDoS来了怎么办?传统的自我防御技术是读取HTTP服务器的日志文件,为grep编写模式(捕获机器人请求)并禁止任何属于它的人。运气好的话这项技术将有效。僵尸网络有两种类型,一种是快速打死你网站服务器,另一种则让您时断时续。第一个一次杀死所有内容,但所有内容都完全出现在日志中,如果您对它们进行编程并禁止所有IP地址,那么您就是胜利者。第二个僵尸网络轻轻缓缓侵蚀您的网站,但你必须禁止它,也许是一天,也许是几天。对任何管理员来说都很重要:如果你计划与grep战斗,你必须准备好花几天时间来对抗攻击。

3.使用testcookie模块

也许是本文最重要,最有效和最可操作的配方。如果DDoS进入您的站点,那么testcookie-nginx模块可以成为最有效的反击方式由Habrauser @kyprizel开发。这个想法很简单。大多数情况下,实现HTTP泛洪的僵尸程序非常愚蠢,并且没有HTTP cookie和重定向机制。有时会遇到更高级的 - 这些可以使用cookie并处理重定向,但几乎从来没有DoS机器人不带有完整的JavaScript引擎(尽管这越来越常见)。在L7 DDoS攻击期间,Testcookie-nginx可用作机器人和后端之间的快速过滤器,允许您过滤掉垃圾请求。这些支票包含哪些内容?客户端是否知道如何执行HTTP重定向,它是否支持JavaScript,它是否是它声称的浏览器(因为JavaScript在各处都是不同的,如果客户端说它是,比如Firefox,那么我们可以检查它)。使用不同方法使用cookie实现验证:

“Set-Cookie”+使用301 HTTP位置重定向;

使用HTML元刷新“Set-Cookie”+重定向;

任意模板,你可以使用JavaScript。

为了避免自动解析,验证cookie可以使用AES-128加密,然后在JavaScript的客户端解密。新版本的模块能够通过Flash设置cookie,这也允许您有效地过滤掉机器人(Flash通常不支持),但它也阻止了许多合法用户(几乎所有移动设备)的访问。值得注意的是,开始使用testcookie-nginx非常简单。特别是,开发人员使用nginx的配置样本提供了几个可理解的使用示例(针对各种攻击案例)。

除了优点,testcookie还有缺点:

削减所有机器人,包括Googlebot。如果您打算持续离开testcookie,请确保您不会从搜索结果中消失;

使用Links,w3m浏览器等为用户创建问题;

不能从装备有成熟浏览器引擎的机器人中获取JavaScript。

简而言之,testcookie_module并不普及。但是从许多方面来看,例如Java和C#中的原始工具包,它会有所帮助。因此,你切断了部分威胁。

4.代码444

DDoS的目标通常成为网站资源最密集的部分。典型示例是执行复杂数据库查询的搜索。当然,攻击者可以通过立即向搜索引擎收取数万个查询来利用这一点。我们能做什么?暂时禁用搜索。让客户端无法使用内置工具搜索必要的信息,但整个主站点将保持运行状态,直到找到所有问题的根源。Nginx支持非标准代码444,它允许您简单地关闭连接而不返回任何内容:

location /search { return 444; }

因此,例如,可以通过URL快速实现过滤。如果您确定位置/搜索请求仅来自僵尸程序(例如,您的信心基于您的站点根本没有/搜索部分这一事实),您可以在服务器上安装ipset程序包并使用简单的shell脚本禁用机器人:

ipset -N ban iphash tail -f access.log | while read LINE; do echo "$LINE" | / cut -d'"' -f3 | cut -d' ' -f2 | grep -q 444 && ipset -A ban "${L%% *}"; done

如果日志文件的格式是非标准的(未组合),或者您希望在响应状态之外的其他基础上禁用它,则可能需要使用正则表达式替换cut。

5.禁止使用地理标记

非标准响应代码444对于基于地理的客户端的操作禁止也是有用的。您可以严格限制您感到不舒服的个别国家/地区。比如说,顿河畔罗斯托夫的在线相机商店不太可能在埃及有很多用户。这不是一个好方法(坦率地说 - 恶心),因为GeoIP数据不准确,而Rostovites有时会在度假时飞往埃及。但如果您没有任何损失,请按照说明操作:

连接nginx GeoIP模块(wiki.nginx.org/HttpGeoipModule)。

在访问日志中打印地理位置信息。

此外,修改上面的shell脚本,编写nginx accesslog并将按地理标志踢出的客户端添加到禁令中。

例如,如果机器人主要来自中国,那么这可能会有所帮助。

6.神经网络(PoC)

最后,你可以重复使用神经网络PyBrain的haberuser @SaveTheRbtz的经验,填写日志并分析请求(habrahabr.ru/post/136237)。该方法正在工作,虽然不是通用的:)。但是,如果您真的了解您网站的内部 - 而且您作为系统管理员应该 - 那么您有可能在最悲惨的情况下,基于神经网络的工具,预先收集的培训和信息将对您有所帮助。在这种情况下,在DDoS启动之前拥有access.log是非常有用的,因为它描述了几乎100%的合法客户端,因此,它是用于训练神经网络的优秀数据集。此外,日志中的眼睛并不总是可以看到机器人。

诊断问题

该网站不起作用 - 为什么?它是DDoS还是引擎的错误,程序员没有注意到?没关系。不要寻找这个问题的答案。如果您认为您的站点可能受到攻击,请联系提供防攻击保护的公司 - 连接后的第一天免费提供一些反DDoS服务 - 并且不会花更多时间搜索症状。专注于问题。如果网站运行缓慢或根本没有打开,则表示性能有问题,并且 - 无论DDoS攻击是否正在进行 - 作为专业人员,您必须了解导致该问题的原因。我们一再目睹一家公司因DDoS攻击而在网站运营方面遇到困难,而不是寻找网站引擎的弱点,试图向内务部发送声明,以查找和惩罚攻击者。不要犯这样的错误。搜索网络犯罪分子是一个困难而漫长的过程,因为互联网的结构和原则而变得复杂,必须及时解决网站的问题。请技术专家了解网站性能下降的原因,律师可以撰写声明。

7.使用分析器和调试器

对于最常见的网站创建平台 - PHP + MySQL - 您可以使用以下工具寻找瓶颈:

Xdebug探查器将显示应用程序花费最多时间的调用;

内置的APD调试器和调试输出到错误日志将有助于确定哪些代码进行这些调用;

在大多数情况下,狗被埋没在数据库查询的复杂性和沉重性中。内置于数据库引擎中的SQL explain指令在这里有所帮助。

如果站点位于您的背后并且您没有丢失任何内容,请断开与网络的连接,查看日志,尝试丢失它们。如果它没有说谎,那么浏览页面,看看基地。

为PHP提供了一个示例,但该想法适用于任何平台。以任何编程语言编写软件产品的开发人员应该能够快速使用调试器和分析器。提前练习!

8.分析错误

分析流量,服务器响应时间,错误数量。为此,请参阅日志。在nginx中,服务器响应时间在日志中由两个变量固定:request_time和upstream_response_time。第一个是总查询执行时间,包括用户和服务器之间的网络延迟;第二个告诉你有多少后端(Apache,php_fpm,uwsgi ...)执行了请求。对于具有大量动态内容和与数据库进行主动前端通信的站点,upstream_response_time的值非常重要,不应忽略。您可以使用以下配置作为日志格式:

log_format xakep_log '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" $request_time / $upstream_response_time';

这是一个带有附加时序字段的组合格式。

9.每秒跟踪请求

另请查看每秒的请求数。对于nginx,您可以使用以下shell命令粗略估计此值(ACCESS_LOG变量包含组合格式的nginx查询日志的路径):

echo $(($(fgrep -c "$(env LC_ALL=C date --date=@$(($(date / +%s)-60)) +%d/%b/%Y:%H:%M)" "$ACCESS_LOG")/60))

与当天这个时间的正常水平相比,每秒的请求数量可以下降和增长。如果大型僵尸网络到达,它们会增长,如果僵尸网络到达会导致网站崩溃,使合法用户完全无法访问,并且僵尸网络不会请求静态,但合法用户请求它,它们会下降。由于静力学,精确地观察到请求数量的下降。但是,无论如何,我们都在谈论指标的严重变化。当这种情况突然发生时 - 当您试图自己解决问题时,如果您没有立即在日志中看到它,最好快速检查引擎,同时咨询专家。

10.不要忘记tcpdump

很多人忘了tcpdump是一个时髦的诊断工具。我将举几个例子。2011年12月,当Linux内核打开与SYN和RST TCP段标志设置的TCP连接时,发现了一个错误。来自俄罗斯的系统管理员,其资源受到此方法的攻击,是第一个发送错误报告的人 - 攻击者比全世界更早地了解了漏洞。显然,这样的诊断对他有帮助。另一个例子:nginx有一个不太令人愉快的属性 - 它只在请求完全处理后写入日志。有些情况下,网站撒谎,没有任何工作,日志中没有任何内容。这是因为当前正在加载服务器的所有请求尚未完成。Tcpdump也会在这里提供帮助。

我建议人们在确保一切都井井有条之前不要使用二进制协议,因为文本协议很容易用tcpdump调试,而二进制协议则不行。然而,嗅探器作为一种诊断工具是很好的 - 作为维持生产的一种手段,它是可怕的。它可能很容易一次丢失几个包,并破坏您的用户历史记录。观察它的结论很方便,它对于手动诊断和禁用会派上用场,但尽量不要根据它做任何重要的事情。“抓取请求”的另一个最喜欢的工具 - ngrep - 通常默认情况下它会尝试请求大约2千兆字节的非可复制内存,然后才开始降低其要求。

11.攻击与否?

例如,如何区分DDoS攻击与广告活动的影响?这个问题可能看起来很荒谬,但这个话题同样复杂。有很好奇的案例。一些好人,当他们紧张起来并彻底搞砸缓存时,该网站瘫痪了几天。事实证明,几个月来,一些德国人悄悄地对这个网站进行了数据处理,在优化网站页面的缓存之前,这些德国人已经装了很长时间了。当页面立即从缓存中开始发布时,没有超时的机器人也开始立即收集它们。这很难。这个案子特别复杂,因为如果你自己改变了设置(开启了缓存)并且网站在此之后停止了工作,那么你认为谁应该责怪你呢?你去吧

Web服务器调优

还有什么其他要点?当然,你可以把“默认”nginx,并希望一切都会好起来的。但是,好的情况永远不会发生。因此,任何服务器的管理员都应该花费大量时间来微调和调优nginx。

12.限制nginx中的资源(缓冲区大小)

你需要先记住什么?每个资源都有一个限制。首先,这涉及RAM。因此,标头和所有缓冲区的大小必须受到客户端和整个服务器的足够值的限制。它们必须在nginx配置中注册。

client_header_buffer_size__指定用于读取客户端请求标头的缓冲区大小。如果查询行或请求头字段不完全适合此缓冲区,则会分配由large_client_header_buffers指令指定的较大缓冲区。

large_client_header_buffers指定用于读取大型客户端请求标头的缓冲区的最大数量和大小。

client_body_buffer_size指定用于读取客户端请求正文的缓冲区的大小。如果请求主体大于指定的缓冲区,则整个请求主体或仅部分请求主体将写入临时文件。

client_max_body_size指定在请求标头的“Content-Length”字段中指定的客户端请求主体的最大允许大小。如果大小大于指定值,则将错误413(请求实体太大)返回给客户端。

13.在nginx中配置超时

资源也是时间。因此,下一个重要步骤应该是安装所有超时,这对于在nginx设置中仔细注册非常重要。

reset_timedout_connection on; 帮助处理陷入FIN-WAIT阶段的套接字。

client_header_timeout设置读取客户端请求标头时的超时。

client_body_timeout设置读取客户端请求正文时的超时。

keepalive_timeout指定在服务器端不会关闭与客户端的保持连接的超时。许多人害怕在这里设定大价值,但我们不确定这种恐惧是否合理。(可选)您可以在Keep-Alive HTTP标头中设置超时值,但Internet Explorer因忽略此值而闻名。

send_timeout设置向客户端发送响应时的超时。如果在此时间之后客户端不接受任何内容,则将关闭连接。

问题:缓冲区和超时的哪些参数是正确的?这里没有通用的配方,在每种情况下它们都是不同的。但是有一种行之有效的方法。您需要设置站点保持健康状态(在平时)的最小值,即,给出页面并处理请求。这只能通过测试来确定 - 包括台式机和移动设备。每个参数值(缓冲区大小或超时)的搜索算法:

我们在数学上设置参数的最小值。

我们开始测试网站的运行。

如果所有站点的功能都没有问题,则定义参数。如果不是,请增加参数值并转到步骤2。

如果参数值超过默认值,则可以在开发团队中进行讨论。

在某些情况下,修改这些参数应导致网站的重构/重新设计。例如,如果站点在没有三分钟AJAX长轮询请求的情况下不起作用,那么您不需要增加超时,而是用其他东西替换长轮询 - 一台2万台机器的僵尸网络,挂起请求三分钟,将很容易杀死一般的廉价服务器。

14.限制与nginx的连接(limit_conn和limit_req)

Nginx还能够限制连接,请求等。如果您不确定网站的某个部分将如何表现,那么理想情况下您需要对其进行测试,了解它将承受多少请求,并将其写入nginx配置中。当网站撒谎并且你能够来接它时,这是一回事。还有一件事 - 当他躺下到服务器进入交换的程度时。在这种情况下,重启通常比等待其胜利回归更容易。

假设该网站包含具有口述名称/下载和/搜索的部分。通过这样做,我们:

我们不希望机器人(或者热心的递归下载管理器的人)用他们的下载来敲定我们的TCP连接表;

我们不希望机器人(或搜索引擎爬虫)通过大量搜索查询耗尽DBMS计算资源。

出于这些目的,以下配置适合:

http { limit_conn_zone $binary_remote_addr zone=download_c:10m; limit_req_zone $binary_remote_addr zone=search_r:10m / rate=1r/s; server { location /download/ { limit_conn download_c 1; # Прочая конфигурация location } location /search/ { limit_req zone=search_r burst=5; # Прочая конфигурация location } } }

通常,为执行起来很有效的脚本所在的位置设置限制limit_conn和limit_req是有直接意义的(示例显示了搜索,这不是偶然的)。必须根据负载和回归测试的结果以及常识来选择限制。

请注意示例中的10m参数。这意味着将分配缓冲区为10兆字节且不超过兆字节的字典来计算此限制。在此配置中,这将跟踪320,000个TCP会话。为了优化占用的内存,$ binary_remote_addr变量用作字典中的一个键,它包含二进制形式的用户IP地址,占用的内存比常规$ remote_addr字符串变量少。应该注意的是,limit_req_zone指令的第二个参数不仅可以是IP,而且可以是此上下文中可用的任何其他nginx变量 - 例如,在您不希望为代理提供更多备用模式的情况下,可以使用$ binary_remote_addr $ http_user_agent或$ binary_remote_addr $ http_cookie_myc00kiez - 但谨慎使用此类结构,

DDoS趋势

网络和传输级攻击的力量不断增长。平均SYN泛洪攻击的可能性已达到每秒1000万个数据包。

最近,DNS攻击的需求量很大。使用欺骗性源IP地址进行有效DNS查询的UDP泛洪是最容易实施且难以抵御攻击的方法之一。许多大型俄罗斯公司(包括托管公司)最近因其DNS服务器受到攻击而遇到问题。越远,这种攻击就越多,它们的力量也会增长。

从外部标志来看,大多数僵尸网络不是集中控制的,而是通过点对点网络控制的。这使得攻击者有机会及时同步僵尸网络的行动 - 如果早些时候控制团队在数十分钟内分布在5千辆汽车的僵尸网络上,现在它需要几秒钟,您的站点可以突然体验到请求数量的瞬间增加百倍。

配备完整JavaScript浏览器引擎的机器人比例仍然很小,但它在不断增长。使用内置的即兴手段来排除这种攻击更加困难,因此Samodelkins应该小心监视这一趋势。

准备操作系统

除了微调nginx之外,还需要注意系统的网络堆栈设置。至少 - 立即在sysctl中包含net.ipv4.tcp_syncookies以保护自己免受小型SYN-flood攻击。

15.调整核心

在超时和内存中再次注意网络部分(内核)的更高级设置。更重要也更重要。首先,你需要注意:

net.ipv4.tcp_fin_timeout套接字在TCP阶段FIN-WAIT-2中花费时间(等待FIN / ACK段)。

net.ipv4.tcp _ {,r,w} memTCP套接字接收缓冲区大小。三个值:最小值,默认值和最大值。

net.core。{r,w} mem_max对于非TCP缓冲区也是如此。

对于100 Mbit / s的通道,默认值仍然是合适的;但如果你每秒至少有一个吉比特,那么最好使用类似的东西:

sysctl -w net.core.rmem_max=8388608 sysctl -w net.core.wmem_max=8388608 sysctl -w net.ipv4.tcp_rmem='4096 87380 8388608' sysctl -w net.ipv4.tcp_wmem='4096 65536 8388608' sysctl -w net.ipv4.tcp_fin_timeout=10

16.修订/ proc / sys / net / **

非常适合学习所有/ proc / sys / net / **选项。您需要了解它们与默认值的不同之处,并了解它们的暴露程度。Linux开发人员(或系统管理员)精通受他影响并希望对其进行优化的Internet服务的工作,应该感兴趣地阅读内核网络堆栈的所有参数的文档。也许他会发现那些特定于站点的变量不仅有助于保护站点免受入侵者的侵害,而且还可以加速其工作。

如果想要知道更多抵御DDoS的知识请阅读《所有黑客都能进行20GDDoS攻击?本文详细讲述黑客界的“等级链”

本文总结于俄罗斯《黑客杂志》,新睿云小编总结翻译!

热门标签
免费领云产品

免费用

立即领取
联系客服
在线客服   
反馈意见
返回顶部
{{item.description}}

—您的烦恼我们已经收到—

我们会将处理结果发送至您的手机

请耐心等待