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.