TCP Keepalive e firewall uccidono sessioni inattive


10

In un sito cliente, il team di rete ha aggiunto un firewall tra il client e il server. Ciò causa la disconnessione delle connessioni inattive dopo circa 40 minuti di inattività. Le persone della rete affermano che il firewall non ha alcun timeout di connessione inattiva, ma il fatto è che le connessioni inattive vengono interrotte.

Per ovviare a questo, abbiamo prima configurato il server (una macchina Linux) con keepalive TCP attivati ​​con tcp_keepalive_time = 300, tcp_keepalive_intvl = 300 e tcp_keepalive_probes = 30000. Funziona e le connessioni rimangono valide per giorni o più. Tuttavia, vorremmo anche che il server rilevi i client morti e interrompa la connessione, quindi abbiamo modificato le impostazioni in time = 300, intvl = 180, probes = 10, pensando che se il client fosse effettivamente attivo, il server effettuerebbe il sondaggio ogni 300 secondi (5 minuti) e il client avrebbe risposto con un ACK e ciò avrebbe impedito al firewall di vedere questo come una connessione inattiva e ucciderlo. Se il client era morto, dopo 10 sondaggi, il server avrebbe interrotto la connessione. Con nostra sorpresa, le connessioni inattive ma vive vengono uccise dopo circa 40 minuti come prima.

Wireshark in esecuzione sul lato client non mostra alcun keepalive tra il server e il client, anche quando i keepalive sono abilitati sul server.

Cosa potrebbe succedere qui?

Se le impostazioni keepalive sul server sono time = 300, intvl = 180, probe = 10, mi aspetterei che se il client è vivo ma inattivo, il server invierà probe keepalive ogni 300 secondi e lascerebbe la connessione da solo, e se il il client è morto, ne invierebbe uno dopo 300 secondi, quindi altre 9 sonde ogni 180 secondi prima di interrompere la connessione. Ho ragione?

Una possibilità è che il firewall stia in qualche modo intercettando le sonde keepalive dal server e non riesca a passarle al client, e il fatto che abbia ottenuto un probe fa pensare che la connessione sia attiva. Questo comportamento comune è per un firewall? Non sappiamo che tipo di firewall è coinvolto.

Il server è un nodo Teradata e la connessione avviene da un'utilità client Teradata al server di database, porta 1025 sul lato server, ma abbiamo riscontrato lo stesso problema con una connessione SSH, quindi pensiamo che influisca su tutte le connessioni TCP.


2
Manca una descrizione delle porte o dei protocolli che i client utilizzano per connettersi al server. È SSH?
ewwhite,

Anche l'identificazione del firewall potrebbe essere d'aiuto.
Skaperen,

3
Controlla se keepalive è attivato sul socket eseguendo netstat --timers -tn e controlla la parola chiave "keepalive" (poiché deve essere attivata dal software sul socket). Maggiori informazioni qui: tldp.org/HOWTO/TCP-Keepalive-HOWTO/index.html Controlla anche i valori del timer, il primo valore è secondi fino al prossimo pacchetto keepalive e il terzo è il numero di pacchetti keepalive in sospeso in attesa di un risposta (se ricordo bene)
Victor Jerlin,


2
Le persone della tua rete probabilmente hanno torto. Se utilizzano un firewall con stato, (quasi sicuramente lo sono) è necessaria una voce per ogni connessione effettuata. Senza un timeout di inattività, la memoria del firewall perderà e il firewall alla fine si esaurirà e si arresterà in modo anomalo. Hanno sicuramente un timeout inattivo da qualche parte ...
James Shewey,

Risposte:


1

Un firewall statefull controlla i pacchetti e conferma anche se la connessione è attiva. Credo che anche il firewall dovrebbe avere le impostazioni ottimizzate allo stesso modo dei computer. Per impostazione predefinita, molti firewall mantengono aperte le connessioni inattive per 60 minuti, ma questa volta potrebbe cambiare in base al fornitore.

Alcuni fornitori avranno funzionalità come TCP Interccept, TCP State Bypass e Dead Connection Detection che consentiranno di gestire situazioni speciali come la tua.

Un'altra opzione è configurare il firewall stesso con gli stessi parametri che hai sui server per assicurarti che tutto sia coerente.

Su un firewall Cisco hai il seguente comando per configurarlo.

hostname (config) # timeout funzione time

timeout conn hh: mm: ss: il tempo di inattività dopo il quale viene chiusa una connessione, tra 0: 5: 0 e 1193: 0: 0. L'impostazione predefinita è 1 ora (1: 0: 0).

hai più parametri in base alle tue esigenze.

Consiglierei di parlare con il team che gestisce il firewall e di regolare i tempi in base alle vostre esigenze o di verificare le funzionalità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.