Come instradare indirizzi specifici attraverso un tunnel?


14

Ci sono alcuni siti Web / servizi a cui posso accedere solo dalla sottorete su cui si trova il mio server (si pensi allo scenario intranet tipico). C'è un modo per instradare in modo trasparente il traffico diretto a questi indirizzi attraverso un tunnel SSH?

Considera la seguente configurazione:

Il mio laptop è connesso alla rete domestica. Non può accedere direttamente ai servizi su ips X e Y. Ho un tunnel SSH per un server che si trova su una sottorete che può effettivamente accedere a questi servizi.

Posso in qualche modo incapsulare automaticamente tutto il traffico verso le sottoreti di X e Y per attraversare questo tunnel, senza dover eseguire l'intera soluzione VPN che invierebbe tutto il mio traffico attraverso il server? In altre parole: tutto il traffico diretto a qualsiasi altra sottorete dovrebbe comunque passare direttamente dal laptop, senza passare attraverso il server (utilizzando il tunnel).

Risposte:


6

È possibile specificare l'interfaccia attraverso la quale instradare il traffico nella tabella di routing:

sudo route add <host.com> -interface <ppp0>

Dove host.com è il nome host o l'ip a cui si desidera accedere tramite l'interfaccia e ppp0 è l'identificatore del collegamento per il tuo VPN mostrato con il ifconfigcomando.


2
Nota: almeno su Ubuntu -interfacenon è un'opzione di routequindi il suggerimento sopra fornisce un errore di utilizzo. Inoltre, come si tradurrà questo in routing tramite il tunnel ssh quando l'OP chiede?
Ari

3

Le versioni recenti di OpenSSH supportano i dispositivi di rete tun / tap per un vero supporto VPN. Vedi https://help.ubuntu.com/community/SSH_VPN per alcuni documenti di base (ovviamente destinati a Ubuntu, ma il principio di base si applica altrove).


Si noti che ciò richiede i privilegi di root sia sul laptop che sull'host gateway.
Riccardo Murri,

1

Disclaimer: non ho ancora testato quello che sto per descrivere, e in effetti può essere completamente sbagliato, ma la tua domanda è così intrigante che non posso resistere alla tentazione di redigere una risposta. :-) Inoltre, l'installazione qui dipende da alcune iptablesfunzionalità che potrebbero esistere solo su Linux.

Supponendo che si desideri connettere dal proprio laptop a una porta specifica P1 sul server X1, alla porta P2 sul server X2, ecc. - Descriverò come instradare il traffico TCP a queste specifiche coppie server + porta attraverso un tunnel SSH. Nota: gli indirizzi IP X1, X2, ecc. Sono gli indirizzi IP del server visti dall'host gateway (quello in cui si inserisce SSH).

  1. Seleziona alcune porte locali non utilizzate L1 (ad es. 10000), L2 (ad es. 10001), ecc. Le porte L1, L2, ... devono essere tutte distinte e il loro numero deve essere uguale al numero di server distinti (Xn, Pn) + coppie di porte.

  2. Utilizzare iptablesper reindirizzare i pacchetti diretti a Xn: Pn su localhost: Ln

    iptables -t nat -A OUTPUT -p tcp -d X1 --dport P1 -j DNAT - all'host locale di destinazione: L1 iptables -t nat -A OUTPUT -p tcp -d X2 --dport P2 -j DNAT - localhost di destinazione: L2

  3. Ora SSH verso il gateway, usando l' -Lopzione per tunnelizzare il traffico dall'host locale: da Ln a (Xn, Pn):

    ssh gateway.server -L localhost: L1: X1: P1 -L localhost: L2: X2: P2 ...

Esempio:

# access webserver.intranet (port 80) through localhost:10080
iptables -t nat -A OUTPUT -p tcp -d webserver.intranet --dport 80 -j DNAT --to-destination localhost:10080
ssh gateway.server -L locahost:10080:webserver.intranet:80

Avvertenze:

  • funziona solo per TCP, se funziona affatto ...

  • se vuoi accedere a più di un server, probabilmente è meno lavoro per configurare una VPN

  • potrebbe essere ancora più semplice utilizzare l' -Dopzione SSH per simulare un proxy SOCKS e attraversare tutto il traffico.


Funziona davvero! (Purtroppo, non si adatta alla mia situazione specifica, dove voglio instradare il traffico che proviene da una macchina virtuale, non da localhost.)
pvgoran,

1

sottoreti di X e Y per passare attraverso questo tunnel, senza dover eseguire l'intera soluzione VPN che invierebbe tutto il mio traffico attraverso il server?

Quello che vuoi è la definizione di una VPN.

Una VPN non dovrebbe

inviare tutto il [tuo] traffico attraverso il server?

Se lo è, non è configurato correttamente.

Si presume che qualsiasi macchina a cui si sta tentando di accedere tramite un tunnel o una VPN, per definizione, non sia accessibile via Internet. Pertanto, solo l'indirizzo necessario, non instradabile su Internet, deve essere instradato verso il basso nella VPN.

Se hai una situazione più complicata, come solo la macchina X e Y e nient'altro. Il personale IT può metterli su una sottorete per te. Quindi, sul tuo computer client, instrada solo quella sottorete nella VPN.


0

Posso in qualche modo incapsulare automaticamente tutto il traffico verso le sottoreti di X e Y per attraversare questo tunnel, senza dover eseguire l'intera soluzione VPN che invierebbe tutto il mio traffico attraverso il server?

Questo è un po 'strano a prima vista perché è quello che farà una VPN per te. SSH tende ad essere un affare punto a punto, con l'idea di connettere una porta sul tuo computer locale alla porta di un computer remoto altrove; non è stato progettato per il tipo di traffico che prevedi.

In altre parole: tutto il traffico diretto a qualsiasi altra sottorete dovrebbe comunque passare direttamente dal laptop, senza passare attraverso il server (utilizzando il tunnel).

Ancora una volta, una VPN si occuperebbe di questo.

Se sei preoccupato per una soluzione "pesante" per ottenere traffico VPN sicuro (cioè non vuoi scappare con esso perché sarebbe troppo complicato) dovresti davvero guardare OpenVPN , che farà esattamente quello che stai descrivendo. Non solo incapsulerebbe tutto il traffico, ma può essere fatto in modo che solo il traffico destinato a tali sottoreti effettui il viaggio attraverso la pipe VPN. Ti avvertirò che dovrai comunque modificare un file di testo sui computer locali e remoti, ma è abbastanza facile da avviare.

Per i tuoi scopi, poiché non desideri che la parte in mezzo (un server) veda il tuo traffico, dovresti impostare la VPN per connettersi direttamente dal tuo computer al computer remoto. Tutti i pacchetti indirizzati verrebbero crittografati prima di lasciare il laptop, in modo da avere una copertura end-to-end al 100%.


0

Come altri hanno già detto, se devi "incapsulare tutto il traffico verso le sottoreti", allora probabilmente vorrai usare la VPN.

Tuttavia, per accedere a pochi servizi, potresti voler utilizzare la funzionalità di port forwarding locale di SSH, che è davvero semplice. Ad esempio, se inserisci (dal tuo laptop):

ssh -N -L 3333:localhost:2222 jump_box

quindi connettersi a localhost:2222, sarà proprio come connettersi a localhost:2222dajump_box . È possibile utilizzare più opzioni -L contemporaneamente e connettersi ai servizi su altri host se lo jump_boxconsente ssd_config .

Puoi usare autosshcon systemdo simili per mantenere attivi e funzionanti i tunnel.

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.