Il collegamento ad Internet e Linux
2006
Dal momento in cui avviamo la connessione ad Internet sulla nostra macchina abbiamo la sensazione di essere collegati a tutte le macchine e le risorse disponibili nel mondo. Questo e’ vero solo in parte, in quanto in realta’ la sola connessione esistente dalla nostra macchina verso l’esterno e’ diretta al server del nostro ISP, e sara’ esso a sua volta a restituirci quello che chiediamo attraverso il nostro browser o i vari client che abbiamo installati. Non si tratta dunque, a differenza di quanto avviene nelle comuni LAN (ad esempio di tipo Ethernet), di un collegamento diretto con il resto della rete, ma si tratta di un collegamento seriale tra due nodi (peer). Occorre quindi che per la trasmissione si utilizzi un protocollo che permetta di incapsulare pacchetti TCP, per trasmetterli attraverso una linea seriale come e’ quella tra il nostro modem e quello del nostro ISP.
Il protocollo in questione e’ il PPP (protocollo punto a punto), che sostituisce da tempo il vecchio SLIP. Sul server remoto (quello dell’ISP) e’ installato un server PPP che gestisce le richieste di connessione provenienti da un client PPP, occupandosi di effettuarne l’autenticazione e di configurare la connessione. In realta’ non ci sono un programma client e un programma server, in quanto il programma che si occupa della trasmissione PPP puo’ benissimo fare sia da client che da server. Sulla macchina locale sara’ installato un programma che si occupera’ di fare da client nella comunicazione PPP; in ambiente Linux questo programma si chiama pppd(8).
Esistono vari strumenti per configurare facilmente una connessione ad Internet in un sistema Linux (Kppp, Wvdial, ecc.), e tutti questi utilizzano pppd per raggiungere il loro scopo, tuttavia e’ possibile configurare la connessione anche senza l’ausilio di questi intervenendo manualmente nella configurazione di pppd.
Pppd
Per invocare pppd occorre lanciare il comando “pppd [ opzioni ]“. Le opzioni accettate dal comando sono veramente numerose, ed e’ in base a queste che pppd impostera’ il proprio funzionamento. Le opzioni, oltre che essere specificate sulla linea di comando, possono essere scritte su una serie di file di configurazione facilmente modificabili per poterli adattare alle proprie esigenze. All’avvio pppd legge le opzioni da, nell’ordine, i seguenti file: /etc/ppp/options, ~/.ppprc, /etc/ppp/options.<dispositivo> e, eventualmente, /etc/ppp/peers/*. I file /etc/ppp/options.<dispositivo> rappresentano dei file contenenti opzioni specifiche da usare con <dispositivo>, dove con dispositivo si intende il file del terminale seriale presente in /dev al quale pppd deve collegarsi, o il nome dell’interfaccia Ethernet (nella forma ethX) nel caso in cui si usi una versione recente di pppd e si abbia un modem adsl di tipo Ethernet collegato a quella interfaccia. I file /etc/ppp/peers/* sono invece file contenenti opzioni da utilizzare quando pppd viene invocato con l’opzione ‘call’ seguita dal nome del peer (il quale e’ un nome arbitrario) corrispondente al nome del file in /etc/ppp/peers/. Infine verranno lette le opzioni impostate sulla linea di comando. La maggior parte delle distribuzioni forniscono un file di esempio in /etc/ppp contenente varie opzioni debitamente commentate, da poter prendere come riferimento per la creazione di uno o piu’ file personalizzati.
Perche’ pppd possa svolgere il suo compito e’ necessario che vengano soddisfatti alcuni requisiti. Prima di tutto il kernel deve avere i driver/supporti necessari, e in particolare:
– Supporto per protocollo IP
– Supporto per protocollo PPP
– Supporto per i sistemi di compressione dei dati che verranno usati durante la connessione (deflate e bsd)
Altri driver che potrebbero essere necessari in taluni casi (linea ADSL, tunnel PPTP):
– Supporto per “PPP over Ethernet” (PPPOE)
– Supporto per protocollo Packet
– Supporto per compressione MPPE
Nel caso (frequente) in cui i suddetti driver siano disponibili come moduli esterni anziche’ essere compilato dentro il kernel e’ opportuno verificare che il file di configurazione dei moduli del kernel (/etc/modules.conf o /etc/modprobe.conf)3 sia in grado di istruire il sistema su quali moduli caricare all’arrivo di alcune richieste da parte dei programmi. In genere e’ sufficiente inserire, nel caso in cui non vi siano gia’, queste righe nel file:
alias net-pf-2 ipv4
alias net-pf-17 af_packet
alias net-pf-24 pppoe
alias ppp0 ppp
alias tty-ldisc-3 ppp_async
alias tty-ldisc-14 ppp_synctty
alias ppp-compress-18 ppp_mppe
alias ppp-compress-21 bsd_comp
alias ppp-compress-24 ppp_deflate
alias ppp-compress-26 ppp_deflate
Inoltre, dovendo pppd essere in grado di gestire direttamente i dispositivi seriali, i dispositivi di rete e le tabelle di routing, e’ necessario che pppd giri con i privilegi dell’utente root. E’ sufficiente per questo che si imposti il flag suid sull’eseguibile /usr/sbin/pppd.
Pppd puo’ benissimo essere usato per stabilire una connessione tra due macchine collegando le loro porte seriali attraverso un cavo seriale di tipo null-modem, realizzando in questo modo una piccola rete locale a bassa velocita’. In tal caso e’ sufficiente che entrambe le macchine abbiano installato pppd, e ognuna di esse potra’ richiedere un collegamento all’altra. L’utilizzo tipico di pppd e’ pero’ quello di utilizzare un modem per connettersi al proprio ISP. Nel caso in cui si abbia a disposizione una normale linea telefonica con modem analogico sara’ necessario utilizzare anche un programma che si occupi di interagire con il modem per far si’ che questo componga il numero di telefono del computer remoto ed avvii la procedura cosiddetta di “handshaking” per negoziare i parametri della connessione. Questo programma si chiama chat(8).
Chat
Chat viene normalmente invocato da pppd stesso tramite l’opzione ‘connect’. Lo scopo di questa opzione e’ appunto quello di eseguire i compiti necessari per instaurare fisicamente la connessione prima che pppd si occupi del resto. Normalmente l’argomento dell’opzione ‘connect’ e’ uno script o una linea di comando per invocare chat, ad esempio “connect ‘/usr/sbin/chat -f /etc/ppp/chat-isp’“. In questo esempio viene invocato chat passandogli come argomento dell’opzione -f il nome del file contenente il relativo script (per comodita’ tale file si colloca nella stessa directory contenente gli altri file di configurazione di pppd).
Infatti occorre che tutte le operazioni che chat deve eseguire vengano inserite in un apposito file, lo script di chat appunto, contenente una serie di comandi che ne specificano le azioni da intraprendere, fra cui la stringa di inizializzazione da inviare al modem, il numero di telefono da comporre, opzioni relative a timeout di connessione e cose simili, ed eventualmente una o piu’ coppie nel formato “stringa_ricevuta: stringa_da_inviare” che istruiscono il programma su come reagire nel caso riceva una stringa (o sottostringa) cosi’ formata, e cioe’ quale stringa di risposta dovrebbe inviare. L’utilizzo di questa funzionalita’ e’ in genere quello di rispondere alle richieste di immissione username e password del computer remoto, ma e’ in realta’ utilizzabile solo quando il protocollo di autenticazione utilizzato dall’ISP e’ il PAP. Inoltre per poter utilizzare chat per l’autenticazione sarebbe necessario indagare preliminarmente, tramite un emulatore di terminale, per sapere il formato dei prompt che l’host remoto ci invia per richiederci di autenticarci. Per ragioni di comodita’ e’ quindi preferibile evitare che l’autenticazione venga effettuata da chat, delegando direttamente pppd a questo che si occupera’ di svolgere il compito in modo totalmente trasparente all’utente.
Se chat avra’ avuto successo nell’instaurazione della connessione esso uscira’ restituendo il controllo delle operazioni a pppd.
Protocolli d’autenticazione
Vi sono vari protocolli alternativi per l’autenticazione, di cui i piu’ comuni sono il PAP ed il CHAP con le sue varianti MSCHAP80 e MSCHAP81. La pricipale differenza fra questi e’ che mentre PAP si avvale dell’uso di credenziali in chiaro, gli altri prevedono l’uso di qualche forma di cifratura per le password da inviare. Per sapere gli username e le password da utilizzare in una certa sessione, pppd legge il contenuto di due file che andra’ a cercare nella directory /etc/ppp/. I nomi di questi file sono rispettivamente pap-secrets e chap-secrets, ed il loro formato e’ praticamente identico. Questi file sono praticamente composti da righe successive contenenti ognuna le informazioni relative ad una specifica sessione suddivise in tre campi: il primo contiene lo username, il secondo contiene il nome del server remoto (di solito al suo posto viene specificato il jolly “*”), il terzo contiene la password. In realta’ ci sarebbe un quarto campo opzionale che puo’ contenere una lista di indirizzi IP validi per raggiungere il server, ma nei collegamenti via modem questo campo e’ naturalmente inutilizzato. Per consentire a pppd di sapere quale password utilizzare e’ sufficiente utilizzare nel corrispondente file in /etc/ppp/peers l’opzione ‘name’ seguita dal nostro username per quella connessione. In questo modo pppd cerchera’ nei file contenenti i ‘segreti’ la stringa contenente quello username e ne utilizzera’ la password relativa.
Terminata la fase di autenticazione pppd informera’ il kernel dell’indirizzo IP assegnatogli dall’host remoto e dell’indirizzo IP dello stesso host, impostando, nel caso una delle opzioni passategli all’avvio sia stata ‘defaultroute’, la tabella di routing in modo che l’host remoto venga riconosciuto come gateway predefinito, ossia che qualunque richiesta diretta ad indirizzi IP non contemplati nel file /etc/hosts venga instradata verso l’host remoto. Verra’ inoltre letto il file /etc/resolv.conf per conoscere gli indirizzi IP dei server DNS da interrogare per la risoluzione degli URL; e’ comunque possibile fare in modo che pppd ottenga l’indirizzo IP di un server DNS direttamente dall’host remoto, basta specificare l’opzione ‘usepeerdns’.
Da questo momento in poi sara’ disponibile un’interfaccia di rete denominata “pppX”, dove X e’ un numero che parte da 0 e si incrementa di una unita’ per ogni eventuale interfaccia creata successivamente. A tale interfaccia verra’ connesso il dispositivo seriale specificato fra le opzioni di pppd.
ADSL
Vi sono vari protocolli di trasporto per quanto riguarda la connessione a linee ADSL a banda larga, quindi per questo tipo di connessioni occorre accertarsi di quali siano i rpotocolli supportati dal nostro provider. Il caso piu’ semplice, ma purtroppo anche quello meno diffuso, prevede una connessione di tipo bridged dove la nostra macchina diventa a tutti gli effetti un nodo della sottorete del provider, e in questo caso non serve nessun tipo di software di collegamento.
Nel caso di collegamento a linea adsl con protocollo PPPoE (PPP over Ethernet), avendo a disposizione una versione sufficientemente recente di pppd e i necessari moduli di cui abbiamo accennato sopra, all’interfaccia pppX verra’ connessa la scheda di rete alla quale e’ collegato il modem. E’ importante, in quest’ultimo caso, che si sia provveduto precedentemente a caricare il driver relativo alla scheda di rete in oggetto, ma allo stesso tempo e’ necessario che l’interfaccia ethX corrispondente non sia stata configurata con un indirizzo IP, o al massimo che le sia stato assegnato un indirizzo appartenente alla stessa sottorete dell’interfaccia Ethernet del modem ADSL (utile in seguito per poter sfruttare le funzionalita’ di configurazione remota del modem); e’ sufficiente tirare su l’interfaccia con un comando del tipo “ifconfig ethX <indirizzoIP>” (oppure, se non si vuole assegnare l’indirizzo, “ifconfig ethX 0.0.0.0“).
Il terzo protocollo utilizzato sulle linee ADSL e’ il PPPoATM (PPP over ATM). In questo caso, a differenza di PPPoE, l’incapsulamento dei dati non viene effettuato da programmi in user space ma direttamente dall’hardware (e in questo caso abbiamo un guadagno in termini di prestazioni) o dal driver di periferica.
In linux esistono due possibilita’ per poter utilizzare questo protocollo: la prima riguarda l’acquisto di una scheda ATM e l’utilizzo del supporto di pppd per PPPoATM e del relativo supporto a livello kernel. Occorre pero’ notare che potrebbe non essere semplice reperire in commercio una di queste schede a causa della loro scarsa diffusione, e inoltre il driver PPPoA del kernel e’, al momento in cui scriviamo, ancora in fase sperimentale.
La seconda possibilita’ riguarda l’acquisto di un modem (generalmente con interfaccia USB) per il quale vengano sviluppati i necessari driver per Linux. Il sito di riferimento in questo caso e’ quello del progetto eciadsl (http://eciadsl.flashtux.org), un progetto che si occupa appunto dello sviluppo di driver per modem che supportano PPPoATM.
Vi sono poi casi particolari, come ad esempio quello del modem Alcatel Speedtouch Home. Questo particolare modem consente di utilizzare sia PPPoE che PPPoATM, ma mentre nel primo caso occorre configurarlo come bridge e utilizzarlo come qualunque altro modem Ethernet, nel secondo caso occorre configurarlo come server PPtP (Point to Point tunneling Protocol, un protocollo ideato da Microsoft) e installare sulla macchina un client PPtP (http://pptpclient.sourceforge.net). Successivamente occorre configurare pppd perche’ utilizzi questo client per la connessione all’internet; si rimanda alla documentazione del pacchetto pptpclient per ulteriori dettagli sulla configurazione di pppd.
Script accessori
Oltre ai file che abbiamo gia’ menzionato esistono anche vari script che vengono invocati da pppd in diverse fasi della procedura di connessione. Fra questi vi sono, ad esempio, /etc/ppp/ip-up e /etc/ppp/ip-down, che vengono eseguiti rispettivamente nel momento in cui e’ disponibile il collegamento e nel momento in cui questo cessa di esistere. Questi script vengono eseguiti in un ambiente impostato specificamente per essi e contenente solo le variabili necessarie piu’ altre variabili contenenti parametri relativi al collegamento in funzione.
Mediante questi file possiamo automatizzare lo svolgimento di alcuni compiti, come ad esempio il prelevamento di posta da un server pop3 remoto, lo svuotamento della coda di messaggi del nostro server di posta, la sincronizzazione dell’orologio di sistema con un time server, e cosi’ via. E’ sufficiente creare questi file e scriverci dentro tutti i comandi che vogliamo vengano eseguiti.
Le funzionalita’ di pppd lo rendono un software veramente molto flessibile, in grado di soddisfare praticamente qualsiasi nostra esigenza. E’ possibile ad esempio sfruttare la funzionalita’ di multilink moltiplicando la larghezza di banda a nostra disposizione tramite lo sfruttamento contemporaneo di piu’ modem, o utilizzare la capacita’ di pppd di avviare autonomamente una connessione solo quando viene richiesto un accesso all’esterno, salvo poi interromperla nel caso che non venga utilizzata per un certo periodo di tempo.
Se si sono creati i file necessari in /etc/ppp/peers, e si sono inserite tutte le necessarie opzioni nei vari file di configurazione, per lanciare la connessione ad Internet sara’ sufficiente utilizzare il comando “pppd call nome_connessione“, dove nome_connessione deve corrispondere al nome di un file presente in /etc/ppp/peers. Naturalmente potremo facilmente associare il comando ad un’icona sul desktop, o ad una voce nel menu dell’ambiente grafico preferito. Nel momento in cui vorremo fermare il collegamento dovremo semplicemente “uccidere” il processo relativo al demone con il comando “killall pppd”.