BETA
Copertina
Sommario
Internet ID
Informazioni
Browser
Guida
Indici
Redazione
Mailing
Dove come
Mirror
Licenza
Cerca
Stampa
BETA sul Web
|
 |
 |
 |

Partner tecnico di BETA - Fai click qui sopra per collegarti al sito
Ricetta per il router fatto in casa
Configuriamo una macchina Linux per collegare ad Internet la LAN di casa
di Fernando Carello
Articolista Senior, BETA
Come dite, in casa non avete una LAN ??
Beh, molto male: allora, come prima cosa procuratevi una LAN.
Bastano anche due soli PC, uno dei quali può essere assemblato mettendo insieme tutto il materiale "avanzato"
dai vari upgrade della macchina principale: tanto dovrete installarci Linux, mica giocare col Solitario di Windows !
A parte le battute, può succedere che si abbia la necessità di condividere un accesso Internet su più di un
computer: ad esempio, collegare tutti i computer di casa, o dello studio, senza acquistare un modem
ciascuno.
La soluzione più elegante consiste nell'utilizzare un router (magari uno di quei piccoli router ISDN della
nuova generazione, che incorporano anche un Terminal Adapter), tuttavia se avete una macchina Linux è
senz'altro più economico configurare quest'ultima per fare da gateway tra il fornitore di accesso e la vostra
rete.
Il concetto è semplice: la macchina Linux sarà la sola effettivamente collegata al fornitore di accesso
(tramite modem, terminale ISDN, parabola satellitare o quant'altro), mentre le altre macchine "passeranno
attraverso" essa per raggiungere il resto del mondo.
Prima di addentrarci nella parte operativa, due paroline sugli indirizzi IP.
Come si sa, tutte le macchine connesse su una (stessa) rete TCP/IP devono avere un indirizzo IP univoco;
in particolare, quindi, tutte le macchine connesse ad Internet devono avere un proprio indirizzo IP
(assegnato da un Ente coordinatore in modo diretto od indiretto, esempio tramite un fornitore di accesso).
D'altra parte, esistono (moltissime) macchine facenti parte di reti TCP/IP "private", ovvero non facenti parte
di Internet: per evitare un terribile spreco di indirizzi IP (Internet soffre di carenze di indirizzi liberi),
è possibile (e consigliabile) utilizzare, per queste reti private, particolari classi di indirizzi
appositamente riservati all'uopo dallo IANA (Internet Assigned Numbers
Authority).
Esse sono:
- Un'intera classe "A", con indirizzi 10.0.0.0 -> 10.255.255.255 , la celeberrima "classe 10"
- Sedici classi "B" consecutive: 172.16.0.0.0 -> 172.31.255.255
- 255 classi "C" consecutive: 192.168.0.0 -> 192.168.255.255
D'ora in poi supporremo che la vostra LAN TCP/IP privata abbia indirizzi di questo tipo: in particolare, supporremo che
la macchina Linux (il gateway) abbia indirizzo 192.168.0.1 ; assumeremo che su questa macchina sia già
funzionante un sistema PPP (ovvero, che siate già in grado, su questa macchina, di collegarvi ad Internet
tramite modem o quant'altro).
 |
 |
Supporremo poi che abbiate una macchina Windows, con indirizzo 192.168.0.2.
Con questi indirizzi, le vostre macchine non possono far parte di Internet; ed infatti, quando vi collegate al
vostro fornitore di accesso via modem vi viene attribuito un IP "temporaneo" tra quelli (validi su Internet) a
disposizione del suddetto fornitore di accesso (che d'ora in poi indicheremo con ISP per risparmiare
polpastrelli): per tutta la durata della connessione, questo IP temporaneo identificherà su Internet la
vostra macchina, permettendole di ricevere correttamente i pacchetti di risposta alle vostre richieste sulla
rete, ed ovviamente i pacchetti ACK indispensabili allo stesso funzionamento del protocollo TCP.
Il nostro scopo è utilizzare quest'unico IP valido anche per la macchina Windows, in apparente contraddizione
con le regole prima riportate: il "trucco" verrà attuato dal kernel di Linux debitamente configurato.
A ben vedere, sono due i principali compiti che la macchina gateway dovrà espletare: incanalare lungo la
propria connessione PPP anche il traffico Internet della macchina Windows (che, ricordiamo, non ha modem), e
"truccare" la macchina Windows con il proprio indirizzo IP temporaneo fornito dall'ISP.
Queste due funzioni sono più o meno traducibili, in networkese, con IP Forwarding ed
IP Masquerading.
Vediamo quindi come configurare la nostra macchina Linux per svolgere questi compiti.
Cominciamo con la ... lista della spesa: ci serve un bel kernel nuovo nuovo (2.1.106 o successivi; anche i
kernel precedenti svolgono senza problemi il compito, ma in modo leggermente meno efficiente: visto che tutto il
sottosistema di firewalling è stato riscritto dal 2.1.102 e che e a noi piace essere all'avanguardia...) ed un
pacchetto software denominato ipfwchains.
Se per il primo ingrediente conoscete senz'altro a memoria l'indirizzo (ad ogni modo, http://www.kernel.org , o se preferite ftp://ftp.cs.helsinki.fi/pub/Linux_Kernel/v2.1),
per il secondo dovrete arrivare fino in Australia:
http://www.adelaide.net.au/~rustcorp/ipfwchains.
Notare che il pacchetto utilizzato per i kernel precedenti (ovvero ipfwadm) non va più bene con i nuovi kernel
!
Affinché tutto proceda bene, è necessario che le librerie di sistema siano decentemente fresche: abbiamo
testato le libc 5.4.44 e le libc 5.4.38, che dovrebbero essere considerate il minimo indispensabile.
Servono anche le modutils 2.1.85 (che trovate allo stesso indirizzo del kernel).
OK, descritti gli ingredienti passiamo al corpo della ricetta.
Come avrete sicuramente sospettato, per abilitare i servizi di rete che ci servono occorre anzitutto riconfigurare e ricompilare il kernel.
Premetto che verrano descritte, nel seguito, solo le opzioni specifiche per abilitare i servizi di cui stiamo
parlando: tutte le altre opzioni riguardanti il kernel non vengono descritte, ma non significa certo che non
servono !
Le opzioni che ci riguardano sono nelle sezioni Filesystems e Networking Options.
Nella prima sezione, occorre abilitare /proc file system support; nella seconda, Network firewalls,
IP: firewalling, IP: always defragment, IP: masquerading ed infine IP: ICMP masquerading.
Rimandandovi all'HELP dello script di configurazione per una spiegazione dettagliata delle varie opzioni, mi
limito ad una rapida carrellata sulle prime tre voci: il "proc file system" (che peraltro sicuramente sarà
già abiitato sul vostro sistema Linux) permette di avere una potente e pratica interfaccia (un vero file
system virtuale) a svariati parametri che influenzano il funzionamento del kernel, e ci servirà per abilitare
l'IP Forwarding; "Network firewalls" abilita una serie di funzioni di rete aggiuntive, e attiva le opzioni
che seguono; "IP: firewalling" attiva le funzionalità di filtraggio sui pacchetti IP e attiva le opzioni
successive.
Ricompilate il kernel così configurato, guarnite con alcuni moduli ("make modules"; "make modules_install") e
fateci il boot.
Ora attiviamo l'IP forwarding:
echo "1" > /proc/sys/net/ipv4/ip_forward
Difficile eh ? Potenza del proc filesystem !
Carichiamo, tra i moduli compilati, quelli adatti alla nostra situazione (i moduli relativi all'IP forwarding
li trovate tutti sotto /lib/modules/2.1.1xx/ipv4 ), installiamo il pacchetto ipfwchains, leggiamone
la pagina di manuale e prepariamoci a scrivere le regole per il nostro gateway.
Il sistema di firewalling implementato dal kernel prevede 3 categorie principali di filtri: una categoria che riguarda
l'ingresso dei pacchetti (dalla rete esterna verso l'interno del firewall), una che riguarda l'uscita dei
pacchetti, e una che riguarda l'inoltro dei pacchetti: appunto il forwarding.
Il tema del firewalling è senz'altro molto interessante, ma troppo ampio per essere trattato in
quest'articolo: concentriamoci dunque sui filtri per il forwarding.
La struttura di una regola di filtraggio prevede principalmente la definizione di tre elementi: la classe di
indirizzi di provenienza, la classe di indirizzi di destinazione, e il tipo di filtro da applicare ai
pacchetti così individuati.
In altre parole, si tratta di identificare, per ciascun filtro (azione), quali sono i pacchetti soggetti alla
sua applicazione.
Nel nostro caso quello che ci interessa è che (solo) i pacchetti provenienti dalla nostra LAN privata, e diretti
verso Internet, vengano mascherati.
Anzitutto, quindi, dovremo impedire che altri indirizzi possano venir mascherati dal nostro gateway: pensiamo
infatti alla possibilità che qualcuno usi, a nostra insaputa, il nostro indirizzo per mascherare le proprie
macchine, magari per compiere qualche azione esecrabile che potrebbe essere collegata a noi !
Per impedire che ciò avvenga, dobbiamo mettere una regola di default sulla categoria "forward" che specifichi
di negare l'accesso a tutti. Ciò si traduce nel seguente comando:
ipchains -P forward DENY
A questo punto, dovremo invece permettere alle nostre macchine di usare i servizi del gateway, e quindi
configurare i filtri per il masquerading della nostra LAN.
Per specificare gli indirizzi di provenienza, abbiamo due possibilità: possiamo genericamente indicare
l'intera rete 192.168.0.x, oppure indicare singolarmente le varie macchine che ne fanno parte. La scelta
dipende da .. cosa vogliamo fare: se tutte le macchine appartenenti alla nostra LAN devono poter usufruire
dell'accesso ad Internet converrà specificare l'intera classe "C": 192.168.0.0 con netmask 255.255.255.0,
mentre se, ad esempio, vogliamo che solo la macchina Windows possa "uscire", indicheremo esplicitamente il suo
indirizzo (quindi 192.168.0.2 con netmask 255.255.255.255).
Nel nostro esempio decidiamo di mascherare l'intera LAN, quindi la classe di provenienza sarà, usando la
sintassi di ipchains:
192.168.0.0/255.255.255.0
La classe degli indirizzi di destinazione dovrà essere l'intera Internet, quindi:
0.0.0.0/0.0.0.0
(nota: ipchains permette di usare una notazione abbreviata per indicare le netmask; abbiamo preferito questa
perché a nostro avviso è più chiara)
Il filtro da applicare è la mascheratura (MASQ), quindi la sintassi completa del comando sarà:
ipchains -A forward -s 192.168.0.0/255.255.255.0 -d 0.0.0.0/0.0.0.0 -j MASQ
Abbiamo così applicato il filtro MASQ sulla categoria "forward" a tutti i pacchetti che, provenienti dalla
nostra rete interna, sono diretti verso l'esterno.
Volendo avremmo potuto specificare i protocolli sui quali applicare il filtro (di default sono TCP ed UDP, più
ICMP se abbiamo caricato l'apposito modulo): si veda la man page di ipchains.
A questo punto, tutte le macchine della nostra LAN appariranno su Internet con l'indirizzo (valido) del
gateway Linux: in altre parole, avremo "nascosto" la nostra rete interna dietro la sagoma del gateway.
Naturalmente occorrerà configurare opportunamente i parametri di rete IP della macchina Windows; prima
però c'è ancora qualcosina da fare.
Poiché il gateway si occupa di inoltrare i pacchetti verso Internet, la connessione tra la macchina Windows
del nostro esempio e gli host con cui intende collegarsi non è diretta: ciò potrebbe creare qualche problema
nel momento in cui un'applicazione Windows consideri un certo timeout entro il quale attendere una
risposta.
A volte infatti l'applicazione potrebbe non accorgersi che, ad esempio, il gateway Linux non è collegato ad
Internet (magari la connessione PPP è stata interrotta): deve essere il gateway stesso a generare un timeout
appropriato ai vari protocolli.
Per impostarlo, si usa la seguente sintassi:
ipchains -M -S secondi_timeout_TCP secondi_timeout_TCP_dopo_FIN secondi_timeout_UDP
Un esempio potrebbe essere:
ipchains -M -S 7 5 7
Diamo un'ultima controllata alla configurazione con il comando:
ipchains -L
che dovrebbe restituire:
Chain input (policy ACCEPT):
Chain forward (policy DENY):
target | prot | pt | source |
destination | ports |
MASQ | all | ------ | localnet/16 |
anywhere | n/a |
Chain output (policy ACCEPT):
A questo punto sarà bene mettere tutti i comandi finora mostrati in uno script di
startup, tipo /etc/rc.d/rc.local per chi usa Linux Slackware; dopodiché si può passare
a configurare la macchina Windows.
In realtà, è davvero molto semplice: basta entrare nelle Proprietà del protocollo TCP/IP e settare come
gateway la nostra macchina Linux, ovvero 192.168.0.1.
In questo modo, ogni volta che il PC Windows tenterà di raggiungere un indirizzo al di fuori della propria
LAN, il pacchetto verrà indirizzato sul gateway, che a sua volta lo incanalerà verso Internet.
Ammesso che la connessione PPP sia attiva, naturalmente !
Ah, già: non si potrebbe fare in modo che il gateway Linux attivi automaticamente la connessione PPP verso l'ISP ogni volta
che qualcuna delle macchine sulla LAN interna vuole uscire su Internet ?
Certo che si può, la funzionalità si chiama PPP-on-demand ed è supportata in modo diretto dalle versioni recenti del pacchetto
PPP di Linux (ed in modo indiretto, grazie al demone diald, da quelle meno recenti).
Però dovete avere pazienza, perché non è argomento di questo articolo ...
Fernando Carello è Articolista di BETA dal 1995 ed
è raggiungibile su Internet tramite la redazione
oppure all'indirizzo fernando@beta.it.
Copyright © 1998 Fernando Carello, tutti i diritti sono riservati.
Questo Articolo di BETA, insieme alla Rivista, è distribuibile secondo i termini e le
condizioni della Licenza Pubblica Beta, come specificato nel file
LPB.
|
 |