Demistificare il Port Forwarding SSH: Tunnels Locali, Remoti e Dinamici Spiegati

Impara il port forwarding SSH locale, remoto e dinamico con comandi pratici per database, app web e proxy SOCKS.

Demistificare il Port Forwarding SSH: Tunnel Locali, Remoti e Dinamici Spiegati

Il port forwarding SSH ti consente di raggiungere un servizio di rete attraverso una connessione SSH crittografata invece di esporre direttamente quel servizio. Lo utilizzerai solitamente quando un database, un pannello di controllo o un server di sviluppo è raggiungibile da un host SSH ma non dal tuo laptop.

Le tre forme comuni sono il forwarding locale, il forwarding remoto e il forwarding dinamico. Usano una sintassi simile, ma la porta di ascolto si trova in un posto diverso.

Cosa Fa il Port Forwarding SSH

Il port forwarding SSH, noto anche come tunneling SSH, reindirizza il traffico da un host e una porta a un altro host e porta attraverso la tua sessione SSH. La destinazione viene risolta dal lato che effettua la connessione finale. Per il forwarding locale, il server SSH si connette al target. Per il forwarding remoto, il tuo client SSH si connette al target.

Questo offre diversi vantaggi:

  • Sicurezza: Crittografa il traffico che altrimenti sarebbe non crittografato tra il tuo client e il servizio target.
  • Controllo degli Accessi: Consente l'accesso a servizi in esecuzione su reti private o dietro firewall che non sono direttamente accessibili dalla tua posizione attuale.
  • Collegamento di Reti: Connette diversi segmenti di rete in modo sicuro.

Port Forwarding Locale (-L)

Il port forwarding locale è il tipo più comune. Ti permette di inoltrare le connessioni da una porta sulla tua macchina locale a una porta su una macchina remota, tramite un server SSH. In sostanza, fai apparire un servizio in esecuzione sulla rete remota come se fosse in esecuzione sulla tua macchina locale.

Come funziona:

  1. Avvii un client SSH sulla tua macchina locale.
  2. Specifichi una porta locale (local_port) su cui SSH ascolterà.
  3. Qualsiasi connessione effettuata a local_port sulla tua macchina locale viene inoltrata attraverso la connessione SSH a remote_host e remote_port.

Sintassi:

ssh -L [local_bind_address:]local_port:remote_host:remote_port [user@]ssh_server_host
  • local_bind_address: Indirizzo opzionale sulla tua macchina locale a cui associarsi. Se omesso, OpenSSH si associa normalmente agli indirizzi di loopback a meno che la configurazione del tuo client non dica diversamente.
  • local_port: La porta sulla tua macchina locale su cui SSH ascolterà.
  • remote_host: Il nome host o l'indirizzo IP della macchina target a cui il server SSH si collegherà.
  • remote_port: La porta su remote_host a cui il traffico sarà diretto.
  • user@ssh_server_host: Il tuo nome utente e il nome host/indirizzo IP del server SSH a cui ti stai collegando.

Caso d'Uso Pratico: Accesso a un server di database in esecuzione sull'indirizzo IP privato di un server remoto.

Immagina un server di database (es. PostgreSQL su 192.168.1.100:5432) accessibile solo dalla rete interna della tua azienda. Puoi usare il port forwarding locale per accedervi dal tuo laptop a casa:

ssh -L 5433:192.168.1.100:5432 tuo_utente@tuo_server_ssh.com
  • Questo comando ti collega a tuo_server_ssh.com.
  • Apre la porta 5433 sulla tua macchina locale (localhost per impostazione predefinita).
  • Qualsiasi connessione a localhost:5433 verrà inoltrata attraverso tuo_server_ssh.com a 192.168.1.100:5432.

Ora puoi configurare il tuo client di database locale per connettersi a localhost:5433 e il traffico sarà tunnelato in modo sicuro al server di database remoto.

Suggerimento: Usa ssh -N per creare un tunnel senza eseguire un comando remoto. Questo è utile per tunnel in background.

ssh -N -L 5433:192.168.1.100:5432 tuo_utente@tuo_server_ssh.com

Port Forwarding Remoto (-R)

Il port forwarding remoto ti permette di inoltrare le connessioni da una porta sul server SSH remoto a una porta sulla tua macchina locale o su un'altra macchina accessibile dalla tua macchina locale. Questo è utile per rendere un servizio in esecuzione sulla tua macchina locale accessibile al server remoto o alla sua rete.

Come funziona:

  1. Avvii un client SSH sulla tua macchina locale.
  2. Specifichi una porta remota (remote_port) sul server SSH su cui SSH ascolterà.
  3. Qualsiasi connessione effettuata a remote_port sul server SSH viene inoltrata attraverso la connessione SSH alla tua macchina locale e poi a un destination_host e destination_port specificati.

Sintassi:

ssh -R [remote_bind_address:]remote_port:destination_host:destination_port [user@]ssh_server_host
  • remote_bind_address: (Opzionale) L'indirizzo sul server SSH a cui associare la porta di ascolto. Il valore predefinito è localhost (significa che solo il server SSH stesso può connettersi a questa porta). Usa 0.0.0.0 o * per permettere ad altre macchine sulla rete remota di connettersi.
  • remote_port: La porta sul server SSH su cui SSH ascolterà.
  • destination_host: Il nome host o l'indirizzo IP della macchina target a cui il tuo client SSH si collegherà (spesso localhost se il servizio è sulla tua macchina locale).
  • destination_port: La porta su destination_host a cui il traffico sarà diretto.
  • user@ssh_server_host: Il tuo nome utente e il nome host/indirizzo IP del server SSH a cui ti stai collegando.

Caso d'Uso Pratico: Esporre un server web locale a una rete remota.

Supponiamo che tu stia sviluppando un'applicazione web sul tuo laptop e voglia mostrarla a un collega che ha accesso solo alla rete interna della tua azienda, e tu abbia un server SSH (tuo_server_ssh.com) accessibile da quella rete.

Sul tuo laptop, eseguirai:

ssh -R 8080:localhost:3000 tuo_utente@tuo_server_ssh.com
  • Questo comando ti collega a tuo_server_ssh.com.
  • Dice a tuo_server_ssh.com di ascoltare sulla porta 8080.
  • Qualsiasi connessione a tuo_server_ssh.com:8080 verrà inoltrata attraverso il tunnel SSH al tuo laptop (localhost) sulla porta 3000 (dove è in esecuzione il tuo server web).

Ora il tuo collega può accedere alla tua applicazione web navigando su http://tuo_server_ssh.com:8080 nel suo browser. Il traffico va dal suo browser al server SSH, attraverso il tunnel al tuo laptop, e poi al tuo server web.

Attenzione: Nelle configurazioni OpenSSH tipiche, la remote_port è raggiungibile solo dal server SSH stesso. Per permettere ad altre macchine sulla rete remota di accedere alla porta inoltrata, imposta esplicitamente remote_bind_address a 0.0.0.0 o * e assicurati che il server SSH lo permetta con un'impostazione GatewayPorts come clientspecified o yes.

ssh -R 0.0.0.0:8080:localhost:3000 tuo_utente@tuo_server_ssh.com

Port Forwarding Dinamico (-D)

Il port forwarding dinamico crea un proxy SOCKS sulla tua macchina locale. Questo è probabilmente il tipo più flessibile, poiché ti permette di tunnelare qualsiasi applicazione che supporti i proxy SOCKS attraverso la tua connessione SSH. Invece di inoltrare una porta specifica, SSH ascolta su una porta locale e funge da server proxy SOCKS.

Come funziona:

  1. Avvii un client SSH sulla tua macchina locale.
  2. Specifichi una porta locale (local_port) su cui SSH ascolterà come proxy SOCKS.
  3. Configuri le tue applicazioni (browser web, ecc.) per usare localhost:local_port come loro proxy SOCKS.
  4. Quando un'applicazione effettua una richiesta attraverso questo proxy, SSH inoltra il traffico al server SSH, che poi effettua la connessione alla destinazione finale per conto della tua applicazione.

Sintassi:

ssh -D [local_bind_address:]local_port [user@]ssh_server_host
  • local_bind_address: (Opzionale) L'indirizzo sulla tua macchina locale a cui associare la porta del proxy SOCKS in ascolto. Il valore predefinito è localhost.
  • local_port: La porta sulla tua macchina locale su cui SSH ascolterà come proxy SOCKS.
  • user@ssh_server_host: Il tuo nome utente e il nome host/indirizzo IP del server SSH a cui ti stai collegando.

Caso d'Uso Pratico: Navigare sul web in modo sicuro da una rete Wi-Fi pubblica.

Quando sei connesso a una rete Wi-Fi pubblica non affidabile, il tuo traffico è vulnerabile. Puoi usare il port forwarding dinamico per tunnelare tutto il traffico di navigazione web attraverso una connessione SSH crittografata a un server affidabile.

Sul tuo laptop, esegui:

ssh -D 1080 tuo_utente@tuo_server_affidabile.com
  • Questo comando ti collega a tuo_server_affidabile.com.
  • Apre la porta 1080 sulla tua macchina locale, fungendo da proxy SOCKS.

Successivamente, configura il tuo browser web o un'altra applicazione per usare un proxy SOCKS su localhost sulla porta 1080. Se l'applicazione ha un'opzione DNS remoto SOCKS5, usala quando non vuoi che le ricerche DNS avvengano sulla tua rete locale.

Il traffico del tuo browser viene inviato al tuo server SSH, che poi si connette al sito di destinazione. HTTPS è comunque importante; il tunnel SSH protegge il percorso verso il tuo server SSH, non ogni hop successivo.

Suggerimento: Puoi combinare -D con -C per la compressione, che può essere vantaggiosa su collegamenti di rete più lenti.

ssh -C -D 1080 tuo_utente@tuo_server_affidabile.com

Considerazioni Avanzate e Buone Pratiche

  • Configurazione del Server SSH (sshd_config): Alcune funzionalità di forwarding richiedono l'autorizzazione lato server. Controlla AllowTcpForwarding, PermitOpen, PermitListen e GatewayPorts prima di presumere che un tunnel possa ascoltare o connettersi ovunque.
  • Firewall: Ricorda che i firewall sul client, sul server o sulle reti intermedie possono bloccare le connessioni SSH o le porte utilizzate per il forwarding. Assicurati che le porte necessarie (di solito 22 per SSH stesso) siano aperte.
  • Sicurezza: Sebbene il port forwarding crittografi il traffico, la sicurezza del tunnel dipende dalla sicurezza del tuo server SSH. Usa chiavi SSH forti, disabilita l'autenticazione tramite password e mantieni aggiornato il tuo server SSH.
  • Affidabilità: Per gli script, aggiungi -o ExitOnForwardFailure=yes in modo che SSH esca se non riesce a creare il forward richiesto. Per tunnel di lunga durata, considera autossh o un servizio supervisionato.

Conclusione

Usa -L quando il tuo laptop deve raggiungere un servizio remoto privato. Usa -R quando un host remoto deve raggiungere qualcosa vicino al tuo laptop. Usa -D quando hai bisogno di un proxy SOCKS attraverso un server SSH affidabile. Mantieni i bind stretti, controlla le policy del server e tratta ogni tunnel come un'apertura di rete temporanea.