在没有请求或用户代理的情况下,我们的日志中出现408个错误


Answers:


29

您是否有机会在Elastic Load Balancer后面的Amazon中运行Web服务器?

似乎由于他们的健康检查,他们产生了很多408响应

该论坛主题中的一些解决方案:

  • RequestReadTimeout header=0 body=0

    如果请求超时,这将禁用408个响应。

  • 将ELB运行状况检查更改为其他端口。
  • 使用以下命令禁用ELB IP地址的日志记录:

    SetEnvIf Remote_Addr "10\.0\.0\.5" exclude_from_log
    CustomLog logs/access_log common env=!exclude_from_log
    

这篇博客文章中

  • 将您的请求超时时间调整为60或更高。

2
以我的理解,这会让您容易受到慢虫的攻击,对于使用apache的人来说,如今像样的reqtimeout似乎很有用
neofutur 2014年

如果您在ELB后面,则慢速运动不是问题。
Ladadadada 2014年

2
RequestReadTimeout header=0 body=0会一起禁用请求读取超时,我不建议这样做
mikejonesey '16

@Ladadadada我认为您仍然需要缓慢的loris保护,因为http可以作为tcp代理使用,https如果被卸载将转发http请求而不是tcp,但是没有用于慢速连接的过滤器,响应只有超时。
mikejonesey '16

@Ladadadada,您错了,ELB或ALB几乎无济于事,无济于事,它会影响大多数Web服务器,请参阅此处的我的AWS问题:forums.aws.amazon.com/thread.jspa?threadID=269176
克里斯蒂亚诺·科埃略

9

某种东西正在连接到端口,然后再也不发送数据。HTTP 408是“超时”错误。这里有一个不错的文章:http : //www.checkupdown.com/status/E408.html


1
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
kasperd 2015年

刚刚查找了100个IP列表,它们接收到408个空请求,发现其中大部分来自中国大陆,我怀疑问题主要与拥塞有关。导致连接建立成功的拥塞,但未发送请求标头。来自中国的跨境宽带非常超负荷,非大陆的连接也空了,原因是来自巴西,欧洲和美国农村的零星散布,这在到达美国西海岸服务器时似乎也存在类似的问题。
ClearCrescendo 2015年

8

这里已经有很多不错的答案,但是我想提醒您一个尚未具体解决的附加说明。正如许多以前的评论者已经提到的,408表示超时;而且在很多情况下,Web服务器上都会发生超时。

如此说来,在各种情况下(正在扫描您的服务器的漏洞)可能会产生408错误。在这种情况下,客户端很少提供用户代理,并且常常会突然终止连接,从而导致该连接异常终止,从而可能会产生408错误。

例如,假设我是一个卑鄙的黑客,他正在Internet上扫描仍容易受到POODLE漏洞攻击的计算机。这样,我编写了一个脚本,该脚本打开与大块IP地址的连接,以查找将接受SSL版本3的服务器-稍后,我将使用该列表来扫描POODLE漏洞。第一个脚本所做的全部工作就是使用openssl建立连接以检查SSLv3,如下所示:

openssl s_client -connect [IP]:443 -ssl3

在许多Apache配置中,此命令将完全按照您的描述生成408消息。在我自己的两台服务器上执行此命令导致访问日志中出现以下条目:

<remote IP address>  - - [04/Nov/2015:08:09:33 -0500] "-" 408 - "-" "-"

我想说清楚这一点,即使在OP未使用任何形式的负载平衡的情况下,在各种情况下也可能会发生408错误-有些是恶意的,有些表示客户端有问题,有些则表示服务器有问题。(我在OP提供的日志中注意到,本地IP被指示为远程IP,但是OP没有具体提及负载平衡器的使用,因此我不确定OP是否只是出于此目的使用了非路由IP演示,就像他对URL所做的一样)

无论如何,即使我的帖子显然在一天中为时过晚而无法帮助OP,也可能会帮助到这里的其他人寻求所有这些该死的超时错误的解决方案。


6

408超时有多种原因。但是,让我们从一切都很好的前提开始,然后在某些时候,这些408开始出现在您的访问日志中-即408 0“-”“-”。

就像网上指出的那样,408代表建立了连接,但没有在适当的时间范围内发送请求,因此服务器断开了与408的连接。一个傲慢的人实际上是通过以下方式回应某人寻求帮助的-“您不了解超时的哪一部分”。

我认为这几乎是一个新手答案,并且显示出完全缺乏对某些安全方法如何与Web服务器软件一起工作的理解。

回到开始,为什么我会看到所有这些408。您与我们管理服务器的其他人的共同点是您每天收到的大量攻击。现在,您如何处理这些?好吧:您采用了自己选择的安全方法来应对它们,这就是改变。

让我们举一个非常简单的示例,删除IP地址。iptabes文件(rules.v4)中包含“ -A ufw-user-input -s 37.58.64.228 -j DROP”。随之而来的是37.58.64.228,防火墙可以识别IP并断开连接。在许多配置中,您甚至都不知道它已经敲门。

现在让我们举一个更高级的示例,根据某些条件删除连接。在iptabes文件(rules.v4)中,您具有“ -A INPUT -p tcp -m tcp --dport 80 -m字符串--string“ cgi” --algo bm --to 1000 -j DROP“。这是不同的,因为在此iptable规则中,我们要说的是查看请求字符串的前1000个字节,看看是否可以找到“ cgi”的子字符串,如果确实找到了该子字符串,则不要继续此外,只需断开连接。

这里的安全方法是好的,但是就您的日志而言,具有误导性。在这种情况下,生成的408 0“-”“-”是最好的Apache。建立了连接,必须应用到一个点才能接受请求,以便应用字符串比较规则,最终结果为408,因为您的规则满足要删除的连接标准。因此,我们的新手小宝贝如果尝试过,那就不会错了。建立了连接并收到了请求(在这种情况下,您只是看不到它)。尽管生成了408,但它不是“超时”;发出与防火墙规则关联的请求后,您的服务器只是断开了连接。还有许多其他规则,它们会产生相同的408情况。不要

理想情况下,将有另一个Apache生成的错误代码,例如-“ 499”,这意味着“服务器读取了您的请求并决定了它不会让您感到烦恼-离开HaHa”。

使用最新的Web服务器软件,您几乎可以排除DOS攻击,并且某些人已经暗示,具有预测功能的浏览器新基因不会导致此问题。

简而言之,生成408是因为服务器没有响应请求,因此就客户端而言,连接超时,实际上服务器读取请求但由于超时等原因而放弃了连接一个要求。


2
但是为什么会断开连接?我们看到的是服务器日志,而不是客户端日志。
埃里克·罗伯逊

5

我们遇到了这个问题,困惑了好一阵子。AWS支持的ELB团队提出了我们想到的最佳解决方案。本质上,这取决于确保httpd服务器的超时设置都大于ELB idle timeout设置(默认为60秒)。

  • 确保您的apache Timeout指令值是idle timeoutELB设置的两倍。
  • 启用该KeepAlive功能,确保该MaxKeepAliveRequests值非常大(无穷大为0或非常大,例如2000),并且KeepAliveTimeout大于ELB的值idle timeout

我们发现KeepAlive(和相关的设置)设置将408的数量实际上减少到了0(我们看到了一些,但很少)。


不幸的是,我正在使用Elastic Beanstalk。我没有可用的这些选项。
艾里克·罗伯逊

3

我在AWS Elastic Load Balancer背后遇到这个问题。运行状况检查在日志中生成了408个响应。

对我而言唯一有效的解决方案是使Load Balancer的Idle Timeout设置低于Health Check的Response Timeout


0

一位同事最近评论说,尽管我的上一篇文章对408如何与安全措施进行关联给出了有效的解释,但它没有提供解决方案。

管道访问日志是我的个人解决方案。

在大多数Ubuntu配置中,以下各项应即开即用,而在其他Apache配置上的修补则应最少。我选择PHP是因为它最容易理解。有两个脚本:第一个阻止将408写入您的访问日志。第二个脚本将所有408发送到单独的日志文件。无论哪种方式,结果都不会在您的访问日志中显示408s。您可以选择实施哪个脚本。

使用您喜欢的文本编辑器,我使用nano。打开具有“ LogFormat”和“ CustomLog”指令的文件。用通常的#注释掉原稿,然后添加以下内容。您可以在下面的文件中找到这些指令。

须藤纳米/ etc / apache2 / sites-available / default

LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" AccessLogPipe

CustomLog "|/var/log/apache2/PipedAccessLog.php" AccessLogPipe env=!dontlog

注意:我没有在访问日志中记录图像。在我的etc / apache2 / httpd.conf文件中,包括以下行

SetEnvIfNoCase Request_URI ".(gif)|(jpg)|(png)|(css)|(js)|(ico)$" dontlog

如果您对此不感兴趣,则将其env=!dontlogCustomLog指令中删除。

现在,创建以下PHP脚本之一(#!/usr/bin/php是对解释器位置的引用,请确保该位置对您的系统是正确的-您可以通过在$提示符下键入来完成;whereis php-这应返回php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz。可以看到#!/usr/bin/php适合我的设置)。

须藤纳米/var/log/apache2/PipedAccessLog.php

#!/usr/bin/php
<?php
  $file = '/var/log/apache2/access.log';
  $no408 = '"-" 408 0 "-" "-"';
  $stdin = fopen ('php://stdin', 'r');
  ob_implicit_flush (true);
  while ($line = fgets ($stdin)) {
    if($line != "") {
      if(stristr($line,$no408,true) == "") {
        file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
      }
    }
  }
?>

须藤纳米/var/log/apache2/PipedAccessLog.php

#!/usr/bin/php
<?php
  $file = '/var/log/apache2/access.log';
  $file408 = '/var/log/apache2/408.log';
  $no408 = '"-" 408 0 "-" "-"';
  $stdin = fopen ('php://stdin', 'r');
  ob_implicit_flush (true);
  while ($line = fgets ($stdin)) {
    if($line != "") {
      if(stristr($line,$no408,true) != "") {
        file_put_contents($file408, $line, FILE_APPEND | LOCK_EX);
      }
      else {
        file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
      }
    }
  }
?>

保存PipedAccessLog.php脚本;通过在$提示符下执行以下命令,确保root拥有所有权。

sudo chown -R root:adm /var/log/apache2/PipedAccessLog.php

PipedAccessLog.php脚本将需要读/写和执行权限,因此在$提示符下执行以下命令。

sudo chmod 755 /var/log/apache2/PipedAccessLog.php

最后,要使所有功能正常运行,您需要重新启动Apache服务。在$提示符下执行以下命令。

sudo service apache2 restart

如果您的Apache日志位于其他位置,请更改路径以适合您的配置。祝好运。


6
如果408发生了,我们需要找出原因并消除它们。简单地防止它们被记录或将它们传送到另一个文件就是浪费服务器时间。它还仅用于隐藏问题。这就像将所有东西推到床下打扫房间一样。
埃里克·罗伯森

-2

我发现408错误的数量和频率都在增加。它们源自的IP地址范围也在不断扩大(这些日志记录到它们自己的单独文件中)。还有明显的日志模式显示来自同一IP组的连续408,这不是由于正常的服务器超时引起的,因为发起方尝试以周期性模式间隔大约2或3秒尝试连接(没有等待另一个之前的超时)连接尝试),我将这些视为简单的DDOS风格的连接尝试。在我看来,这是向发件人的确认消息,表明服务器已联机...然后它们会使用其他工具返回...。如果您增加超时间隔,则只是给它们更大的time_allocation即可运行他们的黑客程序。

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.