为了解决这个问题,我们首先使用tcp_keepalive_time = 300,tcp_keepalive_intvl = 300和tcp_keepalive_probes = 30000来配置启用TCP keepalive的服务器(Linux机器).这有效,并且连接可以存活数天或更长时间.但是,我们还希望服务器检测死客户端并终止连接,因此我们将设置更改为time = 300,intvl = 180,probes = 10,认为如果客户端确实存在,则服务器将每隔300秒进行一次探测(5分钟),客户端将使用ACK进行响应,这将阻止防火墙将其视为空闲连接并将其终止.如果客户端已经死了,经过10次探测后,服务器将中止连接.令我们惊讶的是,闲置但活着的连接在大约40分钟之后就像以前一样被杀死.
在客户端运行的Wireshark在服务器和客户端之间根本没有显示keepalive,即使在服务器上启用了keepalive也是如此.
这可能会发生什么?
如果服务器上的keepalive设置是time = 300,我希望如果客户端处于活动状态但空闲,服务器将每隔300秒发送一次keepalive探测并保持连接,如果客户端已经死了,它将在300秒后发送一个,然后每180秒发送9个探测器,然后终止连接.我对吗?
一种可能性是防火墙以某种方式拦截来自服务器的keepalive探测器并且未能将它们传递给客户端,并且它获得探测的事实使得它认为连接是活动的.这是防火墙的常见行为吗?我们不知道涉及哪种防火墙.
服务器是Teradata节点,连接是从Teradata客户端实用程序到数据库服务器,服务器端的端口1025,但是我们看到SSH连接存在同样的问题,所以我们认为它会影响所有TCP连接.
解决方法
我相信防火墙也应该像计算机一样对设置进行微调.
默认情况下,许多防火墙仅保持空闲连接打开60分钟,但这一时间可能会因供应商而异.
一些供应商将具有TCP拦截,TCP状态旁路和死连接检测等功能,可以处理像您这样的特殊情况.
其他选项是使用与服务器上相同的参数配置防火墙本身,以确保一切都是一致的.
在cisco防火墙上,您可以使用以下命令进行配置.
hostname(config)# timeout feature time
timeout conn hh:mm:ss—The idle time after which a connection closes,
between 0:5:0 and 1193:0:0. The default is 1 hour (1:0:0).
你有多个参数根据你的需要.
我建议与管理防火墙的团队交谈,根据您的需要调整时间或检查功能.