TCP Keepalive和防火墙杀死空闲会话


10

在客户站点中,网络团队在客户端和服务器之间添加了防火墙。这导致空闲连接在大约40分钟的空闲时间后断开连接。网络人士说防火墙没有任何空闲连接超时,但事实是空闲连接断开了。

为了解决此问题,我们首先在服务器(Linux机器)上配置了TCP keepalive,且其tcp_keepalive_time = 300,tcp_keepalive_intvl = 300和tcp_keepalive_probes = 30000已打开。这行得通,并且连接可以维持数天或更长时间。但是,我们还希望服务器检测到死掉的客户端并终止连接,因此我们将设置更改为time = 300,intvl = 180,probes = 10,认为如果客户端确实存在,则服务器将每300s探测一次(5分钟),客户端将以ACK响应,这将使防火墙无法将其视为空闲连接并杀死它。如果客户端已死,则在进行10次探测后,服务器将中止连接。令我们惊讶的是,闲置但仍然存在的连接在大约40分钟后被杀死。

即使在服务器上启用了keepalive,在客户端上运行的Wireshark在服务器和客户端之间也没有显示任何keepalive。

这里会发生什么?

如果服务器上的keepalive设置为time = 300,intvl = 180,probes = 10,我希望如果客户端处于活动状态但处于空闲状态,则服务器将每300秒发送一次keepalive探测并保持连接状态,并且客户端已死,它将在300秒后发送一个,然后每180秒发送9个探测,然后终止连接。我对吗?

一种可能是防火墙以某种方式拦截了来自服务器的keepalive探测,并且未能将其传递给客户端,并且它得到探测的事实使它认为连接处于活动状态。这是防火墙的常见行为吗?我们不知道涉及哪种防火墙。

服务器是Teradata节点,连接是从Teradata客户端实用程序到数据库服务器的,服务器端是端口1025,但是SSH连接遇到了相同的问题,因此我们认为它会影响所有TCP连接。


2
您缺少有关客户端用于连接服务器的端口或协议的描述。是SSH吗?
ewwhite 2012年

识别防火墙也可能会有所帮助。
Skaperen

3
通过运行netstat --timers -tn检查套接字上是否激活了keepalive,并检查了关键字“ keepalive”(因为必须由套接字上的软件激活)。此处有更多信息:tldp.org/HOWTO/TCP-Keepalive-HOWTO/index.html还要 检查计时器值,第一个值是直到下一个keepalive数据包的秒数,第三个值是等待一个定时器的未完成的keepalive数据包的数量。回复(如果我
没记错的


2
您的网络人员可能是错误的。如果他们使用状态防火墙(几乎可以肯定是),则每个连接都需要一个条目。没有空闲超时,防火墙上的内存将泄漏,防火墙最终将耗尽并崩溃。他们肯定在某个地方有一个空闲超时…
James Shewey 17/09/24

Answers:


1

有状态的防火墙检查数据包,并确认连接是否仍然有效。我相信防火墙也应该像计算机一样对设置进行微调。默认情况下,许多防火墙仅将空闲连接保持打开状态60分钟,但是此时间可能会有所变化,具体取决于供应商。

一些供应商将具有诸如TCP拦截,TCP状态旁路和死连接检测之类的功能,这些功能将可以处理像您这样的特殊情况。

另一种选择是使用与服务器上相同的参数来配置防火墙本身,以确保所有内容都是一致的。

在cisco防火墙上,您可以使用以下命令进行配置。

主机名(配置)#超时功能时间

timeout conn hh:mm:ss-连接关闭之后的空闲时间,介于0:5:0和1193:0:0之间。默认值为1小时(1:0:0)。

您可以根据需要使用多个参数。

我建议与管理防火墙的团队交谈,并根据您的需要调整时间或检查功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.