Esercizi LabOS

LEZIONE del 30 Ottobre

Nelle lezioni precedenti la Bourne shell è stata introdotta come linguaggio di comandi per accedere alle funzionalità della macchina, possibilmente creando script che fossero di una qualche utilità per l'utente finale.

Fra le molte possibili funzionalità ci sono quelle che riguardano l'accesso alla rete e il relativo controllo del traffico di pacchetti su di essi. Da questo punto di vista ogni piattaforma Unix è dotata da una miriade di comandi per configurare, controllare, modificare le funzionalità di rete.

Nella lezione odierna, dopo un brevissimo escursus nel mondo delle reti per comprenderne i meccanismi base di funzionamento, verranno presentati un certo numero di comandi, fra i più famosi, che un utente può impiegare per gli scopi indicati. Si fa presente, comunque, che tali comandi sono pensati più per il system manager piuttosto che per l'utente normale per cui la loro piena funzionalità è possibile solo in modalità root.

Reti di Calcolatori

Quando furono sviluppati i primi calcoltori elettronici si pensò, innanzitutto, a costruire grossi sistemi sia hardware che software capaci di rispondere alle richieste di parecchie centinaia, fino a migliaia, di utenti contemporaneamente connessi col sistema.

La politica dei mainframe fu alla base dello sviluppo degli elaboratori fino alla fine degli anni '70 quando cominciarono a diffondersi elaboratori di dimensioni più contenute e quindi più abbordabili dal punto di vista dei costi.

Con i minicomputer e microcomputer la connessione in rete divenne una necessità e ancora una volta il sistema operativo UNIX era in prima linea nell'affrontare questa scommessa sul futuro.

Fino a dieci anni fa l'attuale sviluppo della rete internet era del tutto impensabile per il modo stesso con cui fu concepita e sviluppata. La sua antenata, arpanet, nacque placidamente durante gli anni '70 nei campus californiani e, assieme alla sua controparte militare, milnet, sviluppata dal Dipartimento della Difesa statunitense, costituì il nucleo della rete che fu chiamata TCP/IP per via dei due protocolli base che fanno di un insieme di calcolatori una rete di calcolatori.

Infatti, una rete di calcolatori per potersi definire tale deve possedere una particolare struttura funzionale sulla quale possano trasferirsi, in modo trasparente, messaggi potenzialmente bidirezionali per ogni coppia di elaboratori dove un processo, in esecuzione sul primo, voglia scambiare dati con un secondo processo, in esecuzione su un altro elaboratore.

Dunque, una rete di calcolatori è un grafo i cui nodi rappresentano elaboratori (host) e i cui archi sono connessioni fisiche che permettono ad elaboratori, giograficamente vicini, di parlarsi direttamente.

Naturalmente, questa è soltanto una definizione approssimata perchè è necessario specificare nel dettaglio quali convenzioni (i cosiddetti protocolli) devono essere rispettate affinchè gli elaboratori della rete possano realmente scambiarsi messaggi, in modo trasparente rispetto all'implementazione della rete e alle specificità con cui ciascun elaboratore diventa un nodo della rete.

C'è, infine, un ulteriore problema e che si riferisce alle dimensioni fisiche della rete e che, attualmente, non bisogna dimenticarlo si attesta su una struttura comprendente 300-400 milioni di nodi la cui gestione richiede algoritmi di gestione della rete pensati ad hoc per poter lavorare bene con questi numeri.

Così, la rete, oggi generalmente conosciuta col nome internet, è dotata di due strutture connettive che la sostengono permanentemente e che si presentano come due sottoreti dense sulla rete stessa:

La rete per poter assolvere al suo compito deve essere implementata in modo che, quando due processi in esecuzione remota su due distinti calcolatori, vogliono comunicare fra loro sia possibile determinare nella rete un cammino lungo il quale i messaggi, transitando di nodo in nodo, possano giungere a destinazione.

A tale scopo è necessario specificare un certo un insieme di protocolli che, realizzate dalle convenzioni rispettate da tutti gli elaboratori della rete, permettono di sezionare un messaggio di arbitraria lunghezza (sessione) in pacchetti di dimensione fissa opportunamente segnati tali da ricostruire (trasporto, giunti a destinazione, il messaggio originale.

Naturalmente, ciascun pacchetto deve essere in grado di seguire il giusto cammino (istradamento) attraversando i nodi della rete (router) le cui tabelle forniscono localmente la direzione più conveniente (RIP e splitting the horizon) per proseguire. Ma i pacchetti devono essere trasmessi come segnali elettrici per cui devono essere divisi in frame che i protocolli ARP e PPP destinano senza indugi.

Comunque sia, la rete internet utilizza le convenzioni definite dai protocolli TCP e IP per generare, mantenere, istradare e ricostruire i messaggi per cui TCP/IP è la suite di protocolli che talvolta identifica la rete internet per cui questi termini vanno considerati come sinonimi.

Nel seguito viene riportata una collezione di comandi che il sistema operativo Unix mette a disposzione sia dell'utente normale che del system manager per gestire l'accesso in rete ed avere da questa utili informazioni.

Comandi di Rete

Qualunque distribuzione di Linux si consideri risulta dotata di molti comandi per configurare, verificare lo stato e accedere alla rete. Si tratta di comandi resi disponibili al momemto dell'installazione. Nel seguito verrà data una breve descrizione dei comandi di rete più utilizzati, per i quali è comodo organizzarli nelle seguenti categorie:

Configurazione Di Rete

I comandi più importanti sono quelli usati per configurare le interfacce e i metodi di accesso alla rete e, in quanto tali, sono normalmente utilizzati dagli amministratori di sistema, avendo la responsabilità ed il permesso di configurare le macchine di cui sono gestori. Ciò non toglie che gli utenti normali possano utilizzare tali comandi per determinare lo stato dell'installazione in rete della macchina.

Si noti che la maggior parte di questi comandi compaiono negli shell script lanciati durante la fase di boot del sistema che installa la rete. Linux riconosce automaticamente le interfacce della rete al momento del boot, purchè il nucleo sia configurato correttamente. Ad ogni interfaccia viene assegnata automaticamente un'etichetta - come l'interfaccia lo0 di "loopback"con cui la macchina comunica con se stessa, oppure eth0, la prima scheda di rete installata nel sistema.

Questi comandi sono elencati nell'ordine con cui sarebbe necessario invocarli qualora la rete venisse installata manualmente.

ifport (8)
Se alcune delle schede di rete sono configurabili perchè in grado di sostenere vari tipi di transceiver, allora è necessario iniziare la configurazione della macchina sulla rete usando questo comando, specificando il tipo di transceiver impiegato.
ifconfig (8)
Questo comando è usato per configurare le interfacce di rete, o per visualizzare la loro configurazione corrente. Oltre alla loro attivazione e disattivazione, questo comando permette di assegnare le necessarie informazioni di interfaccia, come il suo indirizzo IP, la maschera di rete e quello di broadcast verso le proprie sottoreti.
route (8)
Una volta che le relative interfacce siano configurate, l'elaboratore può ricevere i pacchetti dalla rete. Ma dove devono essere trasmessi i pacchetti uscenti? Per prendere questa decisione è necessario determinarne il percorso e questo può essere fatto consultando le tabelle di routing del sistema. L'indirizzo di destinazione di ogni pacchetto uscente è ottenuto considerando gli elementi di questa tabella; se viene individuata una corrispondenza allora il pacchetto viene spedito all'interfaccia che compare in quella riga della tabella. Se non viene trovata nessuna corrispondenza allora il sistema restituisce l'errore di host unreachable. Il comando route è lo strumento utilizzato per visualizzare o modificare la tabella di routing.
ipfwadm (8)
Se la macchina è configurata come firewall, allora si possono attivare le funzioni di IP accounting, input, forwarding e i filtri di uscita oltre al mascheramento dell'IP. Inoltre è usata per visualizzare il contenuto delle tabelle del filtraggio.
arp (8)
Quando il sistema trasmette un pacchetto, allora deve trasmetterlo ad un indirizzo particolare del livello fisico. In effetti, in questo caso (LAN) i messaggi sono trasmessi in modo broadcast così da richiedere l'attenzione di ciascun nodo connesso alla LAN. Ad esempio, la trasmissione di un pacchetto IP su Ethernet, sarà realizzata inviandolo all'indirizzo Ethernet di un'altra macchina direttamente collegata su di essa. La tabella ARP (Address Resolution Protocol) usa normalmente un meccanismo automatico per determinare quali indirizzi fisici vanno associati con gli indirizzi IP. Il comando arp visualizza questa tabella e può essere usato per modificarla, benchè questa necessità sia alquanto rara.

TCP/IP: Analisi del Traffico

ping (8)
Nella definizione del protocollo IP sono compresi anche i messaggi di controllo, denominati pacchetti ICMP. Uno di questi, denominato echo request impone che il calcolatore, destinatario del pacchetto, risponda con un echo reply il cui contenuto è estremamente utile per poter determinare (1) se quel nodo è in funzione ed è in grado di comunicare con la rete, (2) determinare il tempo totale per raggiungere l'host e tornare indietro, e (3) continuando a trasmettere a richieste valutare la frazione di pacchetti trasmessi andanti persi.

Il comando ping (così chiamato per il suono prodotto da un sistema sonar attivo) trasmette le richieste di eco all'host remoto seconde le specifiche indicate nella linea di comando. Le righe di risposta contengono il tempo totale impiegato dal pacchetto per raggiungere l'host remoto e tornare indietro. Terminata l'esecuzione di ping (mediante un control-C) il comando ricapitola i risultati, fornendo il "tempo totale medio di viaggio" e la "perdita percentuale dei pacchetti". Usate questo comando per verificare se ci sia qualche problema di collegamento fra voi e l'host remoto.

traceroute (8)
Mentre ping fornisce informazioni sulle prestazioni del percorso fra due host della rete, traceroute mostra effettivamente l'itinerario seguito dai pacchetti. Il risultato della sua esecuzione è l'elenco degli host attraverso cui i pacchetti transistano per ragggiungere l'host remoto. Complicazioni possono insorgere durante l'esecuzione di questo commando: per i dettagli si consulti la relativa pagina del manuale. Osservando l'uscita di questo comando, facendo attenzione ai ping di ciascun host, è possibile determinare il punto esatto (latenza o errore elevato) i cui è presente un collegamento difettoso.
host (1)
nslookup (8)
dig (1)
Gli utenti della rete preferiscono utilizzare nomi piuttosto che i numeri per identificare gli host. Così è più facile ricordare www.linux.org invece di 198,182,196,51. La rete Internet comprende un'enorme base di dati distribuita, nota come Domain Name Server che converte i nomi testuali degli host nei rispettivi indirizzi numerici IP. Essenzialmente, la parte finale del nome è usata per identificare il server responsabile dell'interpretazione della parte iniziale del nome. Così la richiesta per determinare l'indirizzo di elvis.mit.edu viene trasmessa ad un server DNS di alto livello responsabile del dominio edu che passa la richiesta ad un DNS server del MIT, che conosce la macchina denominata elvis.

Tutti questi comandi effettuano interrogazioni ai DNS che possono essere semplici (dal nome dell'host all'indirizzo), inverse (dall'indirizzo al al nome dell'host), complesse (come l'elenco degli host in un dominio). Il comando dig è considerato quello in grado di fornire il maggior numero di informazioni mentre host produce l'output di default più semplice.

Clienti e Servizi di Rete

Per configurare o eseguire servizi di rete, il primo package necessario allo scopo è quello dei TCP wrapper che gestiscono la maggior parte delle connessioni entranti. Una volta, ad esempio, il daemon FTP andava in esecuzione fin dall'inizio agganciandosi alla porta 21 per eseguire successivamente ascolti di richieste ftp e poi servirle. Ma il fatto che ciascun servizio prendesse la propria decisione sulle connessioni da accettare, ha reso più difficile o impossibile la creazione e l'applicazione di una politica uniforme degli accessi

Attualmente i sistemi sono realizzati con TCP wrapper, che controllano tutte le porte su cui possono essere fatte richieste di servizio. Quando si realizza una connessione i wrapper decidono se consentire o meno l'accesso e soltanto nel caso di connessione permessa viene attivato il daemon che deve rispondere ad essa. Tali regole si trovano nei file di configurazione etc/hosts.deny e etc/hosts.allow.

inetd (8)
tcpd (8)
L'esecuzione di un TCP si suddivide in due fasi. Nella prima, viene lanciato il daemon inetd, solitamente quando la rete è attivata, prendendo il controllo di tutte le porte su cui dovranno essere pronti in ascolto i servizi ftp, telnet, ecc... Il file /etc/inetd.conf contiene l'informazione delle porte da controllare, qual'è il servizio connesso ad ogni porta e quale programma deve essere lanciato quando la connessione è attiva. Il programma che inetd è solitamente incaricato di far funzionare è tcpd. Consultando i file etc/hosts.deny e etc/hosts.allow è in grado di decidere se la connessione è consentita e, in in caso affermativo, lanciare o risvegliare il daemon del caso.
tcpdchk (8)
tcpdmatch (8)
Con questi programmi è possibile controllare i file etc/hosts.deny e etc/hosts.allow. Il comando tcpdchk esamina i predetti file segnalando eventuali errori. Il programma di utilità tcpdmatch permette di specificare un accoppiamento ipotetico daemon/client e predire, dati i file di configurazione se la connessione verrebbe accettata o meno.
Questa tabella contiene un sommario dei servizi più comuni e i daemon di Linux responsabili della loro attivazione, mediati dai TCP wrapper:
PortaClientServerDescrizione
21ftpin.ftpd File Transfer Protocol - il protocollo standard per il trasferimento di file attraverso Internet, disponibili sia da account d'utente protetti da parola chiave sia da server "anonimi" pubblicamente disponibili
23telnetin.telnetd Protocollo telnet d'accesso remoto via terminale - il protocollo standard per connettersi remotamente ad una macchina.
37rdatein.timed Tempo di sistema - risponde con il tempo fornito dall'orologio di sistema.
67bootptestbootpd Protocollo di Bootstrap da Internet - se si vuole controllare l'assegnazione di IP ADDRESS da una postazione centrale, si permette a tali macchine di trasmettere un messaggio broadcast al momento del booting in modo che un server della LAN risponda con IP ADDRESS che la macchina dovrebbe usare e possibilmente e un nome di file di configurazione da richiamare attraverso tftp
69tftpin.tftpd Trivial File Transfer Protocol - un File Transfer Protocol molto semplice che permette a qualunque host di trasferire qualunque file dal sistema centrale pubblicamente leggibile nella propria directory (normalmente /tftpboot ).
70Gophergn Gopher - un browser gerarchico delle informazioni che era in uso prima dell'introduzione di HTML.
79finger in.fingerdUser Information Lookup - introdotti una username (o, per alcuni server, parte del nome di un utente) fornisce alcune statistiche generali, compreso l'ultimo periodo di inizio delle attività e se l'utente ha letto la sua posta. L'accesso al servizio è spesso limitato dai TCP wrapper poichè la conoscenza pubblica degli utenti riduce la sicurezza.
110(vario) ipop3d PostOffice V.3 - Un protocollo per ricupero a distanza della posta
113(vario)in.identd Autenticazione dell'utente - un servizio importante che, dato il numero di una porta attiva e dell'IP di un host, restituisce lo username dell'utente che sta impiegando quella porta. Usato in molte applicazioni che hanno a che fare con il controllo d'accesso e la sicurezza.
119NNTP in.nntpdUsenet Transfer Protocol - il protocollo che permette ad un cliente remoto di interrogare un server di notizie.
512rexecin.rexecd Esecuzione remota di un comando - permette ad un utente di eseguire un comando su un sistema remoto. I servizi seguenti forniscono un metodo di autenticazione abbreviato, permettendo ad un utente di creare un file .rhosts nella propria home directory che elenca i login name e le macchine che possono accedere il proprio account senza dovere digitare la password. La possibilità di utilizzare questi servizi va considerata in termini di sicurezza.
513rloginin.rlogind Remote login - Permits login from a remote system (see rexec above).
514rshin.rshd Remote shell - Gives a user a command prompt on a remote machine (see rexec above).
517talkin.talkd (BSD) Talk to another user - Allows two users to type live messages back and forth to each other over the Internet. Popular for dating couples at different colleges or institutions.
540uucpuucico Unix-to-Unix Copy protocol - An Internet incarnation of the ancient and venerated UUCP protocol which linked the world of Unix computers back when periodic modem connections were the primary means of communication.

There are some more complex services which are usually always TCP wrapped:

sendmail (8)
This is the traditional Unix program for sending and receiving email over the Internet. It cannot be TCP wrapped and must be run as a daemon, which is unfortunate since security bugs are found in it fairly often. It is considered by many to be too large and multifaceted a program to offer real security; you should consider replacing it by qmail. But sendmail does have quite sophisticated features, including quite exhaustive mail sorting and filtering capabilities.
qmail (8)
Instead of being a monolithic jack of all trades like sendmail, this package provides a small sleek program for each distinct mail operation. It includes powerful and convenient features related to aliasing and mailing lists. Unfortunately for Linux users the author's stipulations on its distribution (which are intended to ensure no tampering with the source code) prevent its being encapsulated in an RPM, so you will have to compile and install it yourself. (Unlike sendmail this can be placed behind TCP wrappers.)
ssh (8)
This program provides the same sort of functionality as the rsh family, but employs encryption to prevent your passwords and data from being transmitted in cleartext across the Internet where snooping eyes can intercept them. It is thought to be very secure, and in fact a monetary reward is offered to anyone who can demonstrate otherwise.
routed(8)
In large networks, the main routers are usually not configured with permanent, static routing tables. Instead, they each run a routing daemon which exchanges information with other routers' routing daemons to keep up-to-date tables that adapt themselves to find the best routes between the system's subnetworks. The routed daemon implements a variant of the Xerox NS Routing Information Protocol.

Network Monitoring

nstat (1)
This command displays the values of a few dozen statistics relating to network activity that are maintained inside the kernel. These statistics are normally kept for the benefit of the SNMP daemon. They may also be viewed by accessing the file /proc/net/snmp.
netstat (8)
This is another command that will present the contents of /proc/net files for you, but offers a broader range of information than the nstat program. It can list the currently active network connections, dump the system routing tables, present interface statistics, and list masqueraded connections.
snmp* (1)
The collection of SNMP commands (snmpget, snmpnext, et cetera) that come with the Linux CMU SNMP package allow you to query a remote machine that has an SNMP daemon running. This can provide network performance and error statistics for that host. The CMU package also contains an snmpd(8) daemon that you can run if you want your machine to provide SNMP information.
tcpdump (8)
This is a sniffer, a program that captures packets off of a network interface and interprets them for you. It understands all basic Internet protocols, and can be used to save entire packets for later inspection.

Dialup Networking

pppd (8)
This daemon can send and receive network packets through a serial link between two computers. It is commonly used to allow dialup machines to communicate with the Internet despite not having a real Ethernet connection.
sliplogin (8)
This command is similar to pppd except that it uses the older SLIP protocol for encapsulating packets.
diald (8)
The diald daemon monitors your system for network traffic, automatically dials up your Internet service provider whenever you attempt to access the Internet. This prevents you from having to keep up with whether your modem is currently dialed in, while making sure your dialup connection is terminated when you are not using it. At runtime you may configure diald's connection criteria, including how long it should wait before shutting down the modem due to inactivity.