Se avete saputo apprezzare Linux come ambiente desktop, sicuramente non rimanete delusi dal suo impiego come server. Sono già tantissimi i server che adottano Linux come sistema operativo ed è proprio questo il suo impiego più naturale.
Sono molteplici i suoi utilizzi in questo ambito, dal cluster al server di posta, dal firewall al web server. Alla sua versatilità si sta aggiungendo con il passare del tempo la ricerca della semplicità cercando di lasciare a tutti la possibilità di una libera personalizzazione secondo le proprie esigenze. Sono per questo nati e continuano ad evolversi degli ambienti grafici e le varie distribuzioni cercano di rendere la vita più semplice agli utenti fornendo loro degli strumenti semplici, spesso uniti a un'interfaccia grafica per un più facile impatto. Chi poi trova più immediati e potenti i classici comandi da console È sempre libero di continuare ad usarli.
In questo articolo approfondiremo uno dei possibili usi del sistema operativo del pinguino guidando passo passo l'utente per la configurazione di una Lan domestica basata su un gateway Linux, indipendentemente dal sistema operativo presente sui client. In questo caso il nostro sistema operativo si dovrà occupare di far condividere la propria connessione a Internet anche agli altri computer della nostra rete domestica. Per far questo avremo bisogno delle seguenti cose:
- Un collegamento a Internet (se avete problemi a riguardo o se non avete ancora configurato Linux per collegarsi alla Rete potete consultare un nostro articolo precedente);
- Dei computer collegati in rete dotati di schede ethernet con relativi cavi (coassiali oppure del tipo RJ45 incrociato oppure con un hub a seconda della dimensione della vostra rete);
Prima di continuare È bene spendere qualche parola sul tipo di protocollo che useremo: il Tcp/Ip (cioÈ Transmission Control Protocol/Internet Protocol), lo stesso usato su Internet che garantisce un'elevata affidabilità anche nelle reti molto congestionate. Questo protocollo (nella sua versione 4, ma È in fase sperimentale lo sviluppo di IPv6 nel quale vengono introdotte nuove feature e una diversa gestione degli indirizzi) attribuisce a ogni interfaccia di rete e a ogni computer un indirizzo, detto IP, (della lunghezza di 32 bit, cioÈ un byte) caratterizzato da quattro campi della lunghezza di 8 bit (un byte) separati da un . (punto), ogni campo contenente un numero da 0 a 255 (per un totale di 256 numeri, quanti se ne possono comporre con un byte).
Senza soffermarci troppo (ce ne sarebbe da parlare veramente tantissimo), chiariamo che ogni IP contraddistingue univocamente una determinata interfaccia (per esempio una scheda ethernet) o un determinato computer (per esempio 212.110.12.123 identifica www.html.it). Per far distinzione tra Internet e rete locale sono stati riservato a quest'ultimo dei determinati range di IP a seconda dell'esigenza di chi li usa (se non ci fosse questa distinzione sarebbe probabile che ci siano più interfacce o PC con lo stesso IP sulla Rete).
Gli indirizzi tra il 0.0.0.0 e il 127.255.255.255 fanno parte della classe A (nella quale varia il byte, cioÈ 8 bit, più significativo partendo da sinistra (il primo campo) che identifica la rete di appartenenza, per un totale di 128 reti disponibili (per esempio 0.xxx.xxx.xxx, 1.xxx.xxx.xxx, 2.xxx.xxx.xxx, ecc.) aventi un massimo di 32.554.430 IP ognuna) riservandone una (quella da 10.0.0.0 a 10.255.255.255) per le reti locali.
Alla classe B appartengono invece gli IP da 128.0.0.0 a 191.255.255.255 nella quale sono i 16 bit più significativi da sinistra a contraddistinguere la rete (variano quindi i primi 2 campi per ogni classe), lasciando i restanti 2 campi per le interfacce di ogni rete (formata quindi da 65.025 IP) e riservando 16 reti (da 172.16.0.0 a 172.31.0.0) per le Lan. Infine la restante classe C occupa gli indirizzi da 192.0.0.0 a 223.255.255.255 (questa volta con i 24 bit più significati da sinistra a indicare la rete, ognuna composta da 256 IP) riservando ben 256 reti (da 192.168.0.0 a 192.168.255.0) per le Lan.
Dopo questa breve introduzione al TCP/IP, passiamo ad analizzare cosa fare praticamente per avere tutti i computer connessi alla nostra rete locale su Internet. Nei nostri esempi prenderemo in considerazione una rete appartenente a una Classe C, ritenendo 256 IP più che sufficienti per un uso domestico. Precisamente useremo la rete corrispondente a 192.168.0.XXX, assegnando l'IP 192.168.0.1 al nostro gateway Linux che ci apprestiamo a configurare.
Controlliamo quindi se la nostra scheda di rete È stata già riconosciuta dalla nostra distribuzione con il comando:
lnxbox1:~# dmesg |grep eth
Se otteniamo un output simile a questo:
eth0: 3Com PCI 3c900 Boomerang 10Mbps Combo at 0xe400,
00:60:97:52:7e:b3,
IRQ 10
allora abbiamo già caricati nel kernel i driver per la nostra scheda ethernet (ovviamente l'output deve essere attinente al modello e alla marca della scheda in nostro possesso). Se non otteniamo nessun output saremo costretti a installarla manualmente. Le schede compatibili NE2000 (ce ne sono veramente tante in commercio) usano come modulo ne.o per il tipo ISA, e ne2k-pci.o per il tipo PCI.
Per sapere a quale modulo riferirsi per la vostra scheda di rete consultate l'ottimo Ethernet-HOWTO (capitolo 5), in genere il kernel fornito di default dalle varie distribuzioni contiene un buon numero di moduli per le schede ethernet più comuni. Una volta individuato il modulo usato dalla vostra scheda (per esempio ne2k-pci) potete caricalo col comando:
lnxbox1:~# modprobe ne2k-pci
Ora non vi rimane altro che assegnare un indirizzo IP alla vostra scheda di rete. Controlliamo prima che non sia già stato fatto dalla nostra distribuzione con il comando:
lnxbox1:~# ifconfig | less
(con | less passiamo l'output di ifconfig al comando less, per uscire da questo premiamo q)
Se vediamo qualche interfaccia chiamata eth0 allora la nostra scheda ha già un indirizzo ip che le È stato assegnato (l'indirizzo corrisponde all'ip dopo inet addr:).
Se non È stato fatto dalla nostra distribuzione possiamo provvedere noi ad attribuirle un IP con il comando:
lnxbox1:~# ifconfig eth0 192.168.0.1 up netmask 255.255.255.0
con questo comando abbiamo detto di attivare (up) l'indirizzo 192.168.0.1 per la scheda di rete corrispondente a eth0 avente come netmask 255.255.255.0 (quella per le Classi C), che indica quanti dei 32 bit (in questo caso 8) che identificano un IP verranno riservati per indicare interfacce di rete e quanti per indicare la rete (i restanti 24).
Per controllare che tutto sia andato a buon fine È possibile pingare l'IP della scheda di rete appena attivata con il comando:
lnxbox1:~# ping 192.168.0.1
PING 192.168.0.1 from 192.168.0.1 : 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=0 ttl=255 time=703 usec
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=112 usec
64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=111 usec
64 bytes from 192.168.0.1: icmp_seq=3 ttl=255 time=113 usec
--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/mdev = 0.111/0.259/0.703/0.256 ms
interrompendo l'esecuzione del comando con un ctrl+C. Se l'output È simile allora tutto È stato configurato correttamente.
Questa È la sintassi che va bene per tutte le distribuzioni Linux, spesso però esse forniscono ai loro utenti degli strumenti grafici per configuare la propria scheda di rete senza avere la necessità di ricordarsi la sintassi dei vari comandi per il networking. Riteniamo però che il metodo classico, se ben compreso può rivelarsi anche il più veloce e affidabile.
Per completare l'installazione della nostra scheda di rete rimane soltanto da fare le modifiche opportune alla tabella di instradamento. La tabella di instradamento (routing table) definisce le modalità di trasmissione dei pacchetti IP. In poche parole stabilisce a quale interfaccia di rete va trasmesso un pacchetto IP una volta ricevuto. Anche qui il discorso può farsi molto lungo e noioso, quindi passiamo direttamente a spiegare le procedure che ci occorrono per un corretto funzionamento. Una volta visto che la nostra scheda di rete risponde bene ai nostri ping, eseguiamo (sempre da utente root):
lnxbox1:~# route add -net 192.168.0.0 netmask 255.255.255.0 eth0
dove -net indica la rete a cui appartiene l'interfaccia (nel nostro caso abbiamo scelto 192.168.0.XXX, quindi mettiamo 192.168.0.0), netmask ha lo stesso significato che aveva in ifconfig e eth0 indica l'interfaccia sulla quale stiamo agendo.
A questo punto abbiamo finito di configurare la nostra scheda di rete.
Masquerading
Come già accennato tramite Linux abbiamo la possibilità di far "vedere" internet a tutta la nostra rete locale. In questo modo avremo tutti i nostri computer della Lan in Rete, con un solo modem, una sola linea telefonica e una sola connessione. Ovviamente l'IP pubblico (con IP pubblico intendiamo l'IP su Internet) sarà uguale per tutti i PC, penserà il nostro gateway con installato Linux a smistare i pacchetti a chi li aveva chiesti e a inoltrare quelli ricevuti.
La configurazione del nostro gateway varierà a seconda della versione del kernel presente. Infatti per ogni serie di kernel abbiamo uno strumento diverso che ci permette di agire sul traffico che passa per la nostra rete. Questi sono ipfwadm per il kernel 2.0.XX (non presente su nessuna delle recenti distribuzioni, ma ugualmente presente ancora su alcuni PC per la sua leggerezza), ipchains per il kernel 2.2.XX (presente su alcune distribuzioni che ancora non sono passate al nuovo kernel) e il recentissimo iptables per il kernel 2.4.X (presente nelle ultimissime distribuzioni).
Anche se si sta utilizzando un kernel della serie 2.4 È sempre possibile continuare ad usare sia ipfwadm che ipchains, a patto che vi sia il supporto apposito nel kernel.
È inoltre necessario che sia presente il supporto nel kernel per il masquerading.
Per il kernel 2.0.XX È quindi necessario avere abilitato il supporto alle seguenti feature:
Network firewalls
- IP: Forwarding/gatewaying
- IP: firewalling
- IP: masquerading
- IP: ICMP masquerading
- IP: always defragment
- Per il kernel 2.2.X sono:
Network firewalls
- IP: firewalling
- IP: masquerading
- IP: ICMP masquerading
- IP: masquerading special modules support
- IP: always defragment
Per il kernel 2.4.X abilitate:
Network packet filtering (replaces ipchains)
Connection tracking (required for masq/NAT)
- FTP protocol support
IP tables support (required for filtering/masq/NAT)
- MAC address match support
- Multiple port match support
- Packet filtering
- REJECT target support
- MIRROR target support (EXPERIMENTAL)
- Full NAT
- MASQUERADE target support
- REDIRECT target support
- Packet mangling
- TOS target support
- MARK target support
- LOG target support
ipchains (2.2-style) support
ipfwadm (2.0-style) support
Molte delle opzioni per il kernel 2.4 non sono strettamente necessarie, ma offrono delle innovazioni e delle interessanti caratteristiche. Ad ogni modo sono sufficienti i moduli: ip_table, ip_conntrack, iptable_nat, ipt_MASQUERADE .
a) Cosa fare con un kernel della serie 2.0.XX
Prima di tutto abilitiamo l'ip forwarding, che È disabilitato di default.
lnxbox1:~# echo "1" > /proc/sys/net/ipv4/ip_forward
Caricate i moduli del kernel, in particolare se ritenete che gli utenti della vostra Lan useranno servizi come ftp o irc dovrete attivare i seguenti moduli: ip_masq_ftp e ip_masq_irc. Se avete intenzione di usare anche programmi come CuSeeme o VDO-live per la video conferenza oppure intendete giocare online a Quake ci sono i moduli: ip_masq_cuseeme, ip_masq_vdolive, ip_masq_quake. Per caricare i moduli eseguiamo:
lnxbox1:~# modprobe ip_masq_ftp
lnxbox1:~# modprobe ip_masq_irc
A questo punto dobbiamo dire al kernel cosa fare per far condividere la connessione ad Internet a tutti i PC collegati alla rete. Per questo usiamo ipfwadm e diamo i seguenti comandi:
lnxbox1:~# ipfwadm -M -s 7200 10 160
Con questo comando andiamo a modificare quelle che sono le regole di mascheramento dei pacchetti. In particolare con -s cambiamo i valori di timeout per i pacchetti TCP. Il primo parametro (7200 secondi) imposta il timeout per le sessioni TCP, il secondo (10 secondi) quello per il traffico dopo aver ricevuto un pacchetto TCP/IP "FIN" (che indica la fine di una connessione), il terzo (160 secondi) imposta il timeout per il traffico UDP (importante per esempio per gli utenti che usano ICQ).
lnxbox1:~# ipfwadm -F -p deny
Con l'opzione -F andiamo a cambiare le regole per il forwarding. In particolare comunichiamo al kernel di non fare il forward dei pacchetti TCP/IP.
lnxbox1:~# ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0
Con questo comando (c'È sempre l'opzione -F per il forwarding) impostiamo il masquerading dei pacchetti per gli IP facente parti della nostra Classe C (192.168.0.0/24, dove /24 indicano i bit che la nostra classe riserva all'identificazione della rete, cioÈ una Classe C) provenienti da ogni indirizzo su Internet (0.0.0.0/0).
b) Cosa fare con un kernel della serie 2.2.XX
Le cose da fare sono analoghe a quelle per un kernel della serie 2.0. In questo caso si userà al posto di ipfwadm ipchains. Prima di procedere abilitiamo l'ip forwarding e carichiamo i moduli:
lnxbox1:~# echo "1" > /proc/sys/net/ipv4/ip_forward
lnxbox1:~# modprobe ip_masq_ftp
lnxbox1:~# modprobe ip_masq_irc
I comandi da dare con ipchains sono molto simili a quelli per ipfwadm:
lnxbox1:~# ipchains -M -S 7200 10 160
lnxbox1:~# ipchains -P forward DENY
lnxbox1:~# ipchains -A forward -s 192.168.0.0/24 -j MASQ
c) Cosa fare con un kernel della serie 2.4.XX
Con l'avvento del kernel 2.4 (e quindi con il kernel di sviluppo 2.3), sono cambiate molte cose. Netfilter (il nuovo sistema di gestione dei pacchetti) È uno strumento molto potente e flessibile. Tuttavia viene lasciata l'opportunità di continuare ad usare i vecchi ipchains e ipfwadm. Abilitiamo come al solito il supporto all'ip forwarding:
lnxbox1:~# echo "1" > /proc/sys/net/ipv4/ip_forward
Come già detto i moduli da caricare per poter abilitare il supporto al masquerading sono: ip_table, ip_conntrack, iptable_nat, ipt_MASQUERADE.
lnxbox1:~# modprobe ip_tables
lnxbox1:~# modprobe ip_conntrack
lnxbox1:~# modprobe iptable_nat
lnxbox1:~# modprobe ipt_MASQUERADE
Ora eseguiamo i comandi che ci permettono di fare il mascheramento dei pacchetti:
lnxbox1:~#
iptables -t nat -A POSTROUTING -d ! 192.168.0.0/24 -j MASQUERADE
Con questo comando impostiamo il mascheramento per tutto quello che non È destinato alla Lan. Se usassimo solo questo comando avremo anche l'effetto indesiderato che ognuno potrebbe usare il nostro gateway per mascherare i propri pacchetti. Per evitarlo impostiamo iptables perché faccia il forward solo per la nostra sottorete.
lnxbox1:~# iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
lnxbox1:~# iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT
lnxbox1:~# iptables -A FORWARD -j DROP
In questo modo permettiamo il forwarding per i pacchetti che hanno come origine (-s) e come destinazione (-d) la nostra sottorete (192.168.0.0/24) e di scartare tutti gli altri (ultimo comando).
A questo punto se tutto È andato bene dovremo essere riusciti a impostare il nostro Linux per funzionare come gateway della nostra rete locale.
Per automatizzare le cose È comunque sempre conveniente mettere tutti i comandi in uno script (per esempio con nome masq) da rendere eseguibile con:
lnxbox1:~# chmod 755 masq
e metterlo quindi in una directory del path (per esempio /usr/bin o /usr/local/bin) in modo da richiamarlo quando ne abbiamo la necessità, oppure inserirlo in uno script di avvio a seconda della distribuzione usata (per esempio uno sotto /etc/rc.d) oppure in /etc/ppp/ip-up che viene caricato in automatico appena ci si collega a Internet usando il PPP (come con i provider).
4) Configurare i client
La configurazione dei client ovviamente varia con il sistema operativo. Essa richiede comunque solo poche operazioni. Per quanto riguarda Windows 9x, una volta installata la scheda di rete (e averle quindi assegnato un IP), dovrete inserire l'indirizzo del gateway appena configurato (192.168.0.1) nel menu che si trova in Impostazioni -> Pannello di controllo -> Rete -> TCP/IP Scheda di rete ... -> Gateway e cliccare su Aggiungi. È importante anche impostare il DNS usato su ogni macchina. Per sapere che DNS usa il vostro provider fate riferimento al suo sito o consultate il precedente articolo sulla configurazione dell'accesso a Internet.
Per quel che riguarda la configurazione di un client con Linux (dopo aver configurato correttamente la scheda di rete presente e averle assegnato un indirizzo IP libero) ci torna utile route, che ci permette anche di impostare il gateway da usare.
In questo caso la sintassi È:
lnxbox1:~# route add default gw 192.168.0.1
Per inserire il DNS da usare bisogna modificare il file /etc/resolv.conf (per esempio con un editor di testo come vi, joe, pico, emacs, gedit, kwrite, ecc.) seguendo la sintassi:
nameserver XXX.XXX.XXX.XXX
nameserver XXX.XXX.XXX.XXX
dove al posto di XXX.XXX.XXX.XXX ci sta l'indirizzo IP del DNS del nostro provider primario (prima riga) o secondario (seconda riga).
In questo articolo abbiamo cercato di introdurvi le nozioni basi per il masquerading. Quelli che abbiamo analizzato sono degli strumenti molto potenti, e vi capiterà spesso di usarli soprattutto quando avrete da impostare delle azioni da compiere su determinati pacchetti (per esempio nella configurazione di un firewall).