在我的日志监视记录中,这些记录一直在稳步增长:
408 Request Timeout
null: 694 Time(s)
在我的网络服务器上。
/var/log/apache2/access.log
以下是访问日志中的一些类似贡献请求的内容:
ip - - date requestsfor"-"? httpcode bytes referrer useragent
75.149.117.146 - - [28/Jan/2013:17:49:47 -0500] "-" 408 0 "-" "-"
65.55.215.247 - - [28/Jan/2013:17:57:40 -0500] "-" 408 0 "-" "-"
205.157.206.75 - - [28/Jan/2013:18:00:21 -0500] "-" 408 0 "-" "-"
正常访问请求示例当然有更多相关信息,例如:
ip - - date request-for httpcode bytes referrer useragent
66.251.23.171 - - [28/Jan/2013:17:45:41 -0500] "GET /images/al/al-mb0608tn.jpg HTTP/1.1" 200 4085 "http://example.com/brands.php?F=S&BrandCode=AL" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"
在这里查看我的访问日志的更大样本(有一些正常的 get 请求,其余的都是 408)
我在 ips 上做了反向 IP 查找,它们似乎来自美国和加拿大的不同位置。我想这可能只是意味着涉及代理?有一大块来自:
96.42.74.117 - - [18/Feb/2013:02:55:58 -0500] "-" 408 0 "-" "-"
经常重复。
我犹豫要不要下结论说这是一次攻击而不是错误,但是记录的探测数量大约在同一时间一直在稳步增加,例如logwatch也说
A total of 125 sites probed the server
107.22.9.89
108.132.76.100
108.172.60.59
108.226.133.142
12.166.56.82
12.54.94.24
....不断地列出对服务器使用检测到的探针的各种ips。列为“探测”服务器的 ips 与访问日志为 null 的 ips 有一些重叠,因此这可能表明存在攻击,但由于服务器必须为请求提供服务,因此很难判断是否合法DOS 请求超时攻击超时,如果这就是这里发生的情况。
我该如何调试这个问题,或者如果是攻击,如何处理这个攻击?
根据我所做的一些研究,这些是导致
408
消息的一些可能性。您可以测试每一个以确定与您的案例相关的一个。1) 非常低的 Apache
TIMEOUT
值——您的 Web 服务器可能在客户端有机会发送请求之前结束会话。访问日志中的 408 错误代码太多
2)
browser predictive optimization
- 您可以使用不同的浏览器轻松测试它。只需这样做tail -f /var/log/apache2/access.log
,在使用相关关键字将您的网站显示在第一个搜索页面上时,将鼠标悬停在指向您网站的链接上,检查是否出现网站预览......所有这些都无需单击打开您网站的链接.http://forum.linode.com/viewtopic.php?f=10&t=8048
3)
denial of service attack
- ddos 预热,例如slow loris
可以打开太多与服务器的连接,而不会发送一个字节来占用所有 Apache 进程。http://blog.spiderlabs.com/2011/07/advanced-topic-of-the-week-mitigating-slow-http-dos-attacks.html
以上链接的引述 -
“诀窍是打开与服务器的连接但不发送单个字节。打开连接并等待攻击者几乎不需要任何资源,但它会永久绑定一个 Apache 进程以耐心等待请求。Apache 会一直等到超时到期,然后关闭连接。从 Apache 1.3.31 开始,请求行超时记录到访问日志(状态代码为 408)。请求行超时消息出现在错误日志中,并带有级别信息。Apache 2不会将此类消息记录到错误日志中,但正在努力添加与 1.x 分支中存在的相同功能。”
大多数 408 代码服务器响应似乎是由于客户端超时而不是向前看。我排除了上述案例、我的服务器和引用的文章中的拒绝服务,因为点击次数很少。我已经尝试过,但无法通过 OS X 下的 Safari、Chrome 或 Firefox 中的前瞻性重现任何 408 错误。我在大多数月份也没有在本地(非公共)服务器上看到它们,如果它们出现是正常的浏览器行为。可能是浏览器通过打开连接并且从不将它们用于请求来向前看,但我没有看到这种行为有足够的普遍性来解释这些公共服务器上的 408 数量。
我在一个包含 47 个 IP 的列表上进行了 DNS 主机查找,该列表收到了 408 个响应,但日志中没有来自一个使用频率较低的公共服务器的已识别资源、代理或请求大小。我忽略了另外 67 个 IP,它们仅在最后一个元组上有所不同,并在每组中用第一个元组表示它们。所以这是 47 个不同的客户端网络/ISP。Apache 的TimeOut 默认是60 秒。在 47 个中,有 20 个生成了机器名称。在这些机器中,有 10 台 (50%) 在中国大陆,5 台在美国(25% 和所有俄亥俄州、俄克拉荷马州和新罕布什尔州),还有 5 台在巴西、英国、意大利和台湾 (ROC)。我还怀疑没有产生机器名称的 27 个 IP 中有很大一部分也在中国,但无法证明这一点。
在被忽略的 67 个 IP 中,有 63 个是百度蜘蛛:baiduspider-*.crawl.baidu.com仅适用于谷歌)。
如果是现代浏览器的行为导致了它们,我预计美国的比例会更高。我登录的服务器在湾区。相反,我认为这主要是网络拥塞导致连接设置时间过长,并允许在 Apache 断开连接或超时之前发送和接收完整请求。特别是由于需求增长、跨境带宽不足和中国国家防火墙基础设施导致的极度拥堵。它也可能是故意伪造的连接重置,但没有理由为此期望。其余的是连接不良或其他地方设备情况不佳的家庭用户。
我认为问题主要是客户端连接问题,但您可能希望有一个和解的、非图形的 408 错误页面。尽管根据出站响应日志中显示的 0 大小来判断,Apache 并未使用错误页面。
就我而言,Apache 正在超载。答案是关闭KeepAlive并增加 apache.conf 中的 MaxClients。
当我修改我的 FastCGI 服务器的 Apache 配置时,我遇到了这个问题。
将
-idle-timeout
值从 60 增加到 900 让我睡不着觉,因为我无法将 408 错误追溯到这个小变化。很高兴我最终通过将其恢复为 60 来修复它。