Impedisci la perdita della connessione SSH dopo l'accesso alla VPN sul server


14

Ho riscontrato un problema che non posso affrontare. Quando accedo a un VPS su SSH e provo a stabilire una connessione VPN su quel VPS, la connessione SSH tra VPS e la mia macchina si perde. Suppongo sia perché il routing è stato modificato dalle impostazioni VPN. Come prevenirlo?


Che dire di connettersi a SSH dopo la creazione di VP? : p Hai ragione che questo è causato perché la VPN sovrascrive i percorsi di routing. Quello che puoi fare è mantenere intatti i tuoi percorsi originali e aggiungere semplicemente il percorso VPN aggiuntivo (A meno che tu non voglia usare il tuo VPS come proxy. Questa è un'altra storia). Quale cliente usi?
Nikolaidis Fotis,

Cosa intendi con "prova a stabilire una connessione VPN su quel VPS"? Ti stai collegando dalla tua macchina a un server Openvpn sul VPS? Il tuo VPS si sta connettendo a un server Openvpn in esecuzione su un terzo host? In quest'ultimo caso, tale connessione VPN sta respingendo alcune rotte? Inoltre, per favore conferma che non ci sono traduzioni NAT per raggiungere il tuo VPS (l'indirizzo IP configurato sulla sua interfaccia è lo stesso che stai specificando nella connessione SSH?
Damiano Verzulli,

@NikolaidisFotis Non riesco a collegarmi poiché la VPN è in esecuzione. Uso il client openvpn. C'è --route-noexecun'opzione per ignorare le rotte inviate dal server ma, come hai detto, non aiuta quando voglio usare VPN come proxy ...
mic22

@DamianoVerzulli la seconda opzione, sì, i percorsi vengono spinti (ma penso che debba essere fatto poiché ho bisogno che la VPN funzioni come proxy per occultare l'indirizzo IP originale della macchina), e no non c'è NAT
mic22

Risposte:


6

Devi aggiungere l' route-nopullopzione (e rimuoverla redirect-gatewayse esiste) al file di configurazione del tuo client OpenVPN sul tuo VPS.

In questo modo la connessione a un server VPN non modificherà alcun percorso sul tuo VPS, quindi sarai in grado di impostare quelli di cui hai bisogno da solo.


Ehi, grazie per questo consiglio, ma ora non riesco a raggiungere Internet attraverso Tun0. Suppongo che mi manca un gateway. Qualche idea su come aggiungere un gateway per tun0? Parte rilevante di ifconfig:inet addr:10.56.10.6 P-t-P:10.56.10.5 Mask:255.255.255.255
Housemd,

È necessario aggiungere manualmente una route al server VPN stesso tramite il gateway ISP predefinito, quindi aggiungere il gateway predefinito tramite 10.56.10.5 per tutto il resto del traffico
Anubioz,

Scusa, cosa? Non ho idea di quello che hai appena detto. Potresti fare un esempio?
Housemd,

Vorrei solo chiarire: non voglio che il percorso predefinito sia tramite tun0, ma ho bisogno di tun0 per avere accesso a Internet.
Housemd,

@Housemd hm devi avere tu stesso l'accesso a Internet tramite tun0 o hai bisogno di client collegati via tun0 da altri luoghi per avere accesso a Internet?
Anubioz,

4

Consideriamo il seguente scenario:

  1. il tuo VPS ha un'unica interfaccia ethernet, configurata con l'indirizzo IP 4.3.2.1/24;
  2. il tuo VPS può accedere a Internet tramite un gateway predefinito 4.3.2.254
  3. il tuo VPS non ha ancora attivato alcuna connessione OpenVPN; quindi non ci sono nessun tun interfaccia attiva

In un tale scenario, dalla tua macchina (supponiamo che la tua macchina sia 9.8.7.6/24 con def-gw 9.8.7.254) puoi stabilire con successo una connessione SSH a 4.3.2.1. Quindi entrambi gli host 4.3.2.1 e 9.8.7.6 possono raggiungersi con successo.

Ora, con tale connessione SSH stabilita, supponiamo:

  1. si avvia una connessione OpenVPN dal VPS 4.3.2.1;
  2. come tale, una nuova interfaccia tun0 verrà configurata dinamicamente (supponiamo che gli verrà assegnato un IP 10.10.10.2, con un PTP 10.10.10.1).

In questa fase:

  • Se nessuna route verrà trasferita dal server OpenVPN remoto al VPS locale, non cambierà nulla in termini di routing e la connessione SSH sopravviverà senza problemi. In questo caso, l'unico traffico che attraversa la VPN è quello diretto verso il server OpenVPN remoto (10.10.10.1);

  • Se il server OpenVPN remoto rimanderà indietro, in particolare se il gateway predefinito VPS verrà sostituito con 10.10.10.1 (endpoint OpenVPN remoto), POI stai riscontrando problemi. In questo caso stai effettuando il tunneling di TUTTO il traffico IP in uscita (ad eccezione di OpenVPN stesso) all'interno della VPN.

In questo secondo caso (sostituendo def-gw subito dopo aver stabilito la connessione VPN), la precedente connessione SSH si "bloccherà" a causa del routing asimmetrico:

  • Il traffico dalla tua macchina (9.8.7.6) a VPS (4.3.2.1) scorrerà attraverso il percorso precedente, mai modificato;
  • Traffico da VPS (4.3.2.1) alla tua macchina (9.8.7.6):
    • senza VPN (quindi, inizialmente) è stato instradato attraverso il gateway 4.3.2.254;
    • dopo la creazione del collegamento VPN, con relativa sostituzione def-gw, viene instradato attraverso la VPN (10.10.10.1).

In altre parole: non appena viene stabilito il collegamento VPN, la rotta di ritorno da VPS alla macchina cambierà e ... questo non è un aspetto positivo (diversi dispositivi di rete, lungo il percorso di ritorno, potrebbero riconoscere tale asimmetria percorso e semplicemente rilasciare i pacchetti).

Inoltre, è molto probabile che il tuo server OpenVPN remoto agisca come un NAT-box: tutto il traffico proveniente dalla VPN sarà NATted con l'indirizzo IP pubblico del server OpenVPN remoto. Se questo è vero, allora le cose non vanno più ... "non buono", ma sicuramente "cattivo", come per la tua connessione SSH: il traffico di ritorno, oltre a tornare lungo un percorso diverso, sta tornando alla tua macchina con un IP di origine diverso (quello dell'interfaccia pubblica del server VPN).

Come risolvere questo problema?

Abbastanza facilmente, anzi.

Indica semplicemente al tuo server VPS di non indirizzare il traffico verso la tua macchina lungo la VPN, ma, invece, affidandoti alla rotta precedente . Dovrebbe essere facile come aggiungere, prima di avviare OpenVPN:

     route add -host 9.8.7.6 gw 4.3.2.254

dove:

  • 9.8.7.6 è l'indirizzo IP pubblico della macchina
  • 4.3.2.254 è il gateway predefinito originale del VPS.

PS: fornendo una domanda molto più dettagliata, avresti ottenuto una risposta molto più rapida :-)


Grazie per la tua risposta @DamianoVerzulli! Il gateway predefinito non è specificato. route addcomando con tali 0.0.0.0 ritorni gwSIOCADDRT: Invalid argument
mic22

Questo è quello che ottengo subito dopo la connessione di openvpn[server] Peer Connection Initiated with [AF_INET]64.251.27.139:443; TUN/TAP device tun0 opened; do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0; /sbin/ip link set dev tun0 up mtu 1500; /sbin/ip addr add dev tun0 10.200.1.251/22 broadcast 10.200.3.255; ERROR: Linux route add command failed: external program exited with error status: 2
mic22

@ mic22: Mi chiedo come def-gw del tuo VPS non possa essere specificato poiché in questo caso tale VPS non può raggiungere nulla al di fuori della sottorete locale (e ciò significa che entrambe le macchine - essendo in grado di connettersi tramite SSH - e server OpenVpn - essere in grado di stabilire una VPN - dovrebbe essere "locale" e, come tale, abbastanza inutile!). A proposito: quando sei connesso tramite SSH puoi facilmente ottenere def-gw con un "netstat -rn" (linea che inizia con 0.0.0.0, seconda colonna)
Damiano Verzulli

netstat -rnrisultato 0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0il VPS che sto usando è un'opzione di base OVH con Ubuntu 14.04 Server on board
mic22

ifconfige netstat -rnuscita: goo.gl/TEZ61q
mic22

0

Questo può aiutare:

inserisci il TCPKeepAlive=yestuo/etc/ssh/sshd_config

A partire dal

man sshd_config | less +/'^ *TCPKeepAlive'

TCPKeepAlive

Specifica se il sistema deve inviare messaggi keepalive TCP all'altro lato. Se vengono inviati, verrà notata correttamente la morte della connessione o l'arresto anomalo di una delle macchine. Tuttavia, ciò significa che le connessioni moriranno se il percorso è temporaneamente inattivo e alcune persone lo trovano fastidioso. D'altra parte, se i keepalive TCP non vengono inviati, le sessioni potrebbero bloccarsi indefinitamente sul server, lasciando utenti `` fantasma '' e consumando risorse del server.

L'impostazione predefinita è yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. This avoids infinitely hanging sessions. To disable TCP keepalive messages, the value should be set tono ''.


Ho già TCPKeepAliveimpostato le opzioni in yesmodo che non sia una soluzione adeguata
mic22

0

Ho avuto questo problema e ho provato tutte le soluzioni consigliate, eppure il mio problema non è stato risolto!

Dopo molte tentate soluzioni, ho usato il screencomando. (il mio client VPN è cisco-any-connect).

$ screen -R VPN
$ openconnect -b "your server"

Dopo aver fornito le tue credenziali, premi ctrl + a + d immediatamente e torna alla sessione.


0

Personalmente preferisco che tutte le connessioni a SSH siano instradate tramite VPN. In caso di connessione ssh attiva prima che venga stabilita la VPN, è necessario riconnettersi a causa del percorso modificato.

Raccomando di usare autossh Sotto la configurazione del tuo client SSH basta aggiungere.ssh/config

Host *
   ServerAliveInterval 300
   ServerAliveCountMax 2
   BatchMode yes
  • BatchMode sta per riconnessione automatica
  • ServerAlive è l' acronimo di Keeping Alive

-1

Una volta dopo aver collegato la VPN, ssh viene disconnesso perché, il traffico ssh dal server passa attraverso il server VPN. Quindi, per evitare ciò, eseguire il comando seguente prima di connettere VPN.

route add -host your-machine-public-ip gw Server-gatway-ip dev eth0

your-machine-public-ip: IP del tuo computer da dove stai eseguendo SSH. Server-gatway-ip: IP di Gatway / router di quel server

Il comando precedente reindirizzerà il traffico tramite il gateway specificato non tramite il server VPN.


Questo è confuso e la lingua sembra averlo al contrario. Non vorresti aggiungere una route con l'indirizzo IP della destinazione SSH e il gateway predefinito della workstation locale?
rmalayter,
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.