TCP Keepalive e firewall eliminando sessões ociosas

10

Em um site do cliente, a equipe de rede adicionou um firewall entre o cliente e o servidor. Isso faz com que as conexões ociosas sejam desconectadas após cerca de 40 minutos de tempo ocioso. As pessoas da rede dizem que o firewall não tem nenhum tempo limite de conexão inativa, mas o fato é que as conexões inativas são interrompidas.

Para contornar isso, primeiro configuramos o servidor (uma máquina Linux) com keepalives TCP ativados com tcp_keepalive_time = 300, tcp_keepalive_intvl = 300 e tcp_keepalive_probes = 30000. Isso funciona e as conexões permanecem viáveis ​​por dias ou mais. No entanto, também gostaríamos que o servidor detectasse clientes inoperantes e eliminasse a conexão. Alteramos as configurações para time = 300, intvl = 180, probes = 10, pensando que, se o cliente estivesse realmente vivo, o servidor investigaria a cada 300s (5 minutos) e o cliente responderia com um ACK e isso impediria o firewall de ver isso como uma conexão inativa e matá-lo. Se o cliente estivesse morto, após 10 testes, o servidor abortaria a conexão. Para nossa surpresa, as conexões inativas, mas vivas, são mortas após cerca de 40 minutos como antes.

O Wireshark em execução no lado do cliente não mostra nenhuma keepalives entre o servidor e o cliente, mesmo quando as keepalives estão ativadas no servidor.

O que poderia estar acontecendo aqui?

Se as configurações de keepalive no servidor forem time = 300, intvl = 180, probes = 10, eu esperaria que, se o cliente estivesse ativo, mas ocioso, o servidor enviaria probes de keepalive a cada 300 segundos e deixaria a conexão em paz. o cliente está morto, ele enviava um após 300 segundos e mais 9 testes a cada 180 segundos antes de interromper a conexão. Estou certo?

Uma possibilidade é que o firewall esteja de alguma forma interceptando os probes de keepalive do servidor e falhando em transmiti-los ao cliente, e o fato de ter obtido um probe faz pensar que a conexão está ativa. Esse comportamento é comum para um firewall? Não sabemos que tipo de firewall está envolvido.

O servidor é um nó Teradata e a conexão é de um utilitário do cliente Teradata para o servidor de banco de dados, porta 1025 no lado do servidor, mas vimos o mesmo problema com uma conexão SSH, portanto acreditamos que isso afeta todas as conexões TCP.

Carlos A. Ibarra
fonte
2
Está faltando uma descrição de quais portas ou protocolos os clientes estão usando para se conectar ao servidor. É SSH?
ewwhite
Identificar o firewall também pode ajudar.
Skaperen
3
Verifique se keepalive está ativado no soquete executando netstat --timers -tn e verifique a palavra-chave "keepalive" (pois isso deve ser ativado pelo software no soquete). Mais informações aqui: tldp.org/HOWTO/TCP-Keepalive-HOWTO/index.html Verifique também os valores do timer, o primeiro valor é segundos até o próximo pacote keepalive e o terceiro é o número de pacotes pendentes keepalive esperando por um resposta (se bem me lembro)
Victor Jerlin
2
Seu pessoal da rede provavelmente está errado. Se eles estiverem usando um firewall com estado, (quase certamente estão), é necessária uma entrada para cada conexão estabelecida. Sem um tempo limite inativo, a memória no firewall vazará e o firewall acabará se esgotando e travando. Eles definitivamente tem um lugar ocioso tempo limite ...
James Shewey

Respostas:

1

Um firewall statefull verifica os pacotes e também confirma se a conexão está ativa. Acredito que o firewall também deve ter as configurações ajustadas da mesma forma que os computadores. Por padrão, muitos firewalls mantêm apenas as conexões inativas abertas por 60 minutos, mas esse tempo pode mudar dependendo do fornecedor.

Alguns fornecedores terão recursos como TCP Intercept, TCP State Bypass e Dead Connection Detection que permitirão lidar com situações especiais como a sua.

Outra opção é configurar o próprio firewall com os mesmos parâmetros que você possui nos servidores para garantir que tudo seja consistente.

Em um firewall da Cisco, você tem o seguinte comando para configurá-lo.

tempo do recurso de tempo limite do hostname (config) # timeout

timeout conn hh: mm: ss - O tempo de inatividade após o qual uma conexão é fechada, entre 0: 5: 0 e 1193: 0: 0. O padrão é 1 hora (1: 0: 0).

você tem vários parâmetros de acordo com suas necessidades.

Eu recomendaria falar com a equipe que gerencia o firewall e ajustar os horários de acordo com suas necessidades ou verificar as funcionalidades.

Hugo
fonte