我在我们的 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 "-" "-" -
似乎没有请求,也没有用户代理。有没有人见过这个?
您是否有机会在 Amazon 的 Elastic Load Balancer 后面运行您的 Web 服务器?
由于他们的健康检查,他们似乎产生了很多 408 响应。
该论坛帖子中的一些解决方案:
RequestReadTimeout header=0 body=0
如果请求超时,这将禁用 408 响应。
使用以下命令禁用 ELB IP 地址的日志记录:
从这篇博文中:
这里已经有很多不错的答案,但我想冒昧地补充一点尚未具体解决的问题。正如之前的许多评论者已经提到的那样,408 表示超时;并且有相当多的情况会在 Web 服务器上发生超时。
话虽如此,在对您的服务器进行漏洞扫描的各种情况下,都可能会生成 408 错误。在这种情况下,客户端很少提供用户代理,并且经常突然终止连接,从而导致该连接异常关闭,从而产生 408 错误。
例如,假设我是一个卑鄙的黑客,正在互联网上扫描仍然容易受到 POODLE 漏洞攻击的计算机。因此,我编写了一个脚本来打开与大块 IP 地址的连接,以找到将接受 SSL 版本 3 的服务器——稍后我将使用该列表专门扫描 POODLE 漏洞。第一个脚本所做的就是使用 openssl 建立连接以检查 SSLv3,如下所示:
在 Apache 的许多配置中,此命令将产生与您所描述的完全相同的 408 消息。在我自己的两台服务器上执行此命令导致访问日志中出现以下条目:
我想说清楚,因为即使在 OP 没有使用任何形式的负载平衡的情况下,408 错误也可能在各种情况下发生——有些是恶意的,有些表示客户端有问题,有些表示服务器有问题。(我在 OP 提供的日志中注意到本地 IP 被指示为远程 IP,但 OP 没有特别提到负载均衡器的使用,所以我不确定 OP 是否只是为了这个目的使用了不可路由的 IP演示,就像他对 URL 所做的那样)
无论如何,即使我的帖子在当天显然太晚了,无法帮助 OP,但希望它可以帮助到达这里的其他人寻找所有这些该死的超时错误的解决方案。
有东西连接到端口,然后从不发送数据。HTTP 408 是一个“超时”错误。这里有一篇很好的文章:http: //www.checkupdown.com/status/E408.html
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 --string "cgi" --algo bm --to 1000 -j DROP”。这是不同的,因为在这个 iptable 规则中,我们说查看请求字符串的前 1000 个字节,看看是否可以找到“cgi”的子字符串,如果找到该子字符串,则不要进行任何操作此外,只需断开连接。
这里的安全方法很好,但就您的日志而言,它具有误导性。生成的 408 0 "-" "-" 是 apache 在这些情况下可以做的最好的事情。已建立连接并且必须在一定程度上接受请求才能应用最终导致 408 的字符串比较规则,因为您的规则符合要删除连接的条件。所以,如果我们的小新手宝贝们尝试的话,他们就不会错了。建立了连接并收到了请求(在这种情况下您将看不到它)。虽然生成了 408,但它不是“超时”;在根据您的防火墙规则发出请求后,您的服务器只是断开了连接。还有许多其他规则会产生相同的 408 情况。大学教师'
理想情况下,会有另一个 Apache 生成的错误代码,例如 - “499”,这意味着“服务器读取你的请求并决定它只是无法打扰你 - Sod Off HaHa”。
使用最新的网络服务器软件,您实际上可以排除 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 响应。
唯一对我有用的解决方案是让负载均衡器的空闲超时设置低于其健康检查的响应超时。
一位同事最近评论说,虽然我的上一篇文章给出了 408 如何与安全措施相关联的有效解释,但它没有提供任何解决方案。
管道访问日志是我个人的解决方案。
以下内容应该在大多数 Ubuntu 配置上开箱即用,并且对其他 Apache 配置进行最少的修改。我选择了 PHP,因为它最容易理解。有两个脚本:第一个防止 408 被写入您的访问日志。第二个脚本将所有 408 发送到一个单独的日志文件。无论哪种方式,结果都不会在您的访问日志中出现 408。您可以选择实施哪个脚本。
使用你最喜欢的文本编辑器,我使用 nano。打开包含“LogFormat”和“CustomLog”指令的文件。用通常的 # 注释掉原件并添加以下内容。您可以在下面的文件中找到这些指令。
sudo nano /etc/apache2/sites-available/default
注意:我不在我的访问日志中记录图像。在我的 etc/apache2/httpd.conf 文件中,我包含了这一行
如果您对此不感兴趣,请
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
适合我的设置)。sudo nano /var/log/apache2/PipedAccessLog.php
sudo nano /var/log/apache2/PipedAccessLog.php
保存
PipedAccessLog.php
脚本;通过在 $ 提示符下执行以下命令确保 root 拥有所有权。该
PipedAccessLog.php
脚本需要读/写和执行权限,因此在 $ 提示符下执行以下命令。最后,为了使一切正常,您需要重新启动 Apache 服务。在 $ 提示符下执行以下操作。
如果您的 Apache 日志位于其他位置,则更改路径以适合您的配置。祝你好运。
我发现 408 错误的数量和频率都在增加。它们源自的 IP 地址范围也在扩大(这些记录到它们自己的单独文件中)。也有明显的日志模式显示来自同一组 IP 的连续 408,这不是由于正常的服务器超时,因为发起者以循环模式尝试连接大约 2 或 3 秒(没有等待超时之前另一个连接尝试)我将这些视为简单的 DDOS 样式连接尝试。在我看来,这些是服务器在线的发起者的一种确认消息......然后他们稍后会使用不同的工具回来......如果你增加超时间隔,你只是给他们一个更大的 time_allocation 来运行他们的黑客程序。