SSH: Tips and Tricks

opensshlinux

Qualsiasi utente Linux si troverà prima o poi nella condizione di dover fare login su una macchina remota, e scoprirà l’esistenza di SSH.

SSH (che poi sta per Secure SHell)è un protocollo nato per cifrare la comunicazione di dati tra i vari host di una rete e per rimpiazzare tutte le implementazioni di shell remote poco sicure proprio perchè non cifrate (vedi Telnet e RSH).

In questo articolo non esporrò l’utilizzo di base di ssh, ma alcuni suggerimenti molto utili e poco conosciuti.

ControlMaster

Questa feature di SSH permette di riutilizzare una connessione esistente per più sessioni ssh.

Al momento della prima connessione verso un host, il client ssh creerà un socket attraverso il quale passeranno tutte le sessioni aperte verso quella macchina. Il socket verrà creato nella posizione indicata dalla direttiva ControlPath.

Usando il ControlMaster, si ottengono diversi effetti benefici, ad esempio aprendo una nuova sessione su una macchina a cui si è già connessi, non sarà necessario fare di nuovo login, in quanto il client utilizzerà il socket autenticato nella sessione precedente.
Inoltre il ControlMaster permette anche l’autocompletamento dei path remoti e velocizza le operazioni di trasferimento file, come quelle effettuate tramite scp o sshfs.

Per attivare questa feature è necessario inserire nel file di configurazione del vostro client ssh (solitamente posto in ˜/.ssh/config) le due righe che seguono:

ControlMaster auto
ControlPath ~/.ssh/sock/%r@%h:%p

La prima riga attiva la feature ControlMaster in modalità ‘auto’, in questo modo all’apertura di ogni nuova connessione il client ssh si preoccuperà prima di controllare se esiste un socket da sfruttare, o in alternativa di crearlo.
I valori possibili per l’opzione ControlMaster sono:

  • no: il default, nessun socket verrà creato
  • ask: ad ogni tentativo di connessione, verrà chiesto se usare l’eventuale socket disponibile
  • yes: il client userà il socket se è disponibile, altrimenti procederà con la connessione normale
  • auto: il client userà il socket se è disponibile, altrimenti procederà con la connessione normale ed istanzierà il nuovo socket per le connessioni future
  • autoask: un misto tra auto ed ask

La seconda riga specifica in quale path salvare i socket usati per le connessioni, in questo caso dentro a ~/.ssh/sock/%r@%h:%p.

La sequenza di caratteri specifica come dovrà essere chiamato il file, ecco il significato dei vari pattern:

  • %r: il login name remoto
  • %h: l’host remoto
  • %p: la porta remota
  • %l: l’hostname locale

È consigliabile inserire nel path almeno i parametri %r, %h e %p, in modo da identificare univocamente ogni socket.
A questo punto l’unica cosa che rimane da fare è creare la directory ‘sock’ all’interno di ~/.ssh/.

Connessione Persistente

Sempre sfruttando la funzionalità ControlMaster, è possibile effettuare una singola connessione persistente, che verrà messa in background, e sarà il ControlMaster per tutte le connessioni dirette ad una macchina.
Tale tecnica è utile nel caso si facciano molte connessioni di breve durata, come nel caso dell’utilizzo di tool come DistCC su SSH.
Per lanciare una connessione persistente è sufficiente lanciare il client ssh specificando le opzioni -MNf:

$ ssh -MNf fpedrini@host
fpedrini@host's password:
$

Da questo momento tutte le connessioni verso ‘host’ sfrutteranno il socket appena creato, senza dover rinegoziare ogni volta l’autenticazione.

Sequenze di Escape

Le sequenze di escape di SSH mettono il client in una modalità diversa dalla normale da cui eseguire diverse operazioni, come ad esempio eseguire il forward di una porta senza rieffettuare la connessione oppure mandare in background il client ssh per recuperarlo successivamente tramite il comando ‘fg’.

Di default le sequenze di escape vengono attivate dalla pressione della tilde (~: sulla tastiera italiana AltGr+ì) subito dopo un ritorno a capo (dato con enter), il carattere che segue la tilde specificherà l’azione da eseguire.
Per scoprire quali sono le sequenze di escape accettate è sufficiente digitare, all’interno di una sessione, la sequenza <ENTER>~?, l’output sarà simile al seguente:

fpedrini@host:~$ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~& - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

Di particolare interesse sono, a mio avviso, le sequenze “~C” e “~#”, la prima fa accedere alla commandline di SSH per poter, ad esempio, effettuare il forward di una porta, mentre la seconda mostra tutte le connessioni aperte tra la macchina locale e quella remota:

fpedrini@host:~$ ~C
ssh> -Lport:host:hostport
fpedrini@host:~$
fpedrini@host:~$ ~#
The following connections are open:
  #0 client-session (t4 r0 i0/0 o0/0 fd 4/5 cfd -1)
  #2 client-session (t4 r1 i0/0 o0/0 fd 10/11 cfd 9

L’altra sequenza molto interessante è “~.”, che permette di killare una connessione ssh rimasta appesa senza dover essere costretti ad aprire un altro terminale e uccidere brutalmente il client ssh.

Sock Proxying

SSH è in grado di agire anche da proxy SOCK feature molto comoda nel caso in cui le regole dei vari firewall/proxy aziendali troppo restrittivi per quanto riguarda l’accesso al Web, ma permettano il traffico via SSH all’esterno della LAN.

Per attivare tale feature è sufficiente il seguente comando:

ssh -D 1234 utente@host -C

Da questo momento, tutte le connessioni effettuate attraverso la porta 1234 del vostro pc verranno forwardate all’host remoto che le farà uscire verso internet, l’unica cosa da fare per poter navigare liberamente è configurare il vostro browser per fargli usare come proxy “localhost:1234”.
L’opzione -C invece, non ha nulla a che fare con il forwarding delle connessioni, serve solo ad attivare la compressione del protocollo SSH.

Conclusioni

Questi tre piccoli trucchetti sono solo alcune delle funzionalità più utili di SSH, ma sono forse quelli meno conosciuti e che sono più difficili da capire durante la lettura della manpage.

Per tutte le altre funzionalità, rimando comunque alla manpage e ai numerosi howto presenti su internet.openssh

3 risposte a “SSH: Tips and Tricks”

  1. Avatar michelangelog
    michelangelog

    Mi permetto di fare una piccola aggiunta ai tuoi ottimi suggerimenti.
    Spesso farebbe comodo accedere alla macchina HOST_C dalla nostra macchina HOST_A
    ma magari la macchina HOST_C non permette l’accesso alla nostra macchina oppure
    non permette l’accesso ad una determinata porta, capita invece di avere accesso
    alla macchina HOST_B e magari questa ha un accesso ad HOST_C.
    Si può sfruttare l’ssh per creare un “tunnel” che in pratica ci permette tramite
    la macchina HOST_B di avere un accesso alla porta desiderata su HOST_C.
    Supponiamo di avere un istanza di oracle sulla porta 1523 di HOST_C a cui si
    vuole accedere magari tramite un tool grafico come oracle sql developer,
    la sintassi per il tunnel ssh è la seguente:
    ssh -L PORTA_LOCALE:HOST_C:PORTA(host e porta a cui non possiamo accedere)
    utente@HOST_B(host su cui abbiamo l’accesso)
    ad esempio suppinendo che vogliamo sulla porta locale 9999 il forward della
    porta 1523 di HOST_C
    ssh -L 9999:HOST_C:1523 user@HOST_B
    ora una semplice connessione localhost:9999 viene inoltrata su 1523 di HOST_C.

  2. Avatar Francesco Pedrini

    Ciao michelangelog!

    Grazie per il suggerimento 🙂

    Sto raccogliendo spunti per un secondo articolo della serie (non faccio promesse sulle tempistiche però ;)) e di sicuro inserirò anche questo 😉

    Ciao,
    Francesco

  3. Avatar Matteo
    Matteo

    Ciao,
    il vantaggio di avere una socket cioè una connessione e sfruttarla per avere più sessioni quali vantaggi ha? Prestazioni?
    Grazie
    Matteo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *