我的apache日志中出现了很多这样的请求
www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -
似乎没有请求,也没有用户代理。谁看过这个吗?
我的apache日志中出现了很多这样的请求
www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -
似乎没有请求,也没有用户代理。谁看过这个吗?
Answers:
您是否有机会在Elastic Load Balancer后面的Amazon中运行Web服务器?
该论坛主题中的一些解决方案:
RequestReadTimeout header=0 body=0
如果请求超时,这将禁用408个响应。
使用以下命令禁用ELB IP地址的日志记录:
SetEnvIf Remote_Addr "10\.0\.0\.5" exclude_from_log
CustomLog logs/access_log common env=!exclude_from_log
从这篇博客文章中:
RequestReadTimeout header=0 body=0
会一起禁用请求读取超时,我不建议这样做
某种东西正在连接到端口,然后再也不发送数据。HTTP 408是“超时”错误。这里有一个不错的文章:http : //www.checkupdown.com/status/E408.html
这里已经有很多不错的答案,但是我想提醒您一个尚未具体解决的附加说明。正如许多以前的评论者已经提到的,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,也可能会帮助到这里的其他人寻求所有这些该死的超时错误的解决方案。
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是因为服务器没有响应请求,因此就客户端而言,连接超时,实际上服务器读取请求但由于超时等原因而放弃了连接一个要求。
我们遇到了这个问题,困惑了好一阵子。AWS支持的ELB团队提出了我们想到的最佳解决方案。本质上,这取决于确保httpd服务器的超时设置都大于ELB idle timeout
设置(默认为60秒)。
Timeout
指令值是idle timeout
ELB设置的两倍。KeepAlive
功能,确保该MaxKeepAliveRequests
值非常大(无穷大为0或非常大,例如2000),并且KeepAliveTimeout
大于ELB的值idle timeout
。我们发现KeepAlive
(和相关的设置)设置将408的数量实际上减少到了0(我们看到了一些,但很少)。
我在AWS Elastic Load Balancer背后遇到这个问题。运行状况检查在日志中生成了408个响应。
对我而言唯一有效的解决方案是使Load Balancer的Idle Timeout设置低于其Health Check的Response Timeout。
一位同事最近评论说,尽管我的上一篇文章对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=!dontlog
从CustomLog
指令中删除。
现在,创建以下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日志位于其他位置,请更改路径以适合您的配置。祝好运。