Ricollegamento automatico del tunnel TCP


9

Ho una connessione di rete inaffidabile tra due macchine: a volte le connessioni TCP attive vengono interrotte per motivi indipendenti dalla mia volontà. Voglio stabilire una connessione TCP affidabile tra le due macchine.

Se la rete fosse affidabile, mi limiterei a correre ssh -L 1234:localhost:1234 remotehost, con il server in ascolto sulla porta 1234 attiva remotehoste puntare il client verso localhost:1234. Ma se la connessione ssh si interrompe, lo sarà anche la connessione inoltrata. Come posso organizzare il ripristino automatico della connessione tra client e server?

Non-soluzioni:

  • Questo non è per applicazioni interattive, quindi lo schermo non si applica.
  • Non si tratta solo di ricollegare automaticamente un tunnel SSH, la autossh . Voglio continuare a utilizzare la stessa connessione TCP con tunnel, non avviarne una nuova.
  • In linea di principio, una VPN farebbe il trucco. Ma sembra eccessivo quando voglio solo una connessione TCP e vorrei una soluzione che funzioni anche se non ho i permessi di root su entrambi i lati.

Ho una vaga memoria di un programma chiamato rocksche ha fatto proprio questo, ma sembra essere caduto dalla faccia del web. Sono per lo più interessato a Linux da entrambe le parti (anche se mi aspetto che un programma a questo livello sia portatile per altri unices), ma se conosci un programma che funziona tra QNX e VMS, tanto meglio.


Gilles, stai usando tcp keepalives con le tue connessioni ssh? Altrimenti, prova prima questo ... alcune implementazioni NAT interrompono rapidamente le connessioni
Mike Pennington,

@ Mike: grazie per il suggerimento. Non ho un bisogno immediato, ma ho affrontato sia situazioni in cui una via intermedia andava e veniva (quindi i keepalive TCP facevano più male che bene) e situazioni in cui un NAT mi sovraccaricava e mi lasciava cadere (quindi i keepalive TCP potevano aiutare). I keepalive TCP non importerebbero comunque per un flusso continuo (es. Scp), vero? In ogni caso, vorrei mantenere questo aspetto generale: la prossima volta che dovrò affrontare una rete traballante di qualunque sapore, cosa posso fare?
Gilles 'SO- smetti di essere malvagio'

Gilles, le soluzioni sono diverse per flussi costanti come scp. Stavo rispondendo con keepalive w / ssh in base al tuo esempio di port forwarding. Ri: luppolo a valle traballante, non c'è molto che puoi fare, oltre a creare una sessione ssh con keepalive che sono più tolleranti (cioè consentire più keepalive rilasciati con ServerAliveInterval > 0e ServerAliveCountMax > 3). NAT richiede intervalli di mantenimento inferiori. Il problema chiave è identificare qual è il problema e adattarlo di conseguenza. Inserisci le opzioni in .ssh/configmodo che siano sempre lì per te
Mike Pennington,

@ Mike: Uno dei miei casi d'uso include il client che ottiene il suo IP da un NAT sovraccarico che elimina casualmente anche le connessioni attive (pensa più P2P di quanto dovrebbe esserci). Dopo alcuni secondi, il client riesce a riconnettersi ma potrebbe ottenere un indirizzo IP diverso. In tal caso la connessione TCP non sopravviverà. Rocks fa fronte, ma preferirei qualcosa che si compila fuori dagli schemi sui sistemi di oggi.
Gilles 'SO- smetti di essere malvagio'

nel caso in cui il NAT ti dia nuovi IP, non c'è molto che tu possa fare se non riparare il NAT o sperare in un'altra rocksimplementazione ... anche se questo è ovviamente un vero problema
Mike Pennington,

Risposte:



1

L'unico protocollo standard che conosco con questa funzionalità è MPTCP . È trasparente al livello dell'applicazione, quindi SSH in cima a MPTCP dovrebbe funzionare. Può eseguire le connessioni TCP sottostanti su percorsi diversi con IP diversi, quindi in linea di principio potrebbe essere utilizzata per migrare la connessione SSH in entrata e in uscita dalla connessione VPN a seconda che la connessione VPN sia attiva.

Non so molto sulla maturità delle implementazioni MPTCP, ma il design del protocollo sembra abbastanza solido.

Dovrebbe proteggere le tue connessioni SSH da perdersi a causa della connettività di rete instabile. Non ti proteggerà da un mitm che vuole interrompere la tua connessione SSH. Un mitm può ancora iniettare dati danneggiati, che SSH rileverà e interromperà la connessione.

Un metodo MPTCP come la riconnessione incorporato nel protocollo SSH sarebbe il metodo che potrei immaginare mantenendo in vita una connessione il più a lungo possibile. Ma non credo che una tale funzione sia stata progettata per il protocollo SSH.


0

È possibile utilizzare daemontoolsper mantenere la porta ssh in avanti; non manterrà necessariamente i programmi dipendenti dalla connessione mentre è inattivo (come presumibilmente quando ssh si disconnette la porta locale inizierà a rifiutare le loro connessioni), ma è un inizio.

Ho il sospetto che ci siano alcuni iptablestrucchi, come causare quella porta ai pacchetti DROP non appena lo ssh forward scompare, quindi i programmi di connessione sanno solo che i pacchetti stanno scomparendo, non vengono rifiutati. Sto solo imparando daemontoolsme stesso (di nuovo), quindi non sono sicuro che tu possa eseguire uno script personalizzato quando un servizio muore, ma sospetto che tu possa farlo.


-2

TCP lo fa automaticamente. Devi solo disabilitare o indebolire i tipici hack pratici di pulizia usati per uccidere le connessioni TCP moribonde. Disattiva TCP keepalive per la tua connessione e aumenta notevolmente il limite per ritrasmissioni eccessive. Su Linux, ad esempio, scrivi un numero elevato in /proc/sys/net/ipv4/tcp_retries2.

Tuttavia, in una rete moderna è probabile che un firewall con ispezione di pacchetti stateful dimentichi una connessione TCP che non riesce a scambiare i pacchetti regolarmente, quindi potrebbe piovere sulla tua parata.


1
È vero che TCP è in grado di gestire la situazione, purché ciascun endpoint abbia un indirizzo IP statico e non vi siano middlebox con stato. La domanda menziona reasons beyond my control, che ho letto come IP dinamico o middlebox con stato. In tali scenari TCP keepalive può aiutare un po '. Tuttavia, indipendentemente da come si configura TCP keepalive, non sarà sufficiente mantenere attiva la connessione quando una middlebox perde stato a causa del riavvio.
Kasperd,

@kasperd Sono d'accordo. Tuttavia, è inutile cercare di mantenere aperta una connessione TCP in questi casi. Pertanto, ho ipotizzato che l'interrogante non si trovi ad affrontare quelle sfide particolari.
carrello

Non è inutile se controlli entrambi gli endpoint e riesci ad aggiornarli su uno stack con il supporto MPTCP. Inoltre, una soluzione a livello di applicazione potrebbe essere implementata su TCP senza la necessità di MPTCP.
Kasperd,
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.