Netcat
Questo esercizio è dedicato a conoscere il comando netcat
,
che può essere un utile strumento per interagire con servizi in rete,
e soprattutto per capire meglio come funzionano le comunicazione
client / server.
Il comando netcat
è l'equivalente "in rete" del comando
cat
, che è stato usato fino ad ora per stampare il contenuto
di file di testo. Prima di procedere, conviene ricordare cosa fa esattamente
cat
:
- Quando viene lanciato senza argomenti, il comando
cat
legge l'input dell'utente, e lo ristampa uguale riga per riga. Si provi a lanciarecat
e ad inserire alcune righe di testo, per verificarne l'effetto. Si termini il comando conCTRL + C
. - Quando viene specificato uno (o più) file, il comando
cat
legge da quello, invece che direttamente dall'utente. Usando la redirezione con>
è possibile scrivere su dei file
Una cosa analoga succede con netcat
. La differenza sostanziale è che questo comando
si può usare per ascoltare su una porta, oppure per mandare pacchetti ad un server su qualche
altro host (e anche in questo caso su una determinata porta). Nel primo caso, il comando stampa
a video i dati che riceve, nel secondo invia quelli che vengono inseriti dall'utente (oppure mandanti
in input con il simbolo |
Il comando netcat
si può lanciare anche con la sua versione abbreviata
nc
, che d'ora in poi preferiremo.
nc towel.blinkenlights.nl 23
possiamo usare il comando
NetCat come una specie di telnet: si collega all'host che abbiamo sperimentato
prima nell'esercizio sul telnet, e stampa a video tutto quello che quel
server manda come risposta. Nel caso inserissimo dei caratteri, questi
verrebbero inviato al server (che in questo specifico caso li ignorerebbe).
Il caso più interessante è quello in cui si usa NetCat per ascoltare su una porta specifica, e dunque per ricevere connessioni. A questo scopo, è necessario lanciare il comando
$ nc -l -p 8080 # Esempio per la porta 8080È bene ricordare che solo le porte maggiori di 1024 possono essere aperte da utenti normali.
- Uno studente esegue il comando
nc -l -p NNNN
sulla macchina in cui si trova, doveNNNN
è una porta scelta a piacere. Attenzione, questo comando potrebbe dare errore nel caso la porta fosse già impegnata, ad esempio perché c'é un servizio aperto su quella porta, o qualche altro studente che sta facendo l'esercizo. - Il secondo studente esegue il comando
nc labN NNNN
per collegarsi al server del primo. A quel punto, si sarà aperto un canale di comunicazione in cui sarà possibile scambiarsi dei messaggi.
Ora che si è visto un primo esempio, è il momento di provare a fare un esercizio più
avanzato. Ricapitoliamo il funzionamento del comando tar
:
- Il comando
tar -c file1 file2 cartella1 cartella2 ...
permette di impacchettare più file e cartelle nello stesso file; se l'output non viene specificato con l'opzione-f miofile.tar
, come abbiamo fatto la settimana scorsa, il risultato viene stampato sul terminale (provare, ma con criterio! non vorrete un file enorme e binario stampato sul vostro schermo). - In maniera analoga, il comando
tar -x
estrae un file in formato tar nella directory corrente. Se il file non viene specificato con-f nomefile.tar
, allora ci si aspetta che venga inserito dall'utente.
tar
combinato con nc
per
spedire file fra calcolatori.
tar
e nc
.
In particolare:
- L'utente ricevente apre un server su una porta concordata, e manda
tutto l'output ricevuto in pipe al comando
tar -x -v
; il flat-x
indica a tar di estrarre i file, e-v
di stampare la lista dei file estratti. Questo si può ottenere con il comando (ad esempio):$ nc -l -p 1234 | tar -x -v
- L'utente che invia i file li comprime con tar, e li manda in input con
il simbolo
|
al comandonc labN 1234
, dovelabN
è il PC di destinazione, e1234
la porta scelta.
Il comando ssh
è un esempio di client che si collega al
server SSH, e ci comunica utilizzando una porta prefissata. Vediamo ora
come usare il comando nc
per effettuare un esperimento
inverso rispetto al precedente: fingere di essere il server SSH,
e vedere cosa invia il comando ssh
quando si connette.
- Si apra un server con netcat su una porta a scelta
- Da un'altra macchina (o anche dalla stessa), si provi ad aprire
un collegamento SSH dicendo ad SSH di non utilizzare la porta 22,
ma l'altra porta su cui si è aperto il server. Per fare questo,
si può usare il flag
-p
di SSH.
Simulare un server web
Quando si visita una pagina web (ad esempio www.google.com), il browser contatta il server corrispondente al nome di dominio sulla porta 80, e richiede la pagina desiderata utilizzando un protocollo di nome HTTP.
In questo esercizio si proverà a simulare un server web su una delle
macchina lab, a cui si collegherà dal browser (dal proprio PC a casa).
Per fare questo si utilizzerà netcat su una porta con un numero alto
(non avremmo i permessi di aprire un server sulla porta 80) e poi
si potrà visitare la pagina http://labN.cs.dm.unipi.it:NNNNN; al solito,
labN
indica la macchina scelta, e NNNNNN
sarà
la porta scelta.
In condizioni normali, non è possibile accettare connessioni sulle macchine del laboratorio dall'esterno, perché il firewall le blocca. Per questo laboratorio, e solo per le ore di laboratorio, sono state temporaneamente sbloccate le porta da 16000 a 16010. In particolare, non sarà possibile replicare questo esercizio fuori dalle ore di laboratorio.
HTTP/1.1 200 OK Messaggio di provaFinita di scrivere la risposta, si termini
netcat
premendo CTRL+C
. Si
vedrà il messaggio apparire nel browser. Occorre essere sufficientemente rapidi a digitare,
per evitare che il browser si stufi di aspettare una risposta e segnali un timeout.
Nel caso si volese preparare il messaggio in precedenza, è possibile salvarlo in un
file di testo e usare l'operatore <
per usarlo come input per
nc
. In ogni caso, sarà necessario terminare la connessione con
CTRL+C
per comunicare al browser che non ci sono altri dati appena
si vedono arrivare i dati.