Il funzionamento base del comando SSH è molto semplice: ssh nomeUtente@server.com. Ma quando iniziamo ad aggiungere parametri e svolgere configurazioni avanzate rischiamo rapidamente di trovarci a dover digitare dei "mostri" come ssh -i /home/zane/ssh/chiave2 -R 8080:127.0.0.1:8080 -p 2222 root@server.com ogni volta che vogliamo connetterci. E, se dobbiamo passare per un server intermedio (proxy server), le cose si complicano ancora di più. Ebbene: il file .ssh/config è fatto apposta per semplificarci la vita, e riportare tutto ad un più pratico comando ssh mioserver (indipendentemente dal numero di parametri). Vediamo come utilizzarlo al meglio in questa guida a .ssh/config per Windows 10 o Linux

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux) - come usare sshconfig

nota: in questo articolo parleremo nello specifico del file .ssh/config e di come utilizzarlo per semplificare la connessione SSH in ambiente Windows 10 o Linux. Per la guida generale per iniziare con SSH, si veda quest'altro approfondimento:

» Leggi: SSH con Windows, Linux, Mac: la Guida Definitiva - Come accedere ad un VPS, server cloud AWS/Azure o server aziendale con facilità

Per chi ha fretta: un file .ssh/config completo

Nel corso della presente guida vedremo in dettaglio tutte le opzioni principali. Se però sei già esperto e cerchi semplicemente un file .ssh/config completo e pronto da personalizzare, eccoti servito:

## Server aziendale

Host azienda

Hostname utenti.mia-azienda.com

User pippo

Port 2222

IdentityFile ~/.ssh/id_rsa_server-aziendale

StrictHostKeyChecking no

LocalForward 5555 localhost:3306

LocalForward 5556 localhost:27017

LocalForward 5557 localhost:27018

LocalForward 6666 192.168.0.2:3306

RemoteForward 9003 localhost:9001

ProxyJump nome-utente-accesso-proxy@nome-server-proxy.mia-azienda.com:2222

Di seguito vedremo in dettaglio il significato di ogni opzione.

Creare/aprire il file .ssh/config

Il file config di SSH è un semplice file di testo che risiede all'interno della sotto-cartella .ssh della nostra directory "home":

  • con Windows 10: C:\Users\nome-utente\.ssh
  • con Linux: /home/nome-utente/.ssh

In caso la sotto-cartella ancora non esistesse, creiamola ora

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux) - zShotVM_1622444225

All'interno di essa, creiamo il nostro file config. Nello svolgere l'operazione (soprattutto in ambiente Windows), facciamo la massima attenzione ad ottenere esattamente un file di nome config, senza estensione, e non config.txt!

» Leggi: Come visualizzare le estensioni dei file con Windows 10

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux) - zShotVM_1622457937

A questo punto, apriamolo con Blocco note o un altro editor di testo semplice.

Creare un semplice "profilo" di connessione SSH con .ssh/config

All'interno del file .ssh/config dobbiamo creare un "profilo" per ogni PC o server al quale vogliamo connetterci. Ognuno di questi profili conterrà tutti i dati e le opzioni relative a quella connessione. Per esempio: immaginiamo di utilizzare spesso SSH per connetterci al server con nome a dominio utenti.mia-azienda.com e di dover utilizzare il nome utente pippo per il login. Impartiremo quindi molte volte al giorno questo comando: ssh pippo@utenti.mia-azienda.com

Per semplificare le cose, aggiungiamo queste righe al nostro file .ssh/config:

## Server aziendale

Host azienda

Hostname utenti.mia-azienda.com

User pippo

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux) - zShotVM_1622468466

Salviamo e, d'ora in avanti, potremo facilmente connetterci al server in questione impartendo solamente:

ssh azienda

Possiamo naturalmente creare tutti i profili che desideriamo seguendo questo schema:

  • ## Server aziendale: tutte le righe che iniziano con il carattere # vengono ignorate. Possiamo usare questi commenti per appuntarci alcune informazioni sul server in questione
  • Host azienda: è un nome a piacere che identifica questo server. Successivamente, quando impartiremo il comando ssh seguito da questo nome, ci connetteremo a questo server
  • Hostname utenti.mia-azienda.com: è il nome a dominio oppure l'indirizzo IP del server SSH al quale vogliamo connetterci
  • User pippo: è il nome utente che dobbiamo utilizzare sul server SSH per l'autenticazione

.ssh/config: Specificare la porta SSH

Se il server SSH utilizza una porta diversa dalla 22 (cioè quella predefinita), probabilmente siamo abituati ad accodare il parametro -p seguito dal numero di porta (ad esempio: -p 2222) quando digitiamo il comando di connessione: ssh pippo@utenti.mia-azienda.com -p 2222.

In tal caso, aggiungiamo anche questa informazione al nostro profilo:

Host azienda

Hostname utenti.mia-azienda.com

User pippo

Port 2222

Così facendo, potremo continuare ad usare il nostro comando ssh azienda senza aggiungere nient'altro.

.ssh/config: Utilizzare una chiave differente

Come abbiamo visto nella guida dedicata, SSH consente di eseguire login utilizzando un ben più robusto file-chiave al posto della password:

» Leggi: [guida] Come creare una chiave SSH da PC Windows, Linux, Mac e accedere ai server senza password

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux) - autenticazione chiave ssh windows linux mac

Generalmente, il sistema funziona automaticamente selezionando il file-chiave che si trova in .ssh/id_rsa. Se, però, è necessario utilizzare uno specifico file-chiave, diverso da quello standard, generalmente si usa l'argomento -i seguito dal percorso del file:

ssh pippo@utenti.mia-azienda.com -i ~/.ssh/id_rsa_server-aziendale

Possiamo specificare questo percorso nel profilo di connessione del file .ssh/config, di modo da non doverlo specificare ogni volta:

Host azienda

Hostname utenti.mia-azienda.com

User pippo

IdentityFile ~/.ssh/id_rsa_server-aziendale

Con questa semplice accortezza, potremo continuare ad usare il nostro comando ssh azienda, utilizzando però il file-chiave indicato.

StrictHostKeyChecking in .ssh/config

In alcune circostanze, può capitare che l'identità del server al quale ci stiamo connettendo in SSH venga modificata. Questo può succedere, ad esempio, se l'amministratore di sistema svolge alcune operazioni di manutenzione significative, quali la sostituzione del server remoto, oppure modifica il suo indirizzo IP

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux)

Quando questo avviene, il nostro client SSH mostra un messaggio simile a WARNING: POSSIBLE DNS SPOOFING DETECTED! e/o WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! e blocca la connessione

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux)

Il modo corretto e sicuro di gestire la situazione è di verificare con il gestore del server al quale ci stiamo connettendo che sia tutto in ordine, poi seguire le istruzioni fornite nel messaggio di errore per aggiornare la configurazione locale. Se però siamo di fretta, possiamo aggiungere una linea al nostro profilo per ignorare questo tipo di errori:

Host azienda

Hostname utenti.mia-azienda.com

User pippo

StrictHostKeyChecking no

Così facendo, alla prossima connessione verrà comunque visualizzato un messaggio di avviso, ma poi potremo comunque collegarci utilizzando l'autenticazione tramite chiave (in questa circostanza, l'autenticazione via password viene sempre disattivata per motivi di sicurezza).

.ssh/config: Esporre un servizio remoto al PC locale con un tunnel SSH

In alcune circostanze, risulta necessario connettersi, dal PC locale, a servizi raggiungibili solamente dal server remoto. Un esempio su tutti: capita spesso di collegarsi in SSH ad un server sul quale è in esecuzione un database (come MySQL). Tale servizio non è però esposto su Internet, ma raggiungibile solo dal server stesso. Per collegarci al database in questione dal nostro PC dobbiamo quindi sfruttare la connessione SSH tramite un tunnel SSH

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux)

Aprire tale tunnel tramite file .ssh/config è semplicissimo:

Host azienda

Hostname utenti.mia-azienda.com

User pippo

LocalForward 5555 localhost:3306

Dove:

  • 5555: è il numero di porta locale sulla quale vogliamo rendere raggiungibile il servizio remoto - può essere un numero qualsiasi, a patto che non sia già utilizzata da altri servizi locali
  • 3306: è il numero della porta sul server che desideriamo rendere disponibile al nostro PC locale - 3306, per inciso, è la porta di default utilizzata da MySQL

» Leggi anche: Porta 80 aperta! cosa significa? Guida riepilogativa ai principali numeri di porta TCP per la comunicazione in rete

A questo punto, dal nostro PC, potremo collegarci alla porta locale 5555, alla quale risponderà il database remoto

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux)

Per inciso: quella appena descritta è esattamente la modalità che utilizzo per collegarmi al database di TurboLab.it!

Un altro esempio per affrontare una necessità molto comune: stabilire la connessione ad un'istanza MongoDB in esecuzione sul server remoto (questo deve SEMPRE essere bloccato e rimanere accessibile solo localmente!):

Host azienda

Hostname utenti.mia-azienda.com

User pippo

LocalForward 5556 localhost:27017

LocalForward 5557 localhost:27018

Così facendo, potremmo accedere ai dati di MongoDB dal nostro PC collegandoci alle porte locali 5556 e 5557.

.ssh/config: tunnel SSH verso un servizio in esecuzione su un altro server

Come variante, leggermente più complicata, del caso precedente, immaginiamo che il database o l'istanza MongoDB sia in esecuzione su di un altro server. Ovvero: noi ci colleghiamo in SSH ad un primo server che, a sua volta, si connette ad un database in esecuzione su un server distinto. Il "server database" non è direttamente accessibile dal nostro PC

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux) - ssh tunnel terzo server

In questo caso dobbiamo configurare un tunnel che attraversi il server SSH al quale siamo collegati per poi raggiungere il servizio sul secondo server.

Nel nostro file .ssh/config scriveremo qualcosa di simile a questo:

Host azienda

Hostname utenti.mia-azienda.com

User pippo

LocalForward 5555 192.168.0.2:3306

Dove:

  • 5555: è il numero di porta locale sulla quale vogliamo rendere raggiungibile il servizio remoto - può essere un numero qualsiasi, a patto che non sia già utilizzata da altri servizi locali
  • 192.168.0.2:3306: è l'indirizzo IP del "secondo server", seguito dal numero di porta che eroga il servizio che ci interessa - di nuovo: 3306, qui usato come esempio, è la porta di MySQL

A questo punto, dal nostro PC, potremo collegarci alle porte locali che abbiamo scelto, sulle quali risponderanno i servizi in esecuzione sul "secondo server"

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux)

.ssh/config: Esporre un servizio locale al server remoto (tunnel SSH al contrario)

Nei due esempi precedenti abbiamo visto come rendere disponibile un servizio remoto al PC locale. Ma è possibile anche fare l'inverso, ovvero rendere disponibile un servizio locale al server remoto. Per mantenere analogia con l'esempio precedente: immaginiamo che il database, questa volta, sia in esecuzione sul PC locale e lo si voglia esporre al server remoto.

Nella mia esperienza, ho avuto bisogno di utilizzare questa configurazione solo in un caso specifico: con Xdebug, uno strumento di debugging per PHP in esecuzione sul server web che si connette ad una porta del nostro PC, sulla quale è in esecuzione l'ambiente di sviluppo (IDE). Allo scopo, seguiamo questa configurazione:

Host azienda

Hostname utenti.mia-azienda.com

User pippo

RemoteForward 9003 localhost:9001

Così facendo, la porta locale 9001 diverrà contattabile dal server sulla sua porta 9003 (utilizzata di default da Xdebug), permettendo la sessione di debug tramite l'IDE in esecuzione sul PC locale.

» Leggi anche: Come configurare Xdebug e Visual Studio Code: la Guida Definitiva al debug PHP (con stop sui breakpoint!)

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux) - Visual Studio Code xdebug

.ssh/config: Configurare un proxy intermedio

In alcuni ambienti aziendali, non è possibile collegarsi direttamente in SSH ai server/PC che desideriamo. Per migliorare la sicurezza, è infatti richiesto di collegarsi dapprima ad un server SSH "di frontiera" (detto proxy) e, da qui, "rimbalzare" verso il server al quale vogliamo effettivamente connetterci

[guida] Come configurare connessione SSH tunnel, proxy chiavi diverse: guida file .ssh/config ( esempi pratici, Windows 10 Linux)

La configurazione, in questo caso, rimane praticamente identica. Nel nostro profilo continuiamo infatti ad indicare il server "finale" al quale desideriamo connetterci, ma aggiungiamo poi un'altra riga dedicata alla connessione al proxy:

Host azienda

Hostname utenti.mia-azienda.com

User pippo

ProxyJump nome-utente-accesso-proxy@nome-server-proxy.mia-azienda.com:2222

Dove:

  • nome-utente-accesso-proxy: è il nome utente da utilizzare per connettersi al server intermedio
  • nome-server-proxy.mia-azienda.com: è il nome a dominio (oppure l'indirizzo IP) del server intermedio, ovvero quello che svolge il ruolo di proxy
  • 2222: è il numero di porta SSH sul server intermedio

Dopo aver configurato le cose in questo modo, potremo utilizzare il nostro solito comando ssh azienda per attraversare il proxy e raggiungere la nostra destinazione finale come al solito: il proxy sarà del tutto "invisibile".

.ssh/config: Specificare valori comuni a tutti i profili

Se abbiamo molti profili configurati, è interessante notare che non è necessario ripetere le direttive comuni in ogni singolo profilo. Se, ad esempio, il nome utente da utilizzare per l'accesso è sempre pippo e/o la porta è sempre la 2222, possiamo indicare questi valori come default tramite un profilo dedicato:

Host *

Username pippo

Port 2222

Chiaramente possiamo aggiungere a questa sezione anche tutte le altre opzioni "comuni". In ogni caso, restiamo liberi di definire eccezioni puntuali per ogni singolo profilo. Ad esempio:

Host azienda

Hostname utenti.mia-azienda.com

User root

Port 22

Conclusioni

In questo articolo abbiamo visto come sfruttare il file .ssh/config per semplificare le connessioni SSH. Se usato in modo appropriato, questo file di configurazione ci permette di connetterci ai nostri server o PC tramite SSH in modo molto più comodo, in particolar modo per quelle connessioni che richiedono una lunga lista di opzioni per funzionare correttamente.

Personalmente, aggiunto sempre un nuovo profilo al file prima di stabilire una connessione SSH, non fosse altro per la comodità di accorciare il comando e non dover specificare il nome utente ogni volta.