SSH (secure shell) è un protocollo che permette di stabilire una connessione cifrata tra un host client e un server.
Viene utilizzato spesso per connettersi da remoto ad un server linux per amministrarlo, sostituendo il vecchio ed insicuro telnet. Sono presenti in rete innumerevoli guide su SSH, che descrivono l’installazione, la configurazione e l’uso. In questo articolo focalizzeremo la nostra attenzione su come usare SSH per fare il local e il remote port forwarding.
Il port forwarding o tunnelling è un modo per inoltrare traffico TCP insicuro attraverso SSH per renderlo sicuro e non decifrabile. Utilizzando questa tecnica, i dati appartenenti a protocolli intrinsecamente insicuri come POP3, HTTP ecc. possono essere incapsulati in un tunnell SSH e resi sicuri, utilizzando la crittografia a chiave pubblica.
Come già detto esistono due tipi di port forwarding, local e remote, noti rispettivamente come outgoing tunnel (tunnel in uscita) e incoming tunnel (tunnel in entrata).
Iniziamo ad occuparci del local port forwarding:
Il local port forwarding inoltra il traffico indirizzato su una porta locale del client, attraverso un tunnel SSH, verso un servizio attivo/in ascolto su una porta remota di un server, che non deve necessariamente coincidere col server SSH con cui è stato attivato il tunnel, è sufficiente che sia sulla stessa sottorete del server SSH.
Ad esempio il traffico indirizzato alla porta 8080 del computer locale, potrebbe essere inoltrato sulla porta 80 del Server SSH col quale abbiamo stabilito la connessione(tunnel) o su un altro server presente nella sua stessa rete.
La figura seguente mostra uno scenario di local port forwarding:
Vediamo ora un esempio:
Immaginiamo di volerci collegare dal computer di casa, utilizzando la porta 8080, verso un server HTTP presente sul luogo di lavoro in ascolto sulla porta 80 ed avente indirizzo LAN 192.168.3.1, supponiamo, inoltre, che l’IP pubblico del server SSH sul luogo di lavoro sia 69.80.200.34, in questo caso è necessario stabilire una connessione mediante il comando seguente:
ssh mio-nome-utente-sul-server@69.80.200.34 -L 8080:192.168.3.1:80
(Se si sta usando windows, basta scaricare putty un client ssh per windows)
Analizziamo il comando nei dettagli:
ssh (nome del comando)
mio-nome-utente-sul-server@69.80.200.34 (indica il server SSH al quale connettersi mediante il suo IP pubblico e l’utenza abilitata su quel server)
-L (opzione di comando per il local port forwarding)
8080:192.168.3.1:80 (afferma che le connessioni locali verso la porta 8080, vanno inoltrate al server con indirizzo LAN 192.168.3.1 presente nella rete del luogo di lavoro e vanno indirizzate al servizio in ascolto sulla porta 80)
A questo punto se apro il browser del mio computer di casa e sulla barra degli indirizzi digito: http://localhost:8080, mi viene aperta la home page presente sul server web del luogo in cui lavoro.
Se il server web fosse installato sulla stessa macchina del server SSH, il comando sarebbe:
ssh mio-nome-utente-sul-server@69.80.200.34 -L 8080:localhost:80
Osservate che localhost nel comando indica la macchina stessa con cui ho effettuato la connessione SSH (quindi il server ssh remoto) e non un’altra macchina della rete.
Vediamo un ultimo esempio sul local port forwarding:
ssh nomeutente@IP-SERVER-SSH -L 2222:192.168.3.5:3389
Con questo comando dal mio PC di casa mi connetto al desktop remoto del mio PC del luogo di lavoro (porta 3389) utilizzando il tunnel SSH e quindi con dati che non transitano sulla rete pubblica in chiaro.
Trattiamo adesso il Remote port forwarding
Il remote port forwarding è il complementare del local port forwarding, ossia provvede ad inoltrare il traffico da una porta remota verso una porta locale (es. dal luogo di lavoro verso un pc della LAN di casa mia)
La figura seguente mostra un tipico scenario di remote port forwarding:
L’esempio in figura mostra come garantirsi la possibilità di accedere dall’ufficio al game server di casa…ecco cosa fare:
Quando siete a casa digitate il comando seguente:
ssh mio-nome-utente-server-ssh-ufficio@IP-server-ssh-ufficio -R 62732:192.168.2.250:62732
Con questo comando mi garantisco l’accesso dall’ufficio, utilizzando la porta 62732, al game server di casa con indirizzo LAN 192.168.2.250 attivo sulla porta 62732 (le due porte non devono necessariamente coincidere).