在客户站点中,网络团队在客户端和服务器之间添加了防火墙。这导致空闲连接在空闲时间大约 40 分钟后断开。网络人员说防火墙没有任何空闲连接超时,但事实是空闲连接被断开了。
为了解决这个问题,我们首先配置了服务器(Linux 机器),开启 TCP keepalive,其中 tcp_keepalive_time=300、tcp_keepalive_intvl=300 和 tcp_keepalive_probes=30000。这样可以正常工作,连接可以保持几天或更长时间。但是,我们还希望服务器能够检测死机客户端并终止连接,因此我们将设置更改为 time=300、intvl=180、probes=10,认为如果客户端确实处于活动状态,服务器将每 300 秒(5 分钟)探测一次,客户端将以 ACK 响应,这将防止防火墙将其视为空闲连接并终止它。如果客户端已死机,在 10 次探测后,服务器将中止连接。令我们惊讶的是,空闲但活动的连接与以前一样在大约 40 分钟后被终止。
客户端运行的 Wireshark 显示服务器和客户端之间根本没有保持连接,即使在服务器上启用了保持连接。
这里会发生什么事?
如果服务器上的保持活动设置为 time=300、intvl=180、probes=10,我预计如果客户端处于活动状态但空闲状态,服务器将每 300 秒发送一次保持活动探测,并且保持连接不变,如果客户端已停止活动,它将在 300 秒后发送一次探测,然后每 180 秒发送 9 次探测,直到断开连接。我说得对吗?
一种可能性是防火墙以某种方式拦截了来自服务器的保持活动探测,并且无法将其传递给客户端,而它收到探测的事实使它认为连接处于活动状态。这是防火墙的常见行为吗?我们不知道涉及哪种防火墙。
该服务器是 Teradata 节点,连接从 Teradata 客户端实用程序到数据库服务器,服务器端的端口为 1025,但我们发现 SSH 连接也存在同样的问题,因此我们认为它会影响所有 TCP 连接。
答案1
全状态防火墙会检查数据包并确认连接是否有效。我认为防火墙也应该像计算机一样对设置进行微调。默认情况下,许多防火墙仅将空闲连接保持打开状态 60 分钟,但此时间可能会根据供应商的不同而变化。
一些供应商将具有 TCP 拦截、TCP 状态旁路和死连接检测等功能,可以处理像您这样的特殊情况。
另一种选择是使用与服务器上相同的参数配置防火墙本身,以确保一切一致。
在思科防火墙上您可以使用以下命令对其进行配置。
主机名(配置)#超时功能时间
timeout conn hh:mm:ss—连接关闭前的空闲时间,介于 0:5:0 和 1193:0:0 之间。默认值为 1 小时 (1:0:0)。
根据您的需要,您可以有多个参数。
我建议与管理防火墙的团队交谈,并根据您的需要调整时间或检查功能。