È abbastanza importante conoscere e capire le seguenti sottosezioni prima di provare a configurare in pratica la propria rete. Questi sono principi fondamentali che si applicano indipendentemente dall'esatta natura della rete che si intende spiegare.
Prima di iniziare a costruire o configurare la propria rete occorrono alcune cose. Le più importanti di queste sono:
Siccome il kernel che si sta usando al momento potrebbe non avere ancora il supporto per i tipi di rete o di schede di interfaccia che si desidera usare, probabilmente occorrono i sorgenti del kernel, in modo da essere in grado di ricompilare il kernel con le opzioni appropriate.
I sorgenti più recenti si possono sempre ottenere da ftp.funet.fi.
Di solito i sorgenti del kernel vengono estratti nella directory
/usr/src/linux
. Per ottenere informazioni riguardo a come si
applicano le modifiche (patch) e come si ricompila il kernel occorre leggere
il documento
Kernel-HOWTO.
Per avere informazioni su come si configurano i moduli del kernel
occorre leggere il documento
Module-HOWTO.
A meno di trovare indicazioni differenti, io consiglio di utilizzare la distribuzione stabile del kernel (quella con un numero pari come seconda cifra nel numero di versione). Le distribuzioni dei kernel di sviluppo (quelle con la seconda cifra dispari) possono presentare differenze strutturali o altri cambiamenti che possono causare problemi quando usati con altro software di sistema. Se non si è sicuri di essere in grado di risolvere questo tipo di problemi, anche considerando il rischio che ci siano altri errori nel software, allora è bene non usare le versioni dispari.
Gli strumenti di rete (i "network tools") sono i programmi che si usano per configurare le periferiche di rete di Linux. Questi programmi permettono per esempio di assegnare gli indirizzi alle periferiche e configurare l'instradamento.
La maggior parte delle moderne distribuzioni di Linux contengono già gli strumenti di rete, se perciò si è installato il proprio sistema da una distribuzione senza aver ancora installato gli strumenti di rete, occorre farlo.
Se il proprio sistema non è stato installato da una distribuzione, occorre recuperare i sorgenti e compilare i programmi da se. Questo non è difficile.
Gli strumenti di rete sono attualmente distribuiti da Bernd Eckenfels e sono disponibili presso ftp.inka.de, sito che è presente in mirror anche su ftp.uk.linux.org.
Occorre essere sicuri di scegliere la versione più appropriata per il kernel che si intende usare e di seguire le istruzioni di installazione che si trovano nel pacchetto.
Per installare e configurare la versione corrente al momento della stesura di questo documento occorre invocare i seguenti comandi:
# cd /usr/src # tar xvfz net-tools-1.33.tar.gz # cd net-tools-1.33 # make config # make # make install
Inoltre, se si intende configurare un firewall o utilizzare la possibilità di mascherare i pacchetti ("masquerading") occorre il comando ipfwadm, la cui versione aggiornata si può recuperare da: ftp.xos.nl. Ancora una volta, esistono diverse versioni del programma, e bisogna prendere la versione che meglio si adatta al proprio kernel.
Per installare e configurare la versione cui ho accesso in questo momento occorre invocare:
# cd /usr/src # tar xvfz ipfwadm-2.3.0.tar.gz # cd ipfwadm-2.3.0 # make # make install
Gli applicativi di rete sono i programmi come telnet ed
ftp, unitamente ai programmi server associati. David Holland
<dholland@cs.harvard.edu>
coordina la distribuzione dei
più comuni di questi. Tale distribuzione si può ottenere
ftp.uk.linux.org.
Per installare e configurare la versione currente in questo momento occorre invocare:
# cd /usr/src # tar xvfz /pub/net/NetKit-B-0.08.tar.gz # cd NetKit-B-0.08 # more README # vi MCONFIG # make # make install
Gli indirizzi IP sono composti da 4 byte. La convenzione usata per scrivere gli indirizzi è chiamata `dotted decimal notation', che significa "notazione decimale con i punti". In questa forma ogni byte è convertito in un numero decimale (tra 0 e 255) scartando gli zeri prefissi a meno che il numero sia zero, ogni byte è poi separato da un carattere `.'. Per convenzione ogni interfaccia di un calcolatore o router ha associato un indirizzo IP. In certe circostanze è permesso assegnare lo stesso indirizzo a tutte le interfacce di un singolo calcolatore, ma solitamente ogni interfaccia avrà un indirizzo diverso.
Le reti IP sono sequenze di indirizzi IP contigui. Tutti gli indirizzi all'interno di una rete hanno un certo numero di cifre del loro indirizzo in comune. La porzione di indirizzo comune all'interno della rete si chiama "network portion" (porzione di rete) dell'indirizzo. Le cifre rimanenti si chiamano "host portion". Il numero di bit che vengono condivisi tra tutti gli indirizzi all'interno della rete è chiamato "netmask" ed il suo ruolo è determinare quali indirizzi appartengono alla rete cui la maschera è applicata e quali no. Consideriamo il seguente esempio:
------------------------- --------------- Indirizzo del calcolatore 192.168.110.23 Maschera di rete 255.255.255.0 Parte di rete 192.168.110. Parte del calcolatore .23 ------------------------- --------------- Indirizzo di rete 192.168.110.0 Indirizzo di "broadcast" 192.168.110.255 ------------------------- ---------------
Ogni indirizzo sottoposto ad un'operazione di "AND bit-a-bit" con la sua maschera di rete darà l'indirizzo della rete cui appartiene. La maschera di rete è perciò sempre il numero più basso all'interno dell'intervallo di indirizzi che formano quella rete, e ha sempre la parte di host dell'indirizzo pari a zero.
L'indirizzo di broadcast è un indirizzo speciale cui tutti gli
host della rete ascoltano, in aggiunta al loro proprio indirizzo.
Questo indirizzo è quello cui vengono mandati i pacchetti che
devono essere ricevuti da tutti i calcolatori della rete. Certi tipi
di dati, come le informazioni di instradamento e i messaggi di errore
vengono trasmessi all'indirizzo di broadcast in modo che tutti i
calcolatori sulla rete li possano ricevere contemporaneamente. Ci sono
due standard comunemente usati su come debba essere un indirizzo di
broadcast. Il più comunemente accettato stabilisce che debba
essere usato come indirizzo di broadcast l'indirizzo più alto
possibile della rete. Nell'esempio precedente questo sarebbe
192.168.110.255
. Per qualche ragione alcuni siti hanno
adottato la convenzione di usare l'indirizzo zero
come indirizzo di broadcast. In pratica non fa molta differenza
quale viene usato, ma bisogna assicurarsi che ogni host sulla rete
sia configurato con lo stesso indirizzo di broadcast.
Per ragioni amministrative, ad un certo punto durante lo sviluppo iniziale del protocollo IP sono stati formati alcuni gruppi di arbitrari di indirizzi e le reti sono state raggruppate in quelle che sono chiamate classi. Le classi caratterizzano le dimensioni delle reti che si possono allocare. Queste classi offrono un numero di dimensioni fisse di rete che possono essere allocate. Gli intervalli scelti per le varie classi sono:
---------------------------------------------------------- | Classe | Netmask | Indirizzi | | di rete | | | ---------------------------------------------------------- | A | 255.0.0.0 | 0.0.0.0 - 127.255.255.255 | | B | 255.255.0.0 | 128.0.0.0 - 191.255.255.255 | | C | 255.255.255.0 | 192.0.0.0 - 223.255.255.255 | |Multicast| 240.0.0.0 | 224.0.0.0 - 239.255.255.255 | ----------------------------------------------------------
La scelta di quali indirizzi usare per la propria rete dipende da cosa esattamente si sta facendo. Per ottenere gli indirizzi di cui si ha bisogno si può procedere in uno dei seguenti modi:
Se si desidera installare un calcolatore su una rete esistente si deve contattare chi amministra tale rete e chiedere loro le seguenti informazioni:
Se si sta preparando una rete privata e non si ha intenzione nemmeno in futuro di connettere tale rete ad Internet, allora si può scegliere qualunque indirizzo. Ciononostante, per ragioni di sicurezza e di coerenza ci sono alcuni indirizzi di reti IP che sono stati riservati specificamente a questo fine. Essi sono specificati nell'RFC1597 come segue:
----------------------------------------------------------- | ALLOCAZIONI RISERVATE ALLE RETI PRIVATE | ----------------------------------------------------------- | Classe | Netmask | Indirizzi di rete | ----------------------------------------------------------- | A | 255.0.0.0 | 10.0.0.0 - 10.255.255.255 | | B | 255.255.0.0 | 172.16.0.0 - 172.31.255.255 | | C | 255.255.255.0 | 192.168.0.0 - 192.168.255.255 | -----------------------------------------------------------
Occorre innanzitutto decidere quanto grande deve essere la nuova rete, e poi scegliere gli indirizzi di cui si ha bisogno.
Ci sono differenti approcci sotto Linux per le procedure di
inizializzazione del sistema. Dopo che il kernel è partito, viene
sempre eseguito un programma chiamato `init'. Il programma
init poi legge il suo file di configurazione chiamato
/etc/inittab
ed inizia il processo di boot. Esistono versioni
di init leggermente differenti, e queste differenze sono la
maggiore causa di differenza tra le distribuzioni e tra le macchine.
Solitamente il file /etc/inittab
contiene una voce che assomiglia
a:
si::sysinit:/etc/init.d/boot
Questa riga specifica il nome dello script di shell che gestisce
praticamente la sequenza di boot. Questo file è in qualche modo
simile al file AUTOEXEC.BAT
in DOS.
Di solito ci sono altri script che vengono chiamati dallo script di inizializzazione, e spesso la rete è configurata all'interno di uno di questi.
La seguente tabella può essere usata come guida per il proprio sistema:
------------------------------------------------------------------------------- Distrib. |Config. interfaccia e instradamento |Inizz. dei server ------------------------------------------------------------------------------- Debian |/etc/init.d/network |/etc/init.d/netbase | |/etc/init.d/netstd_init | |/etc/init.d/netstd_nfs | |/etc/init.d/netstd_misc ------------------------------------------------------------------------------- Slackware|/etc/rc.d/rc.inet1 |/etc/rc.d/rc.inet2 ------------------------------------------------------------------------------- RedHat |/etc/sysconfig/network-scripts/ifup-<ifname>|/etc/rc.d/init.d/network -------------------------------------------------------------------------------
La maggior parte delle distribuzioni moderne includono un programma che permette di configurare la maggior parte dei tipi diffusi di interfacce di rete. Se si ha una di queste, allora bisognerebbe controllare se tale programma fa quello di cui si ha bisogno prima di tentare una configurazione manuale.
-----------------------------------------
Distrib | Programma di cfg. di rete
-----------------------------------------
RedHat | /sbin/netcfg
Slackware | /sbin/netconfig
-----------------------------------------
In molti sistemi Unix le periferiche di rete hanno il loro posto nella directory /dev. Questo non succede in Linux, dove i dispositivi di rete sono creati dinamicamente via software e quindi non hanno bisogno della presenza di file speciali.
Nella maggior parte dei casi i dispositivi di rete sono creati
automaticamente dal driver durante la sua inizializzazione dopo che
l'hardware è stato riconosciuto. Per esempio, il driver per la
rete ethernet crea le interfacce eth[0..n]
sequenzialmente,
nell'ordine in cui le schede ethernet vengono riconosciute. La prima
scheda che viene trovata prende il nome eth0
, la seconda
eth1
, eccetera.
Ciononostante in alcuni casi, come succede per slip e ppp, i dispositivi di rete vengono creati a seguito di operazioni svolte da un programma. Si applica la stessa regola di numerazione sequenziale, ma le periferiche non sono create automaticamente all'accensione del sistema. La ragione di questo è che, a differenza di quello che accade per le schede ethernet, il numero di periferiche slip o ppp può cambiare durante la vita della macchina. Questi casi vengono analizzati in maggior dettaglio nelle sezioni successive.
Dopo aver recuperato tutti i programmi di cui si ha bisogno e tutti gli indirizzi e le informazioni sulla rete, si può procedere alla configurazione delle proprie interfacce di rete. Quando si parla di configurazione dell'interfaccia si intende il processo di assegnazione degli indirizzi appropriati alla periferica e all'assegnazione di valori appropriati per gli altri valori configurabili di un dispositivo di rete. Il programma più comunemente usato per questo compito è il comando ifconfig (interface configure).
Normalmente viene invocato un comando simile al seguente:
# ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up
In questo esempio si è configurata una scheda ethernet
`eth0
' con l'indirizzo IP `192.168.0.1
' e una maschera pari
a `255.255.255.0
'. La parola `up' finale significa che
l'interfaccia deve essere attivata.
Il kernel assume alcuni valori di default quando un'interfaccia viene
configurata. Per esempio, si può specificare l'indirizzo di
rete e quello di broadcast per un'interfaccia, ma se questo non viene
fatto, come nell'esempio precedente, il kernel farà delle
scelte ragionevoli per i valori da assegnare in base alla maschera
di rete fornita; se non viene fornita una maschera di rete si baserà
sulla classe della rete associata all'indirizzo IP.
Nell'esempio appena visto il kernel assegnerà
un indirizzo di rete `192.168.0.0
' e un indirizzo di broadcast
`192.168.0.255
' in base alla netmask specificata nel comando.
Si possono passare al comando ifconfig molte altre opzioni. Le più importanti di queste sono:
questa opzione attiva l'interfaccia.
questa opzione la disattiva.
questa opzione abitita o disabilita l'uso del protollo ARP ("Address Resulution Protocol") per questa interfaccia.
questa opzione abilita o disabilita la ricezione di tutti i pacchetti multicast. Il multicast permette di associare speciali indirizzi hardware di destinazione a gruppi di calcolatori, in modo che tutti gli appartenenti al gruppo ricevano certi pacchetti. Questa opzione può essere importante se si usano applicazioni come la videoconferenza ma normalmente non viene usata.
questo parametro permette di assegnare il valore MTU ("Maximum Transfer Unit") per questa periferica.
questo parametro permette di specificare la maschera relativa alla rete cui questa interfaccia appartiene.
questo parametro funziona solo con certi tipi di hardware e permette di scegliere la linea interruzione usata dall'hardware di questa interfaccia.
questo parametro permette di abilitare la ricezione di pacchetti di broadcast e assegna l'indirizzo di broadcast per questa interfaccia, oppure disabilita la ricezione di questi pacchetti
[-]pointopoint /[addr]/questo parametro permette di assegnare l'indirizzo della macchina che sta all'altro capo di una connessione punto-punto, come accade per slip e ppp.
questo parametro permette di assegnare l'indirizzo hardware di certi tipi di schede di rete. Questo è spesso inutile per per le interfaccie ethernet, ma è comodo per altri tipi di rete, come AX.25.
Il `Name Resolver' fa parte della libreria standard di Linux.
La sua funzione principale è quella di fornire un servizio che converta
i nomi dei calcolatori, quelli comprensibili dall'uomo come
`ftp.funet.fi
', in indirizzi comprensibili alle macchine, come
128.214.248.6
.
Anche chi ha familiarità con i nomi dei calcolatori che costituiscono Internet potrebbe non comprendere come sono costituiti. I "domain name" di Internet sono inerentemente gerarchici, hanno cioè una struttura ad albero. Un `dominio' (domain) è una famiglia, un gruppo di nomi. Un dominio può essere suddiviso in vari `sottodomini'. Un `dominio pricipale' (toplevel domain) è un dominio che non è un sottodominio. I domini principali sono specificati nell'RFC 920. I domini principali più comuni sono:
Organizzazioni commerciali
Organizzazioni educative
Organizzazioni governative
Organizzazioni militari
Altre organizzazioni
questi sono codici di due lettere che rappresentano la nazione.
Ognuno di questi domini pricipali ha i suoi sottodomini. I domini
principali basati sui nomi di nazione sono spesso suddivisi
in sottodomini come com
, edu
, gov
, mil
e org
.
Questo non succede in Italia, ma per esempio esistono i sottodomini
com.au
e gov.au
per le organizzazioni commerciali e governative
in Australia. Per ragioni storiche, la maggior parte dei domini che
appartengono ai domini principali non nazionali sono usati per
organizzazioni all'interno degli Stati Uniti, anche se gli Stati Uniti hanno
anche loro un dominio nazionale: `.us
'.
Il livello successivo di divisione spesso rappresenta il nome dell'organizzazione. I sottodomini ulteriori possono essere di diversa natura; spesso il livello successivo è basato sulla suddivisione interna della organizzazione, ma può essere basato su qualsiasi criterio che sia considerato ragionevole e significativo all'interno dell'organizzazione.
La parte più a sinistra del nome è sempre il nome univocamente assegnato ad un calcolatore, e si chiama `hostname'. La parte di nome che sta alla destra dell'hostname si chiama `domainname', e il nome completo si chiama `Fully Qualified Domain Name', abbreviato FQDN.
Userò il calcolatore su cui ricevo la posta come esempio, il cui FQDN
è `perf.no.itg.telstra.com.au
'. Questo significa che il suo nome
personale è `perf
', e il domain name è
`no.itg.telstra.com.au
'. Il dominio è all'interno di un dominio
principale basato sulla mia nazione, l'Australia, e poiché il mio
indirizzo di posta appartiene ad un organismo commerciale abbiano
`.com
' come sottodominio. Il nome della compagnia è (era)
`telstra
', e la nostra struttura di nomi interna è basata sulla
struttura gestionale. Il mio calcolatore appartiene al gruppo di
tecnologia delle informazioni (Information Technology Group), sezione
operazioni di rete (Network Operations).
Per accedere al servizio di risoluzione dei nomi occorre sapere a quale dominio appartiene il proprio calcolatore. Il software di risoluzione dei nomi offre il servizio di traduzione dei nomi facendo delle richieste ad un `Domain Name Server' (di solito chiamato semplicemente "name server"), per cui occorre anche conoscere l'indirizzo di un name server locale che offra questo servizio.
Per configurare il proprio calcolatore occorre sistemare tre file, che descriverò uno alla volta.
Il file /etc/resolv.conf
è il file di configurazione
principale per accedere al servizio di risoluzione dei nomi. Il suo
formato è abbastanza semplice: si tratta di un file di testo
con una parola chiave (direttiva) per linea. Le direttive comunemente
usate sono tre:
questa direttiva specifica il nome del dominio locale.
questa direttiva specifica una lista di domini da consultare in alternativa.
questa direttiva, che può essere usata più di una volta, specifica l'indirizzo IP di un name server a cui rivolgersi per la risoluzione dei nomi.
/etc/resolv.conf
potrebbe essere qualcosa di simile
a:
domain maths.wu.edu.au
search maths.wu.edu.au wu.edu.au
nameserver 192.168.10.1
nameserver 192.168.12.1
Questo esempio specifica che il dominio di default da usare per i nomi
non qualificati (cioè gli hostname senza un dominio associato)
è maths.wu.edu.au
, e che se l'host non viene trovato in
quel dominio bisogna provare direttamente anche il dominio
wu.edu.au
. Il file specifica anche due name server, ciascuno dei
quali può essere consultato dal software di risoluzione per
risolvere un nome.
Il file /etc/host.conf
è quello dove si dichiarano alcuni elementi
che governano il comportamento del codice di risoluzione dei nomi.
Il formato di questo file è descritto in dettaglio nella pagina del manuale
`resolv+
'. In quasi tutti i casi queste due linee sono tutto quello
che serve:
order hosts,bind
multi on
Questa configurazione dice al codice di risoluzione dei nomi di
controllare il file /etc/hosts
prima di tentare una ricerca
attraverso un name server, e dice di ritornare tutti gli indirizzi definiti
per un host descritto in /etc/hosts
, invece che ritornare solo
il primo.
Il file /etc/hosts
è quello che contiene i nomi e gli indirizzi
IP dei calcolatori locali. Se un host appare in questo file non occorre
contattare un name server per conoscere il suo indirizzo IP. Lo svantaggio
di questo tipo di approccio è che occorre aggiornare questo file
ogniqualvolta l'indirizzo IP relativo ad un calcolatore cambia.
Solitamente, in un sistema ben gestito le uniche voci che appaiono
in questo file sono una per l'interfaccia di loopback e una per
il nome del calcolatore stesso.
# /etc/hosts
127.0.0.1 localhost loopback
192.168.0.1 this.host.name
È possibile specificare più di un nome di calcolatore per linea, come dimostrato dalla prima voce qui sopra, che è il modo convenzionale per dare un nome all'interfaccia di loopback.
L'interfaccia `loopback
' è un tipo speciale di interfaccia
che permette ad un calcolatore di collegarsi con se stesso. Ci sono
diversi motivi per cui capita di aver bisogno di collegarsi con se
stessi; per esempio quando occorre verificare il funzionamento di
programmi di rete senza interferire con nessun altro sulla rete. Per
convenzione è stato assegnato all'interfaccia di loopback
l'indirizzo IP `127.0.0.1
'. Perciò, indipendentemente dal
calcolatore sul quale si lavora, se si apre una connessione telnet a
127.0.0.1
si raggiungerà sempre la macchina da cui si
è partiti.
La configurazione dell'interfaccia di loopback è semplice, ed è una cosa che bisogna assicurarsi di fare.
# ifconfig lo 127.0.0.1
# route add -host 127.0.0.1 lo
Parleremo ancora del comando route nella prossima sezione.
Il "routing", ovvero le questioni relative all'instradamento dei pacchetti, costituisce un argomento ampio: si possono facilmente scrivere grossi libri su queste tematiche. La maggior parte delle persone, comunque, hanno necessità di instradamento abbastanza semplici, mentre poche altre hanno esigenze più complicate. Tratterò qui solo i concetti fondamentali dell'instradamento dei pacchetti. Suggerisco a chi è interessato ad avere informazioni più dettagliate di consultare i manuali elencati all'inizio di questo documento.
Inizierei con una definizione. Cos'è l'instradamento IP? Questa è la definizione che uso io:
L'instradamento IP (routing) è il processo attraverso il quale un calcolatore con connessioni di rete multiple decide dove trasmettere i pacchetti IP che ha ricevuto.
Potrebbe essere utile illustrare questa definizione con un esempio. Immaginiamo un tipico router in un ufficio, che abbia una connessione PPP verso Internet, un certo numero di segmenti ethernet che collegano le postazioni locali e un secondo collegamento PPP verso un altro ufficio. Quando il router riceve un pacchetto da una qualsiasi delle sue connessioni di rete, il meccanismo usato per determinare su quale porta deve essere spedito il pacchetto è proprio il routing. Anche i calcolatori più semplici hanno bisogno di instradare i pacchetti: tutti gli host di Internet hanno due interfacce di rete: una è quella di loopback descritta prima e l'altra è queslla usata per parlare al resto della rete; questa può essere una ethernet oppure un link PPP o SLIP sulla porta seriale.
Bene, ma come funziona l'instradamento? Ogni calcolatore mantiene una lista di regole di instradamento, chiamata "routing table". Questa tabella contiene delle voci che sono in genere formate da almeno tre campi: il primo è l'indirizzo di destinazione, il secondo è il nome dell'interfaccia attraverso la quale instradare il pacchetto, e il terzo è l'indirizzo IP opzionale di un'altra macchina che si incarichi di decidere il prossimo passo che il pacchetto deve fare attraverso la rete. In Linux la tabella di instradamento può essere stampata usando il seguente comando:
# cat /proc/net/route
oppure uno dei seguenti:
# /sbin/route -n
# /bin/netstat -r
Il processo di instradamento è abbastanza semplice:
viene ricevuto un pacchetto, viene esaminato il suo indirizzo di
destinazione (a chi è destinato quel pacchetto) e tale indirizzo
viene confrontato con tutte le voci della tabella. La voce che meglio
rispecchia l'indirizzo di destinazione viene poi usata per la
ritrasmissione del pacchetto, attraverso l'interfaccia specificata
dalla voce. Se poi il campo "gateway" di questa voce è valido,
il pacchetto viene passato a tale host attraverso l'interfaccia
specificata; in caso contrario si assume
che l'indirizzo di destinazione sia sulla rete connessa all'interfaccia scelta.
Per manipolare la tabella esiste un comando specifico. Questo comando riceve degli argomenti sulla linea di comando e li converte in chiamate di sistema che richiedono al kernel di aggiungere, rimuovere o modificare le voci della tabella di routing. Tale comando si chiama `route'.
Passiamo ora ad un semplice esempio, immaginando che voi siate connessi
ad una ethernet e che vi sia stato detto che la rete è una
classe C con indirizzo 192.168.1.0
; immaginiamo inoltre
che l'indirizzo 192.168.1.10
sia stato assegnato alla vostra
macchina, e che 192.168.1.1
sia il router connesso al resto
di Internet.
Il primo passo da fare è configurare l'interfaccia come descritto in precedenza. A questo fine si userà un comando tipo:
# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
Adesso occorre aggiungere nella tabella di routing una voce che
dica al kernel che tutti i pacchetti destinati a calcolatori con indirizzi
del tipo 192.168.1.*
devono essere spediti sull'interfaccia
ethernet. Il comando per dire ciò sarà:
# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
Si noti l'uso dell'argomento `-net
', che dice al programma "route"
che questa voce si riferisce ad un'intera rete. L'altra possibilità
è quella di specificare una regola di tipo `-host
', cioè
una regola di instradamento specifica ad un singolo indirizzo IP.
La regola di instradamento appena mostrata è quella che permette di stabilire connessioni con tutti gli host del proprio segmento ethernet. Ma come si fa a connettersi a tutte le macchine che non sono sul proprio ramo ethernet?
Dover aggiungere regole di instradamento per tutte le possibili reti
sarebbe un lavoro molto difficile; perciò esiste un trucco per
semplificare questo compito. Il trucco si chiama "regola di
instradamento di `default
'". La regola "di default" si riferisce
a tutti gli indirizzi di destinazione, ma in modo "blando",
cosicchè se esiste un'altra voce nella tabella che si riferisce
all'indirizzo di destinazione del pacchetto, questa voce verrà
usata al posto di quella di default. L'idea della regola default
è semplicemente quella di dire "e tutto il resto deve andare
qui". Nell'esempio di cui ci stiamo occupando si userà un
commento come:
# route add default gw 192.168.1.1 eth0
L'argomento `gw
' dice al comando "route" che l'argomento seguente
\ il numero, o il nome, di un calcolatore che fa da gateway, o router,
cui devono essere spediti tutti i pacchetti ai quali questa
regola si applica, ai fini di un'ulteriore instradamento.
Perciò, la vostra configurazione completea sarà:
# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
# route add default gw 192.168.1.1 eth0
Guardando attentamente i file di configurazione di rete che si trovano
sulle macchine Linux troverete che almeno uno di essi sarà molto simile
a quello appena mostrato. Questo tipo di configurazione è molto
diffuso.
Vediamo ora una configurazione dell'instradamento leggermente più complicata. Immaginiamo di configurare il router che abbiamo visto prima, quello con la connessione PPP verso Internet e i segmenti ethernet verso i calcolatori nell'ufficio. Immaginiamo che il router abbia tre segmenti ethernet e un collegamento PPP. La nostra configurazione di routing sarà qualcosa come:
# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
# route add -net 192.168.2.0 netmask 255.255.255.0 eth1
# route add -net 192.168.3.0 netmask 255.255.255.0 eth2
# route add default ppp0
Ognuna delle workstation sulla rete locale userà la forma più
semplice presentata prima, solo il router deve specificare separatamente le
informazioni relativa a ciascun tratto della rete locale, perché per
le workstation il meccanismo della regola di default
si occuperà
di tutte le sottoreti, lasciando al router il compito di dividere
correttamente i pacchetti. Ci si può chiedere perché la regola di
default appena vista per il router non specifichi un `gw
'. La
ragione è semplice: i protocolli su linea seriale come PPP e SLIP
hanno sempre e solo due calcolatori sulla loro "rete": uno ad ogni
estremo. Specificare il calcolatore che si trova all'altro estremo
del cavo come "gateway" è inutile e ridondante, poiché non esistono
altre possibilità, e per questo motivo non occorre esplicitare il
gateway per questo tipo di connessioni. Altri tipi di rete, come ethernet,
arcnet o token ring, invece, richiedono che si specifichi il numero
del gateway, poiché queste reti permettono a molti calcolatori
di essere collegati insieme.
La configurazione di routing descritta fino adessso si applica bene a situazioni di rete semplici, dove ci sono sempre solo alcuni cammini possibili per raggiungere le destinazione. Se la propria rete è più complessa, le cose diventano più complicate. Fortunatamente per la maggior parte delle persone questo non è un problema.
Il problema principale con il cosiddetto `instradamento manuale' o `instradamento statico' come quello appena descritto è che se un calcolatore o un collegamento all'interno della propria rete smette di funzionare, l'unico modo (se possibile) per dirigere i pacchetti su di un'altra strada consiste nell'intervenire a mano ed eseguire i comandi appropriati. Naturalmente questo è impegnativo, lento, poco pratico e rischia di fallire. Sono state sviluppate varie tecniche per correggere automaticamente le tabelle di routing in caso di problemi sulla rete quando ci siano percorsi alternativi. Tutte queste tecniche sono raggruppate sotto il nome di "protocolli dinamici di instradamento".
Può essere capitato a tutti di sentir nominare i protocolli dinamici più usati. I più comuni probabilmente sono RIP (Routing Information Protocol) e OSPF (Open Shortest Path First). Il protocollo RIP è molto comune nelle reti piccole, come le reti di organizzazioni di dimensione medio-piccola, o reti di edificio. OSPF è più moderno e più in grado di gestire grosse configurazioni di rete, e pure più adatto ad ambienti dove esistono molti percorsi possibili attraverso la rete. Le implementazioni più diffuse di questi protocolli sono `routed' (per RIP), e `gated' (per RIP, OSPF e altri protocolli). Il programma `routed' di solito fa parte delle distribuzioni di Linux, oppure si può trovare incluso nel pacchetto `NetKit' descritto all'inizio.
Un esempio di dove e quando serva usare un protocollo di instradamento dinamico potrebbe somigliare al seguente:
192.168.1.0 / 192.168.2.0 /
255.255.255.0 255.255.255.0
- -
| |
| /-----\ /-----\ |
| | |ppp0 // ppp0| | |
eth0 |---| A |------//---------| B |---| eth0
| | | // | | |
| \-----/ \-----/ |
| \ ppp1 ppp1 / |
- \ / -
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
ppp0\ /ppp1
/-----\
| |
| C |
| |
\-----/
|eth0
|
|---------|
192.168.3.0 /
255.255.255.0
ci sono qui tre router: A, B e C. Ognuno di essi è connesso ad
una ethernet che porta una rete di classe C (netmask 255.255.255.0).
Ogni router ha anche una connessione PPP verso ognuno degli altri due
router. La rete forma un triangolo.
Dovrebbe essere chiaro che la tabella di routing per il router A dovrebbe essere presente qualcosa come:
# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
# route add -net 192.168.2.0 netmask 255.255.255.0 ppp0
# route add -net 192.168.3.0 netmask 255.255.255.0 ppp1
Questa situazione funzionerebbe bene, finché non si interrompe il
collegamento tra il router A e il router B. Se la connessione si
interrompe, la tabella di routing mostrata non permetterebbe ai
calcolatori sul segmento ethernet A di raggiungere calcolatori
sul segmento B, perché i loro pacchetti sarebbero rediretti da A sulla
connessione ppp0, che è momentaneamente rotta. I calcolatori sulla
rete A possono comunque continuare a parlare ai calcolatori sulla rete
C, e questi ultimo possono continuare a parlare con i calcolatori
sulla rete B, poiché il collegamento tra B e C è ancora funzionante.
Ma allora, se A può parlare a C, e C può ancora parlare a B, perché non potrebbe A mandare i suoi pacchetti a B attraverso C? Questo è esattamente il tipo di problemi che viene affrontato dai protocolli dinamici come RIP. Se ognuno dei router A, B e C facesse girare un programma di instradamento, allora le loro tabelle di routing sarebbero corrette automaticamente per riflettere in nuovo stato della rete ogniqualvolta uno dei collegamenti della rete si interrompesse Configurare questa rete è semplice: occorre fare solo due cose su ognuno dei router. In questo caso, per A bisogna invocare:
# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
# /usr/sbin/routed
Il programma `routed' trova automaticamente le interfacce di rete
attive nel momento in cui viene invocato, e successivamente manda dei
messaggi e ascolta le risposte su ogni interfaccia di rete, in modo
da poter determinare la routing table ed aggiornarla.
Questo termina la breve spiegazione dell'instradamento dinamico e dove è il caso di usarlo. Se si vogliono più informazioni al proposito occorre riferirsi alle fonti di informazione elencate all'inizio di questo documento.
I punti importanti relativi all'instradamento dinamico sono:
I programmi "server" ed i servizi di rete sono quei programmi che permettono ad un utente remoto di utilizzare la macchina Linux locale. I programmi server attendono le connessioni entranti su di una porta di rete. Le porte sono un mezzo per indirizzare un particolare servizio su di un particolare calcolatore e sono il modo in cui un calcolatore server può distinguere tra una connessione entrante di tipo telnet ed una di tipo ftp. L'utente remoto stabilisce una connessione di rete con la macchina server e il programma server (anche detto "daemon" di rete) che sta attendendo una connessione su quella porta accetta la connessione ed inizia a funzionare. Ci sono due modi di utilizzare i servizi di rete, entrambi usati comunemente nella pratica. Questi modi sono:
(da solo). Il programma di rete ascolta una porta specifica di rete e quando sente una connessione in ingresso la gestisce da solo per fornire il servizio richiesto.
Il server inetd è un programma di rete speciale che si occupa di gestire le connessioni in ingresso. inetd fa uso di un file di configurazione che gli dice quali programmi devono essere invocati quando viene gestita una connessione entrante verso una particolare porta tcp o udp. Le porte stesse sono descritte in un altro file, di cui parleremo presto.
/etc/services
assegna dei nomi simbolici ai numeri delle porte,
mentre
/etc/inetd.conf
è il file di configurazione per il programma
inetd.
Il file /etc/services
è un semplice database che
associa ad ogni un numero di porta comprensibile alla macchina un nome
comprensibile all'uomo. Il suo formato è molto semplice: il
file è un testo ciascuna riga del quale rappresenta una voce
del database. Ogni voce è composta da tre campi separati da un
numero qualunque di spazi bianchi (spazi o caratteri ``tab''). I campi sono:
nome porta/protocollo alias # commento
È una singola parola che rappresenta il servizio che si sta descrivendo
questo campo è diviso in due sottocampi.
un numero che specifica il numero di porta sulla quale il servizio è reso disponibile. La maggior parte dei servizi comunemente usati hanno un numero assegnato loro. Questi numeri sono descritti nell'RFC 1340.
questo sottocampo è o
"tcp
" o "udp
".
18/tcp
è molto
differente da 18/udp
e che non ci sono ragioni tecniche
per cui un servizio debba esistere su entrambe le porte. Normalmente
si usa il buon senso, e il database
contiene entrambe le voci solo se un servizio è disponibile
sia attraverso tcp
che attraverso udp
.
altri nomi che possono essere usati per indicare questo servizio.
#
' sulla riga
è trattato come commento.
Tutte le distribuzioni recenti di Linux contengono un buon file
/etc/services
.
Nel caso occorra costruire un calcolatore da zero, questa è
un copia del file
/etc/services
fornito con la distribuzione
Debian. I commenti
descrittivi (quelli lunghi) sono stati tradotti per comodità.
# /etc/services:
# $Id: services,v 1.3 1996/05/06 21:42:37 tobias Exp $
#
# Network services, Internet style
#
# Si noti che attualmente la politica dello IANA è di assegnare
# un singolo numero di porta per entrambi TCP e UDP; perciò la maggior
# parte delle voci sono duplicate, anche se il protocollo non funziona
# con UDP.
# Aggiornato dall'RFC 1340, ``Assigned Numbers'' (Luglio 1992).
# Non sono incluse tutte le porte, solo le più comuni.
tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
daytime 13/tcp
daytime 13/udp
netstat 15/tcp
qotd 17/tcp quote
msp 18/tcp # message send protocol
msp 18/udp # message send protocol
chargen 19/tcp ttytst source
chargen 19/udp ttytst source
ftp-data 20/tcp
ftp 21/tcp
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp
# 24 - private
smtp 25/tcp mail
# 26 - unassigned
time 37/tcp timserver
time 37/udp timserver
rlp 39/udp resource # resource location
nameserver 42/tcp name # IEN 116
whois 43/tcp nicname
re-mail-ck 50/tcp # Remote Mail Checking Protocol
re-mail-ck 50/udp # Remote Mail Checking Protocol
domain 53/tcp nameserver # name-domain server
domain 53/udp nameserver
mtp 57/tcp # deprecated
bootps 67/tcp # BOOTP server
bootps 67/udp
bootpc 68/tcp # BOOTP client
bootpc 68/udp
tftp 69/udp
gopher 70/tcp # Internet Gopher
gopher 70/udp
rje 77/tcp netrjs
finger 79/tcp
www 80/tcp http # WorldWideWeb HTTP
www 80/udp # HyperText Transfer Protocol
link 87/tcp ttylink
kerberos 88/tcp kerberos5 krb5 # Kerberos v5
kerberos 88/udp kerberos5 krb5 # Kerberos v5
supdup 95/tcp
# 100 - reserved
hostnames 101/tcp hostname # usually from sri-nic
iso-tsap 102/tcp tsap # part of ISODE.
csnet-ns 105/tcp cso-ns # also used by CSO name server
csnet-ns 105/udp cso-ns
rtelnet 107/tcp # Remote Telnet
rtelnet 107/udp
pop-2 109/tcp postoffice # POP version 2
pop-2 109/udp
pop-3 110/tcp # POP version 3
pop-3 110/udp
sunrpc 111/tcp portmapper # RPC 4.0 portmapper TCP
sunrpc 111/udp portmapper # RPC 4.0 portmapper UDP
auth 113/tcp authentication tap ident
sftp 115/tcp
uucp-path 117/tcp
nntp 119/tcp readnews untp # USENET News Transfer Protocol
ntp 123/tcp
ntp 123/udp # Network Time Protocol
netbios-ns 137/tcp # NETBIOS Name Service
netbios-ns 137/udp
netbios-dgm 138/tcp # NETBIOS Datagram Service
netbios-dgm 138/udp
netbios-ssn 139/tcp # NETBIOS session service
netbios-ssn 139/udp
imap2 143/tcp # Interim Mail Access Proto v2
imap2 143/udp
snmp 161/udp # Simple Net Mgmt Proto
snmp-trap 162/udp snmptrap # Traps for SNMP
cmip-man 163/tcp # ISO mgmt over IP (CMOT)
cmip-man 163/udp
cmip-agent 164/tcp
cmip-agent 164/udp
xdmcp 177/tcp # X Display Mgr. Control Proto
xdmcp 177/udp
nextstep 178/tcp NeXTStep NextStep # NeXTStep window
nextstep 178/udp NeXTStep NextStep # server
bgp 179/tcp # Border Gateway Proto.
bgp 179/udp
prospero 191/tcp # Cliff Neuman's Prospero
prospero 191/udp
irc 194/tcp # Internet Relay Chat
irc 194/udp
smux 199/tcp # SNMP Unix Multiplexer
smux 199/udp
at-rtmp 201/tcp # AppleTalk routing
at-rtmp 201/udp
at-nbp 202/tcp # AppleTalk name binding
at-nbp 202/udp
at-echo 204/tcp # AppleTalk echo
at-echo 204/udp
at-zis 206/tcp # AppleTalk zone information
at-zis 206/udp
z3950 210/tcp wais # NISO Z39.50 database
z3950 210/udp wais
ipx 213/tcp # IPX
ipx 213/udp
imap3 220/tcp # Interactive Mail Access
imap3 220/udp # Protocol v3
ulistserv 372/tcp # UNIX Listserv
ulistserv 372/udp
#
# UNIX specific services
#
exec 512/tcp
biff 512/udp comsat
login 513/tcp
who 513/udp whod
shell 514/tcp cmd # no passwords used
syslog 514/udp
printer 515/tcp spooler # line printer spooler
talk 517/udp
ntalk 518/udp
route 520/udp router routed # RIP
timed 525/udp timeserver
tempo 526/tcp newdate
courier 530/tcp rpc
conference 531/tcp chat
netnews 532/tcp readnews
netwall 533/udp # -for emergency broadcasts
uucp 540/tcp uucpd # uucp daemon
remotefs 556/tcp rfs_server rfs # Brunhoff remote filesystem
klogin 543/tcp # Kerberized `rlogin' (v5)
kshell 544/tcp krcmd # Kerberized `rsh' (v5)
kerberos-adm 749/tcp # Kerberos `kadmin' (v5)
#
webster 765/tcp # Network dictionary
webster 765/udp
#
# From ``Assigned Numbers'':
#
#> Le "porte registrate" non sono controllate dallo IANA e su molti
#> sistemi possono essere usate da ordinari processi dell'utente
#> o programmi eseguiti da utenti non privilegiati.
#
#> Le porte sono usate in TCP [45,106] per dare un nome agli estremi
#> di connesione logiche che trasportano conversazioni a lungo termine.
#> Al fine di fornire servizi ad anonimi, viene definita
#> una porta di contatto per il servizio. Questa lista specifica
#> la porta usata dal processo server come porta di contatto. Anche se
#> lo IANA non può controllare l'uso di queste porte, registra
#> comunque queste porte e riconosce il loro uso per la convenienza
#> della comunità.
#
ingreslock 1524/tcp
ingreslock 1524/udp
prospero-np 1525/tcp # Prospero non-privileged
prospero-np 1525/udp
rfe 5002/tcp # Radio Free Ethernet
rfe 5002/udp # Actually uses UDP only
bbs 7000/tcp # BBS service
#
#
# Servizi Kerberos (Progetto Athena/MIT)
# Si noti che questi servizi sono usati da Kerberos versione 4,
# e non sono ufficiali. Chi usa la versione 4 dovrebbe scommentare
# queste voci e commentare quelle per la versione 5 definite più sopra.
#
kerberos4 750/udp kdc # Kerberos (server) udp
kerberos4 750/tcp kdc # Kerberos (server) tcp
kerberos_master 751/udp # Kerberos authentication
kerberos_master 751/tcp # Kerberos authentication
passwd_server 752/udp # Kerberos passwd server
krb_prop 754/tcp # Kerberos slave propagation
krbupdate 760/tcp kreg # Kerberos registration
kpasswd 761/tcp kpwd # Kerberos "passwd"
kpop 1109/tcp # Pop with Kerberos
knetd 2053/tcp # Kerberos de-multiplexor
zephyr-srv 2102/udp # Zephyr server
zephyr-clt 2103/udp # Zephyr serv-hm connection
zephyr-hm 2104/udp # Zephyr hostmanager
eklogin 2105/tcp # Kerberos encrypted rlogin
#
# Servizi non ufficiali ma necessari per NetBSD
#
supfilesrv 871/tcp # SUP server
supfiledbg 1127/tcp # SUP debugging
#
# Servizi "Datagram Delivery Protocol"
#
rtmp 1/ddp # Routing Table Maintenance Protocol
nbp 2/ddp # Name Binding Protocol
echo 4/ddp # AppleTalk Echo Protocol
zip 6/ddp # Zone Information Protocol
#
# Servizi Debian GNU/Linux
rmtcfg 1236/tcp # Gracilis Packeten remote config server
xtel 1313/tcp # french minitel
cfinger 2003/tcp # GNU Finger
postgres 4321/tcp # POSTGRES
mandelspawn 9359/udp mandelbrot # network mandelbrot
# Local services
Il file /etc/inetd.conf
è il file di configurazione
per il server di rete inetd. La sua funzione è quella di dire
cosa fare quando viene accettata una connessione associata ad
un particolare servizio.
Bisogna dire ad inetd quale programma far partire per ciascun
servizio che si vuole fornire, bisogna
anche dire come farlo partire.
Il formato del file è abbastanza semplice: si tratta di un file di testo
in cui ogni riga descrive un servizio che si intende offrire. Tutto
quello che in una linea segue un segno #
è ignorato e considerato
un commento. Ogni linea contiene sette campi separati da un numero
qualsiasi di spazi bianchi (tab o carattere di spazio). Il formato
generale è come segue:
service socket_type proto flags user server_path server_args
è il servizio cui questa riga si riferisce: è
uno dei nomi che stanno nel file /etc/services
.
questo campo descrive il tipo di socket cui questa voce
si riferisce, i cui valori validi sono: stream
, dgram
,
raw
, rdm
, o seqpacket
. Questa questione è abbastanza
tecnica, ma come regola pratica basti ricordare che quasi tutti
i servizi basati su tcp
usano stream
e quasi tutti i
servizi basati su udp
usano dgram
. Solo servizi
molto speciali useranno uno degli altri valori.
il protocollo usato da questa voce. Questo deve
corrispondere alla voce appropriata di /etc/services
e
sarà di solito tcp
o udp
. I sevizi basati su "Sun RPC" (Remote Procedure Call) useranno rpc/tcp
o rpc/udp
.
ci sono solo due valori possibili per questo campo,
che dice a inetd se il programma server libera il socket
dopo avere iniziato a lavorare. Il campo dice quindi se inetd
deve far partire un altro server alla prossima richiesta di connessione
oppure se deve attendere, assumendo che il processo già in funzione
gestisca anche le nuove richieste di connessione. Ancora una volta,
questa informazione può essere difficile da ottenere, ma in genere
tutti i server tcp
dovranno avere nowait
in questo campo,
mentre la maggior parte dei server udp
dovrebbero avere il
valore wait
. Bisogna però fare attenzione alle eccezioni a questa
regola, perciò quando non si è sicuri conviene farsi guidare dall'esempio
che verrà introdotto a breve.
questo campo descrive a quale account di quelli in
/etc/passwd
deve essere assegnata la proprietà del server
di rete che viene fatto partire. Questo campo è spesso utile per
proteggersi da possibili problemi sicurezza. Si può assegnare l'utente
nobody
come proprietario di un server, in modo che se la sicurezza
di rete del server viene compromessa il danno possibile viene minimizzato.
Di solito, comunque, questo campo viene posto a root
, poiché
molti server hanno bisogno dei privilegi del superutente per funzionare
correttamente.
questo campo è il pathname del programma server che deve essere eseguito in relazione a questo servizio.
questo campo comprende il resto della riga ed è opzionale. In questo campo si mettono gli argomenti di linea di comando che si intendono passare al programma server quando questo viene lanciato.
Come per /etc/services
, tutte le distribuzioni aggiornate
di Linux includono un buon file /etc/inetd.conf
con cui poter
lavorare. Qui per completezza riporto il file /etc/inetd.conf
che appare nella distribuzione
Debian.
# /etc/inetd.conf: see inetd(8) for further informations.
#
# Internet server configuration database
#
#
# Modified for Debian by Peter Tobias <tobias@et-inf.fho-emden.de>
#
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
#
# Internal services
#
#echo stream tcp nowait root internal
#echo dgram udp wait root internal
discard stream tcp nowait root internal
discard dgram udp wait root internal
daytime stream tcp nowait root internal
daytime dgram udp wait root internal
#chargen stream tcp nowait root internal
#chargen dgram udp wait root internal
time stream tcp nowait root internal
time dgram udp wait root internal
#
# These are standard services.
#
telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.telnetd
ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.ftpd
#fsp dgram udp wait root /usr/sbin/tcpd /usr/sbin/in.fspd
#
# Shell, login, exec and talk are BSD protocols.
#
shell stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rshd
login stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rlogind
#exec stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rexecd
talk dgram udp wait root /usr/sbin/tcpd /usr/sbin/in.talkd
ntalk dgram udp wait root /usr/sbin/tcpd /usr/sbin/in.ntalkd
#
# Mail, news and uucp services.
#
smtp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.smtpd
#nntp stream tcp nowait news /usr/sbin/tcpd /usr/sbin/in.nntpd
#uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico
#comsat dgram udp wait root /usr/sbin/tcpd /usr/sbin/in.comsat
#
# Pop et al
#
#pop-2 stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.pop2d
#pop-3 stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.pop3d
#
# `cfinger' is for the GNU finger server available for Debian. (NOTE: The
# current implementation of the `finger' daemon allows it to be run as `root'.)
#
#cfinger stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.cfingerd
#finger stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.fingerd
#netstat stream tcp nowait nobody /usr/sbin/tcpd /bin/netstat
#systat stream tcp nowait nobody /usr/sbin/tcpd /bin/ps -auwwx
#
# Tftp service is provided primarily for booting. Most sites
# run this only on machines acting as "boot servers."
#
#tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd
#tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /boot
#bootps dgram udp wait root /usr/sbin/bootpd bootpd -i -t 120
#
# Kerberos authenticated services (these probably need to be corrected)
#
#klogin stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rlogind -k
#eklogin stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rlogind -k -x
#kshell stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rshd -k
#
# Services run ONLY on the Kerberos server (these probably need to be corrected)
#
#krbupdate stream tcp nowait root /usr/sbin/tcpd /usr/sbin/registerd
#kpasswd stream tcp nowait root /usr/sbin/tcpd /usr/sbin/kpasswdd
#
# RPC based services
#
#mountd/1 dgram rpc/udp wait root /usr/sbin/tcpd /usr/sbin/rpc.mountd
#rstatd/1-3 dgram rpc/udp wait root /usr/sbin/tcpd /usr/sbin/rpc.rstatd
#rusersd/2-3 dgram rpc/udp wait root /usr/sbin/tcpd /usr/sbin/rpc.rusersd
#walld/1 dgram rpc/udp wait root /usr/sbin/tcpd /usr/sbin/rpc.rwalld
#
# End of inetd.conf.
ident stream tcp nowait nobody /usr/sbin/identd identd -i
Un certo numero di altri file sono relativi alla configurazione di rete sotto Linux, e può essere interessante guardarli. Non ci sarà bisogno di modificare questi file, ma val la pena di descriverli, in modo da sapere cosa contengono e a cosa servono.
Il file /etc/protocols
è un database che associa i numeri
identificativi dei protocolli al nomi di ciascun
protocollo. Quest'informazione viene usata dai programmatori per poter
specificare per nome i protocolli all'interno dei programmi, e viene
usata da alcuni programmi come
tcpdump al fine di mostrare nei loro messaggi
i nomi di protocollo invece dei
numeri. La sintassi del file è:
nome-protocollo numero alias
Il file /etc/protocols
che fa parte della distribuzione
Debian è fatto così:
# /etc/protocols:
# $Id: protocols,v 1.1 1995/02/24 01:09:41 imurdock Exp $
#
# Internet (IP) protocols
#
# from: @(#)protocols 5.1 (Berkeley) 4/17/89
#
# Updated for NetBSD based on RFC 1340, Assigned Numbers (July 1992).
ip 0 IP # internet protocol, pseudo protocol number
icmp 1 ICMP # internet control message protocol
igmp 2 IGMP # Internet Group Management
ggp 3 GGP # gateway-gateway protocol
ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'')
st 5 ST # ST datagram mode
tcp 6 TCP # transmission control protocol
egp 8 EGP # exterior gateway protocol
pup 12 PUP # PARC universal packet protocol
udp 17 UDP # user datagram protocol
hmp 20 HMP # host monitoring protocol
xns-idp 22 XNS-IDP # Xerox NS IDP
rdp 27 RDP # "reliable datagram" protocol
iso-tp4 29 ISO-TP4 # ISO Transport Protocol class 4
xtp 36 XTP # Xpress Tranfer Protocol
ddp 37 DDP # Datagram Delivery Protocol
idpr-cmtp 39 IDPR-CMTP # IDPR Control Message Transport
rspf 73 RSPF # Radio Shortest Path First.
vmtp 81 VMTP # Versatile Message Transport
ospf 89 OSPFIGP # Open Shortest Path First IGP
ipip 94 IPIP # Yet Another IP encapsulation
encap 98 ENCAP # Yet Another IP encapsulation
Il file /etc/networks
ha una funzione simile a
/etc/hosts
. Il file è un semplice database che associa i nomi
delle reti ai loro indirizzi. Il suo formato è differente da
/etc/hosts
in quanto ci sono solo due campi per riga,
che sono codificati come:
nome-rete indirizzo-di-rete
Per esempio, il file potrebbe assomigliare al seguente:
loopnet 127.0.0.0
localnet 192.168.0.0
amprnet 44.0.0.0
Quando si usano comandi come route, se un indirizzo di
destinazione è una rete e quella rete appare in/etc/networks
,
allora il comando mostrerà il nome della rete invece del suo indirizzo.
Vorrei iniziare questa sezione avvisando che la protezione di un calcolatore e di una rete da attacchi malevoli è un'arte complessa. Non mi considero assolutamente un esperto in questo campo: mentre i meccanismi che descrivo in seguito possono essere di aiuto, raccomando a chi prende seriamente il problema della sicurezza di fare qualche ricerca personale sull'argomento. Su Internet ci sono molti buoni documenti al proposito.
Una importante regola base è:
`Non far girare i servizi che non si intendono usare'.
Molte distribuzioni sono configurate per attivare ogni sorta di
servizi, che vengono fatti partire automaticamente all'accensione della
macchina. Per assicurare un livello di sicurezza minimale occorre
passare in rassegna il proprio /etc/inetd.conf
e commentare
(mettendo un `#' all'inizio della riga) ogni voce relativa
a servizi che non si intendono usare. Buoni candidati per questa
operazione sono servizi come shell
, login
, exec
,
uucp
, ftp
, e servizi informativi come finger
,
netstat
e systat
.
Ci sono molti tipi di meccanismi di sicurezza e controllo degli accessi; io descriverò solo i più elementari.
Il file /etc/ftpusers
è un semplice meccanismo
che permette di negare a certi utenti l'accesso via ftp alla macchina.
Il file /etc/ftpusers
viene letto dal programma server (ftpd)
quando vengono ricevute delle connessioni ftp in ingresso. Il file
è semplicemente una lista di utenti a cui è impedito di collegarsi.
Il file assomiglia al seguente:
# /etc/ftpusers - users not allowed to login via ftp
root
uucp
bin
mail
Il file /etc/securetty
permette di specificare a quali
periferiche di tipo tty
l'utente root può collegarsi.
Il file /etc/securetty
viene letto dal programma di
login (di solito /bin/login). Il file è una lista
di nomi di terminali ai quali root può collegarsi,
mentre su tutti gli altri
non è permesso di collegarsi come superutente:
# /etc/securetty - tty's on which root is allowed to login
tty1
tty2
tty3
tty4
Il programma tcpd che avrete notato in
/etc/inetd.conf
fornisce i meccanismi di controllo
degli accessi e di registrazione d'utilizzo
(logging) per i servizi che protegge.
Quando viene invocato dal programma inetd, tcpd legge due file contenenti regole di accesso e di conseguenza permette l'accesso al servizio o lo rifiuta.
tcpd scandisce i file di regole finché non trova una
corrispondenza. Se non ci sono corrispondenze valide, si assume che
l'accesso sia permesso a tutti. I file che vengono scanditi in
sequenza sono /etc/hosts.allow
e /etc/hosts.deny
. Li
descriverò uno alla volta. Per una descrizione completa di questa
funzionalità conviene riferirsi alle pagine del manuale
(hosts_access(5)
è un buon punto di partenza).
Il file /etc/hosts.allow
è uno dei file di configurazione
del programma /usr/sbin/tcpd. hosts.allow
contiene
le regole che descrivono a quali calcolatori è permesso accedere
ai servizi di questa macchina.
Il formato del file è molto semplice:
# /etc/hosts.allow
#
# <lista servizi>: <lista calcolatori> [: comando]
lista servizi
è una lista delimitata da virgole di nomi di programmi server cui
questa regola di applica. Esempi di nomi di server sono ftpd
, telnetd
e fingerd
.
lista calcolatori
è una lista delimitata da virgole di nomi di calcolatori. Si possono,
alternativamente, usare gli indirizzi IP. Si possono anche specificare
nomi o indirizzi usando caratteri speciali per indicare gruppi di calcolatori.
Per esempio, gw.vk2ktj.ampr.org
corrisponde ad un calcolatore
specifico, .uts.edu.au
indica tutti i nomi che terminano con questa
stringa, 44.
indica ogni indirizzo IP che inizi per 44.
Ci sono alcune parole speciali per semplificare la configurazione,
alcune delle quali sono:
ALL
per indicare tutti i calcolatori, LOCAL
per indicare i calcolatori il cui nome non contiene un `.
', cioè che sono nello stesso
dominio di questa macchina, PARANOID
indica tutti i calcolatori il cui
nome non corrisponde all'indirizzo (cioè nel caso sia in atto un
``name spoofing''). Un'altra parola speciale
che risulta utile è EXCEPT
: permette di specificare una lista con delle
eccezioni. Questo caso verrà coperto più avanti da un esempio.
comando
l'argomento comando
è opzionale.
Questo parametro corrisponde al pathname completo
di un comando che deve essere eseguito ogni volta che questa regola si applica.
Per esempio potrebbe essere un comando che cerchi di identificare chi
è collegato sul calcolatore che cerca di connettersi, o un comando che
spedisce un messaggio di posta o altri avvertimenti all'amministratore di
sistema riguardo al tentativo di connessione. Ci sono un certo numero
di estensioni che possono essere incluse nel comando; alcuni esempi
tipici sono:
%h
è il nome del calcolatore che sta collegandosi (host), o il
suo indirizzo se il nome non può essere risolto, %d
è
il server che viene invocato (daemon).
Un esempio:
# /etc/hosts.allow
#
# La posta è permessa e chiunque
in.smtpd: ALL
# telnet e ftp sono permessi solo a questo dominio e al mio
# calcolatore di casa
telnetd, ftpd: LOCAL, myhost.athome.org.au
# finger è permesso a tutti, ma tenendo traccia di chi lo usa.
fingerd: ALL: (finger @%h | mail -s "finger from %h" root)
Il file /etc/hosts.deny
è un file di configurazione del
programma /usr/sbin/tcpd. Il file hosts.deny
contiene
le regole che descrivono a quali calcolatori non è permesso
di accedere un servizio sul calcolatore locale.
Un semplice esempio potrebbe somigliare a questo:
# /etc/hosts.deny
#
# Impedisci l'accesso a tutti i calcolatori con nomi sospetti
ALL: PARANOID
#
# Impedisci l'accesso a tutti i calcolatori
ALL: ALL
In realtà la voce PARANOID
è ridondante perché l'altra
voce si riferisce in ogni caso a tutti i calcolatori. L'uso di
una di queste due
voci potrebbe essere una scelta ragionevole, in base alle specifiche
esigenze di controllo degli accessi.
La configurazione più sicura consiste nell'avere un default di
ALL: ALL
esplicito in /etc/hosts.deny
ed abilitare
esplicitamente in /etc/hosts.allow
quei servizi e quei
calcolatori che si vogliono autorizzare.
Il file hosts.equiv
viene usato per autorizzare alcuni calcolatori
e alcuni utenti ad utilizzare gli account sulla macchina locale
senza aver bisogno di fornire una password. Questo è utile in un
ambiente sicuro, in cui si possano controllare tutte le
macchine, ma è un grosso rischio in altre circostanze. Un calcolatore
è sicuro solo tanto quanto lo è
il meno sicuro dei calcolatori di cui ci si fida:
per massimizzare la sicurezza è bene non usare il meccanismo di
hosts.equiv
ed incoraggiare gli utenti a non usare nemmeno il file .rhosts
.
Molti siti sono interessati ad offrire il servizio di ftp anonimo, per
permettere ad altre persone di scaricare e depositare dei dati senza
bisogno di un'account specifico sulla macchina. Se si decide di
offrire questo servizio bisogna assicurarsi di configurare
correttamente il server ftp per l'accesso anonimo. La maggior
parte delle pagine del manuale disponibili per ftpd(8)
descrivono accuratamente come adempiere questo compito, e bisogna
assicurarsi di seguire le istruzioni. Un consiglio importante è di
non usare una copia del proprio file /etc/passwd
nella
directory /etc
dell'account anonimo: bisogna assicurarsi di
rimuovere tutti i dettagli tranne quelli necessari, altrimenti si
diventa vulnerabili alle tecniche di rottura delle password ``per forza
bruta''.
Un eccellente modo per avere una certa sicurezza è impedire ai pacchetti di raggiungere il calcolatore che si intende proteggere. Questa tecnica è discussa in dettaglio nel Firewall-HOWTO.
Questi sono altri suggerimenti che val la pena di prendere in considerazione, anche se potenzialmente si prestano a guerre di religione.
nonostante la sua popolarità, il programma sendmail appare sugli annnunci di attenzione alla sicurezza con impressionate regolarità. Dipende da voi, ma io preferisco non usarlo.
bisogna fare attenzione: esistono un sacco di modi per sfruttare malamente questi servizi. È difficile trovare un'alternativa a cose come NFS, ma se queste vengono abilitate bisogna fare estrema attenzione riguardo chi ha il permesso di montare i dischi della propria macchina.