BETA

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).

Schema della rete
Assegnazione IP Windows

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.Impostazione gateway
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.


Copertina Sommario Internet ID Informazioni Browser
BETA, La rivista ipertestuale tecnica - Copyright © 1994-1998. BETA Sul Web: http://www.beta.it.