我们的 DMZ 中有一个 apache 实例,它配置为将请求代理到我们网络内部的 NATed tomcat 实例。它工作正常,但突然间从 apache 到 tomcat 实例的请求停止,apache 日志中显示以下内容:
[错误](70007)指定的超时已过期:ajp_ilink_receive()无法接收标头
调查思科日志查看器后发现:
错误信息 %ASA-6-106015:拒绝从 IP 地址/端口到 IP 地址/端口的 TCP(无连接)在接口 interface_name 上标记 tcp_flags。说明自适应安全设备丢弃了自适应安全设备连接表中没有关联连接的 TCP 数据包。自适应安全设备在数据包中查找 SYN 标志,该标志表示建立新连接的请求。如果未设置 SYN 标志,并且没有现有连接,则自适应安全设备将丢弃该数据包。
建议操作 除非自适应安全设备收到大量此类无效 TCP 数据包,否则无需执行任何操作。如果是这种情况,请追踪数据包的来源并确定发送这些数据包的原因。
所有机器都使用 VMware 进行虚拟化,默认情况下机器一直使用 Intel E1000 模拟网卡。我们的网络管理员已将其更改为 VMXNET3 驱动程序,以尝试纠正此问题,我们只需等待并观察问题是否仍然存在,因为这是一个间歇性问题。
还有其他原因导致此问题吗?这不是我们第一次遇到类似问题的服务。
我们的 apache 主机运行的是 Ubuntu 11.10,内核版本为 3.0.0-17-server。我们在运行内核 2.6.18-308.16.1.el5 的 RHEL5 (5.8) 上也遇到过这个问题,这台机器也有 E1000 网卡。
笔记:我不是网络管理员,而是负责这些系统的软件架构师和分析程序员。
答案1
发现问题在于 ASA 在一段时间后关闭持久连接,当它关闭连接时,它也被配置为RST
在再次拨打电话时不发送消息。
为了理解为什么这会导致问题,我可以在这里说明一下。
- Apache 创建了第一个成功的连接。
- 延迟时间超过 ASA 重置时间后,ASA 将关闭连接。
- 发出请求后,Apache 尝试发送它认为是开放的连接,并在
TimeOut
默认 300 秒后超时 - Apache 向客户端发送错误
如果仍有大量池连接处于打开状态,则此处的问题会更加严重。例如,如果 Apache 以 5 个池连接开始,并且在关闭上述连接后,它仍会再出现此行为 4 次,直到客户端收到成功的请求。
有几种方法可以解决这个问题。
- 允许 ASA
RST
向其信任的客户端发送消息。 - 将配置设置
mod_proxy:ProxyPass - keepalive
为On
- 将配置设置为
mod_proxy:ProxyPass - ttl
低于防火墙重置时间的值。
不要尝试配置mod_proxy:ProxyPass - timeout
得mod_proxy:ProxyPass - connectiontimeout
太低,因为如果您的 tomcat 实例中存在任何长时间运行的操作(例如任何 Web 服务或 ReST 端点),那么如果它们花费的时间超过这个时间,它们可能会开始失败。
我们的解决方案是同时采用前两个选项。