在没有请求或用户代理的情况下在我们的日志中获取408错误

在我们的apache日志中出现了很多请求,看起来像这样

www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" - 

似乎没有要求,也没有用户代理。 有没有人见过这个?

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

由于健康检查,他们似乎产生了很多的答复 。

该论坛的一些解决scheme:

  • RequestReadTimeout header=0 body=0

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

  • 将ELB运行状况检查更改为其他端口。
  • 禁用ELB IP地址的日志logging:

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

从这个博客文章 :

  • 调整您的请求超时为60或以上。

有东西连接到端口,然后永远不会发送数据。 HTTP 408是一个“超时”错误。 这里有一个很好的写作: http : //www.checkupdown.com/status/E408.html

408 Timeout有多种原因。 但是让我们从一切都很好的前提开始,然后在408的开始出现在你的访问日志 – 即408 0 – – “” – “。

就像许多人在网上指出的那样,408表示已build立连接,但没有在适当的时间范围内发送请求,因此服务器断开与408的连接。一个傲慢的个人实际上响应有人在这个问题上寻求帮助 – “你什么都不懂的超时部分”。

我认为这是一个非常新手的答案,并且显示出对Web服务器软件如何使用某些安全方法的完全理解。

所以回到开始,为什么我看到所有这些408。 与我们其他人共同pipe理服务器有一件事是每天收到的大量攻击。 现在,你对这些做了什么? 那么:你使用你select的安全方法来处理它们,这是什么改变。

让我们举一个简单的例子,删除一个IP地址。 包含在一个iptabes文件(rules.v4)中,你有“-A ufw-user-input -s 37.58.64.228 -j DROP”。 所以随着37.58.64.228防火墙识别IP丢弃连接。 在很多configuration中,你甚至不知道它被敲门。

现在我们来看一个更高级的例子,根据一些条件删除连接。 包含在一个iptabes文件(rules.v4)中,你有“-A INPUT -p tcp -m tcp -dport 80 -m string –string”cgi“–algo bm –to 1000 -j DROP”。 这是不同的,因为在这个iptable规则,我们说的请求string的前1000个字节,看看你是否可以find一个“cgi”子string,如果你发现这个子string,然后不去进一步,只要放弃连接。

这里的安全方法是好的,但是就你的日志而言,这是令人误解的。 在这种情况下,生成的408 0“ – ”“ – ”是最好的apache。 连接已经完成,并且请求不得不被接受,以便应用最终导致408的string比较规则,因为您的规则符合要删除的连接的标准。 所以,如果他们尝试,我们小小的新手宝贝也不会错。 已经build立了连接并收到了一个请求(在这种情况下,您将不会看到它)。 尽pipe生成了408,但它不是“超时”。 在请求与您的防火墙规则关联后,您的服务器只是断开连接。 还有许多其他规则,这将创造相同的情况。 服务器错误代码408解释 – 请求超时。

理想情况下,会有另一个Apache生成的错误代码,例如 – '499'这将意味着“服务器读取您的请求,并决定它只是不能打扰娱乐你 – closures哈哈'。

使用最新的networking服务器软件,您几乎可以排除DOS攻击,并且具有预测function的新型浏览器基因不会像某些人所说的那样造成这个问题。

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

这里已经有不less好的答案,但是我想冒另外一个没有具体解决的问题。 正如许多以前的评论者已经提到的那样,408表示超时; 并且在Web服务器上有相当多的超时发生的情况。

这样说,在您的服务器被扫描为漏洞的各种情况下,可能会产生408个错误。 在这种情况下,客户端很less提供用户代理,并且通常会突然终止连接,导致该连接的中止closures,从而可能产生408错误。

例如,假设我是一名卑鄙的黑客,他正在扫描互联网上的计算机,这些计算机仍然容易受到POODLE漏洞的攻击。 因此,我编写了一个脚本,用于打开到大块IP地址的连接,以查找将接受SSL版本3的服务器 – 稍后,我将使用该列表专门扫描POODLE漏洞。 第一个脚本所做的就是使用opensslbuild立一个连接来检查SSLv3,如下所示:

 openssl s_client -connect [IP]:443 -ssl3 

在Apache的许多configuration中,该命令将完全按照您所描述的方式生成408消息。 在我自己的两台服务器上执行这个命令导致访问日志的这个条目:

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

即使在OP没有使用任何forms的负载平衡的情况下,我也想明确地说明,在各种情况下可能发生408个错误 – 一些恶意的,一些指示客户端麻烦,一些指示服务器麻烦。 (我在OP提供的日志中注意到一个本地IP被指定为远程IP,但是OP没有具体提及负载均衡器的使用,所以我不确定OP是否仅仅为了这个目的而使用了不可路由的IP的示范,就像他在URL中所做的那样)

无论如何,即使我的post,如果显然是太晚了,以帮助OP希望它可以帮助其他人谁来到这里寻找解决所有这些该死的超时错误。

我在AWS Elastic Load Balancer后面遇到了这个问题。 运行状况检查在日志中产生了非常多的408个响应。

我唯一的解决scheme是负载平衡器的空闲超时设置低于其运行状况检查的响应超时

我们有这个问题,并且困惑了很长一段时间。 我们提出的最佳解决scheme是由AWS支持的ELB团队提出的。 这基本上取决于确保您的httpd服务器的超时设置都大于您的ELB idle timeout设置(默认为60秒)。

  • 确保您的apache Timeout指令值是ELB的idle timeout设置的两倍。
  • 打开KeepAlivefunction,确保MaxKeepAliveRequests非常大(0表示无限或非常高,例如2000),并且KeepAliveTimeout大于ELB的idle timeout

我们发现KeepAlive (和相关设置)设置专门将408的数量减less到0(我们看到一些,但很less)。

一位同事最近说,虽然我的最后一篇文章给出了一个有效的解释,408如何能够与安全措施联系在一起,但它没有提供任何解决scheme。

pipe道访问日志是我个人的解决scheme。

以下应该在大多数Ubuntuconfiguration上开箱即用,并且对其他Apacheconfiguration的修改最less。 我select了PHP是因为它是最容易理解的。 有两个脚本:第一个防止408写入您的访问日志。 第二个脚本将所有408发送到一个单独的日志文件。 无论哪种方式,结果是在您的访问日志中没有更多的408s。 这是你的select脚本来执行。

使用你最喜欢的文本编辑器,我使用纳米。 打开你有“LogFormat”和“CustomLog”指令的文件。 用平常的#注释掉原稿,并添加以下内容。 您可以在下面的文件中find这些指令。

sudo nano / 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 

注:我不logging我的访问日志中的图像。 在我的etc / apache2 / httpd.conf文件中,我包含了这一行

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

如果这对你没有兴趣,那么从CustomLog指令中删除env=!dontlog

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

sudo nano /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); } } } ?> 

sudo nano /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日志位于其他地方,请更改path以适合您的configuration。 祝你好运。

我发现408数量和频率上的误差都在增加。 它们源自的IP地址范围也在增长(这些被logging到它们自己的单独文件中)。 也有明显的日志模式,显示来自同一组IP的连续408个,这不是由于正常的服务器超时,因为发起者试图以循环模式间隔约2或3秒进行连接(没有等待超时连接尝试)我看到这些简单的DDOS风格的连接尝试。 在我看来,这是一种服务器在线的发起者的确认消息types,然后他们稍后回来使用不同的工具….如果你增加你的超时间隔,你只是给他们一个更大的time_allocation运行他们的黑客程序。