Tunneling SSH Spiegato: Accesso Sicuro ai Servizi Remoti

Utilizza il tunneling SSH per raggiungere database privati, app web e servizi remoti con forwarding locale, remoto e dinamico.

SSH Tunneling spiegato: accesso sicuro ai servizi remoti

Il tunneling SSH ti aiuta a raggiungere servizi remoti senza esporli a Internet. Se il tuo database, pannello di amministrazione o server di sviluppo è raggiungibile solo da un host bastione, un tunnel SSH può fornire ai tuoi strumenti locali un percorso sicuro.

I modelli principali sono il forwarding locale, il forwarding remoto e il forwarding dinamico. Ciascuno risponde a una domanda diversa: hai bisogno di raggiungere qualcosa di remoto, esporre qualcosa di locale o creare un proxy SOCKS?

Cos'è il tunneling SSH?

Il tunneling SSH avvolge il traffico delle applicazioni all'interno di una connessione SSH. Invece di connetterti direttamente a un servizio, ti connetti a una porta inoltrata locale o remota. SSH trasporta quel traffico attraverso la sessione crittografata e si connette alla destinazione finale dal lato corretto del tunnel.

Il tunnel crittografa il traffico tra il client SSH e il server SSH. Se la destinazione finale è oltre il server SSH, quell'ultimo tratto utilizza la sicurezza fornita dal servizio di destinazione. Per i servizi sensibili, mantieni TLS o la crittografia nativa abilitata anche quando usi il tunnel.

Tipi di tunnel SSH

SSH offre tre tipi principali di forwarding delle porte, ciascuno con uno scopo diverso:

1. Forwarding locale delle porte (-L)

Il forwarding locale delle porte è il tipo più comune. Ti permette di inoltrare il traffico da una porta sulla tua macchina locale a una porta su una macchina remota (o una macchina raggiungibile dal server SSH remoto). È ideale per accedere a servizi in esecuzione sulla rete interna di un server remoto o sul server stesso, che non sono direttamente accessibili dalla tua rete locale.

Come funziona: Il client SSH ascolta sulla tua macchina. Il server SSH si connette alla destinazione.

Caso d'uso: Accesso a un database MySQL sulla porta 3306 che solo l'host bastione può raggiungere.

Sintassi del comando:

ssh -L [PORTA_LOCALE]:[HOST_DESTINAZIONE]:[PORTA_DESTINAZIONE] [UTENTE_SSH]@[SERVER_SSH]

Esempio:

Supponiamo di avere un database MySQL in esecuzione su db.internal.example.com (porta 3306) e di poter accedere solo via SSH a bastion.example.com. Per accedere al database dalla tua macchina locale sulla porta 8888:

ssh -L 8888:db.internal.example.com:3306 [email protected]

Dopo aver eseguito questo comando, puoi aprire il tuo client MySQL locale e connetterti a localhost:8888. Il traffico sarà inoltrato in modo sicuro attraverso bastion.example.com a db.internal.example.com:3306.

Usa -N quando non hai bisogno di una shell remota:

ssh -N -L 8888:db.internal.example.com:3306 [email protected]

Per gli script, aggiungi -o ExitOnForwardFailure=yes in modo che SSH esca se il listener locale non può essere creato.

2. Forwarding remoto delle porte (-R)

Il forwarding remoto delle porte fa l'opposto del forwarding locale. Ti permette di inoltrare il traffico da una porta sul server SSH remoto a una porta sulla tua macchina locale o su una macchina raggiungibile dalla tua macchina locale. È utile per esporre un servizio in esecuzione sulla tua macchina locale (o su una macchina sulla tua rete locale) al server remoto o alla sua rete.

Come funziona: Il server SSH ascolta su una porta remota. Il tuo client SSH si connette alla destinazione dal tuo lato del tunnel.

Caso d'uso: Consentire a un collega remoto di accedere a un server di sviluppo web in esecuzione sulla tua macchina locale (ad esempio, un'app Flask sulla porta 5000) senza esporre la tua macchina locale direttamente a Internet.

Sintassi del comando:

ssh -R [PORTA_REMOTA]:[HOST_DESTINAZIONE]:[PORTA_DESTINAZIONE] [UTENTE_SSH]@[SERVER_SSH]

Esempio:

Supponiamo di eseguire un'applicazione web sulla tua macchina locale su localhost:5000. Vuoi permettere a un utente su remote.example.com di accedervi connettendosi alla porta 9000 su remote.example.com.

ssh -R 9000:localhost:5000 [email protected]

Nelle configurazioni tipiche di OpenSSH, il listener remoto è disponibile solo sull'interfaccia di loopback del server SSH. Ciò significa che gli utenti sull'host remoto possono testare localhost:9000, ma altre macchine non possono necessariamente raggiungere remote.example.com:9000.

Per esporre il listener ad altre macchine, di solito hai bisogno di un indirizzo di bind come 0.0.0.0 nel comando e di un'impostazione lato server GatewayPorts come clientspecified o yes. Fai attenzione: il forwarding remoto può esporre servizi sul tuo laptop o sulla tua rete locale alla rete remota.

3. Forwarding dinamico delle porte (-D)

Il forwarding dinamico delle porte crea un proxy SOCKS sulla tua macchina locale. Invece di inoltrare il traffico a una destinazione specifica, permette alle applicazioni configurate per utilizzare questo proxy SOCKS di connettersi a qualsiasi host e porta raggiungibile dal server SSH. Questo trasforma efficacemente la tua connessione SSH in un server proxy versatile.

Come funziona: Il tuo client SSH ascolta come proxy SOCKS. Le applicazioni che supportano SOCKS inviano richieste a quel proxy locale, e il server SSH effettua la connessione in uscita.

Caso d'uso: Navigare in modo sicuro sul web da una rete Wi-Fi pubblica instradando tutto il traffico del browser attraverso un server SSH a casa o in ufficio. Questo crittografa la tua attività di navigazione.

Sintassi del comando:

ssh -D [PORTA_LOCALE] [UTENTE_SSH]@[SERVER_SSH]

Esempio:

Per creare un proxy SOCKS sulla tua macchina locale in ascolto sulla porta 1080:

ssh -D 1080 [email protected]

Dopo aver eseguito questo comando, configura il tuo browser o un'altra applicazione per utilizzare un proxy SOCKS su localhost:1080. Se l'applicazione supporta DNS remoto su SOCKS5, abilitalo quando la privacy del DNS è importante.

Applicazioni pratiche e vantaggi

Il tunneling SSH offre un'ampia gamma di applicazioni pratiche:

  • Accesso sicuro ai database: Accesso a database (come PostgreSQL, MySQL o MongoDB) che sono accessibili solo da un server specifico in una rete privata, senza esporre la porta del database direttamente a Internet.
  • Accesso ai servizi web interni: Connessione ad applicazioni web interne, interfacce amministrative o dashboard di monitoraggio che non sono esposte pubblicamente.
  • Protezione dei protocolli non crittografati: Avvolgere protocolli insicuri come VNC, FTP o HTTP semplice all'interno di un tunnel SSH crittografato, fornendo riservatezza e integrità.
  • Lavorare attraverso restrizioni di rete: Accesso ai servizi attraverso un server autorizzato a raggiungerli. Fallo solo quando è conforme alla politica di rete della tua organizzazione.
  • Sviluppo remoto sicuro: Fornire accesso sicuro ad ambienti di sviluppo o strumenti in esecuzione su server remoti.

Conclusione

Usa il forwarding locale quando il tuo laptop ha bisogno di accedere a un servizio remoto privato. Usa il forwarding remoto quando un host remoto ha bisogno di accesso temporaneo a un servizio vicino a te. Usa il forwarding dinamico quando hai bisogno di un proxy SOCKS attraverso un server SSH fidato. Mantieni il tunnel il più stretto possibile e chiudilo quando il lavoro è finito.