[precedente] Trucco HW - Copertina - Data e ora [successivo]

Articoli


ISDN e Linux

Siamo nel 1998, Telecom ha perso il monopolio della telefonia, la concorrenza incalza, i prezzi scendono e finalmente possiamo farci installare una linea ISDN a casa nostra senza per questo fare un mutuo in banca.

Scherzi a parte, se l'installazione di una linea ISDN è diventata un'alternativa appetibile per usi domestici, è senza dubbio una soluzione ottima per la connettività professionale.

I vantaggi non sono legati solo ai 64Kbs reali di un canale dati, ma ad una serie di funzionalità tipiche di ISDN (e del software annesso) quali la possibilità di callback, effettiva del timeout con redialing automatico, sicurezza, unione di canali dati per aumentare la banda, ecc.

In questo articolo si parlerà di ISDN e di come installare una scheda Teles su un pc Linux, con qualche allegra disquisizione sul protocollo PPP e compagnia:



ISDN questa sconosciuta

Due parole su ISDN, tanto per capire di cosa stiamo parlando.

L'installazione di ISDN, o la trasformazione di una linea normale, consiste nell'installazione di una presa terminale, orrendamente chiamata borchia. Nella fornitura base (la cosiddetta BRI) sono previsti due canali dati a 64Kbs (chiamati canali B1 e B2) ed un canale voce (chiamato D).

In realtà il canale voce è un altro canale dati (8kB/s), che viene usato per la fonia.

Sulla borchia vi sono due prese alle quali potete collegare le apparecchiature ISDN, cioè telefoni, modem e schede di rete. Non potete connettere apparecchi analogici, come il vostro vecchio telefono, ad una borchia standard. Se non volete spendere un paio di centoni per un telefono ISDN, richiedete la borchia PLUS, che ha anche un paio di prese analogiche (ma questo ve lo dice anche il commerciale Telecom).

Quello che non è sempre chiaro è che indipendentemente dal tipo di borchia installata avete sempre la divisione tra canali dati e canale fonia. In altre parole, mentre usate i canali dati per una connessione il telefono continua a rimanere disponibile.

Ad una fornitura base ISDN potete fare assegnare più di un numero di telefono, quelli che in termini tecnici vengono chiamati MSN. Anche in questo caso questa possibilità va sfruttata solo se serve, ad esempio per tenere separato il numero "di casa" da quello di lavoro. Quello che non sono riuscito a farmi dire da Telecom, e che poi ho scoperto per conto mio, è che non serve avere due numeri di telefono per gestire in modo separato la fonia dalla trasmissione dati: il protocollo ISDN infatti distingue in modo autonomo le chiamate dati da quelle fonia, quindi un numero di solito basta ed avanza.



ISDN e Linux

Iniziamo subito con un distinguo. Ci sono essenzialmente due motivi per usare ISDN: connettersi con un provider (tipico uso domestico), connettersi con una rete privata (tipico uso professionale). O entrambe le cose, ovviamente.

Il distinguo è necessario perché anche se la cosa non ha ripercussioni per quanto riguarda la configurazione hardware ne ha invece relativamente alla configurazione del software usato per la connessione.

Nel resto di questo articolo spiegherò come configurare Linux per il secondo tipo di connessione (io uso la mia Linux box per collegarmi da casa alla nostra rete in ufficio). Non vi sono grandi differenze tra i due tipi di configurazione, ma personalmente ho provato solo quest'ultima, e non essendo un esperto di reti non potrò dilungarmi molto riguardo alla prima.

Essenzialmente le differenze sono che nel secondo caso l'identità del chiamante (io) è certa, quindi è possibile configurare il software con un certo grado di autonomia riguardo, ad esempio, gli indirizzi, l'instradamento, l'attivazione del timeout, ecc.

Nel primo caso invece è solo l'identità del provider ad essere certa, noi per il provider siamo "uno come tanti", quindi sarà quest'ultimo ad imporci una serie di opzioni per la configurazione del software. Inoltre l'approccio alla connessione può variare da provider a provider, e questo implica correzioni ed aggiustamenti alla nostra configurazione.

Aggiungo anche che le cose si complicano se avete intenzione di collegarvi a più di un provider (o a più di un sistema): l'esempio che porterò in questo articolo, con relativi script, si basa sull'esigenza di connettersi ad un solo server remoto. Chiunque abbia però bisogni differenti può divertirsi creando configurazioni alternative.



L'hardware (ma quanto è hard?)

In ufficio abbiamo provato un modem ISDN: questi marchingegni sono in grado di colloquiare da una parte con la borchia, mentre dall'altra parte parlano attraverso la classica seriale con il nostro pc, facendogli credere di essere un modem hayes-compatibile.

Anche se l'approccio è molto comodo (non c'è da configurare nulla di strano sul pc) per quanto abbiamo potuto vedere si perdono totalmente i vantaggi di una linea ISDN, banda passante a parte. Inoltre non abbiamo ben capito come usarlo se dall'altra parte non c'è un altro modem, ma una scheda ISDN vera e propria. In ogni caso mi sento di sconsigliare un acquisto di questo tipo, a meno che non siate un provider ed abbiate l'esigenza di rispondere "ISDN" se chiama un altro ISDN, e "sono un modem!" se chiama un tradizionale modem analogico.

Per le nostre Linux box abbiamo scelto una scheda Teles. È un'adattatore molto semplice, prodotto in Germania, basato su integrati Siemens. Il costo è abbastanza contenuto, intorno alle 300 mila lire.

Fate attenzione a non acquistare la versione PnP (il famigerato Plug-and-Pray), ma quella normale. L'ideale è la Teles 16.3.

L'installazione fisica della scheda è banale, occorre semplicemente uno slot ISA libero, non vi sono jumper da impostare, e l'unica uscita della scheda è la presa per il cavo ISDN.



Configurazione del Kernel (ohi, che dolor!)

I driver necessari alla gestione della Teles sono già presenti nel kernel (almeno in quelli recenti, noi stiamo usando la 2.0.32).
Nei vecchi kernel il driver della Teles si chiamava, appunto, teles. Nei nuovi kernel questo driver è stato sostituito da hisax, uno più generico che gestisce il chipset Siemens utilizzato (anche) dalla Teles.

Per attivare la gestione di ISDN dovete avere installato, ovviamente, i sorgenti del kernel. Se non lo avete ancora fatto date un'occhiata agli HOWTO su come procurarseli ed installarli. Nella maggior parte delle distribuzioni i sorgenti sono sul cd di installazione.

Eseguite quindi il vostro "make menuconfig" (o make xconfig se siete in ambiente X, o make config se siete masochisti), ed attivate quindi queste opzioni:

Due righe di spiegazione, che non fanno mai male:

Il PPP è il protocollo point-to-point. Una PPP è una connessione TCP/IP particolare che mette in comunicazione diretta una macchina (con un certo indirizzo) con un'altra macchina (con un altro indizzo). In pratica è il contrario di una rete, dove diverse macchine sono visibili sulla stessa rete. Gli indirizzi usati per una connessione PPP non hanno nulla a che vedere, di solito, con quello assegnato alle macchine sulla rete locale (se esiste) perché il protocollo IP prevede che ogni interfaccia di rete abbia un numero diverso.

La compressione VJ è un algoritmo BSD che serve a comprimere l'header dei pacchetti TCP nel protocollo PPP. Non è detto che ne abbiate bisogno, dipende se il server al quale dovete collegarvi la richiede o meno. Nel dubbio attiviamone il supporto nel kernel.

L'opzione "synchronous PPP" indica un tipo particolare di PPP utilizzato spesso per ISDN al posto di quello asincrono, tipico delle connessioni PPP su linea seriale.

Il supporto per "generic MP" sta per MultiPoint, ed indica la possibilità di sfruttare i due canali B insieme per raggiungere una banda passante di 128KB/s. Lasciatelo attivo per ora, anche se non pensate di usarlo non ha conseguenze negative.

Il supporto per "Audio" dà la possibilità di utilizzare la vostra macchina Linux come segreteria telefonica, se avete voglia di fare esperimenti configurando programmi avanti ed indietro, beninteso. È da notare che solo il driver hisax supporta questa possibilità. Anche in questo caso potete lasciare attivata l'opzione anche se non pensate di utilizzarla.

Il protocollo "EURO" è quello utilizzato da ISDN della Telecom: anche se fisicamente il trasporto ISDN è praticamente uguale in tutto il mondo, il protocollo utilizzato varia da paese a paese. Quello usato in Italia è un EURO "italiano", che differisce tuttavia da quello standard "EURO" solo per una serie di servizi specifici che non hanno influenza sulla gestione di ISDN da parte del kernel Linux.

I driver vanno caricati come moduli: in questo modo è possibile specificare agevolmente parametri per la configurazione (come è il caso del driver hisax). Inoltre il driver "PPP" deve obbligatoriamente essere caricato come modulo se si utilizzana la compressione VJ.

Altre due parole sui moduli: sono una gran bella invenzione, ed in teoria dovrebbe essere possibile attivare o disattivare la gestione di un driver nel kernel senza dover ricompilare tutto quanto. In pratica le cose vanno diversamente. Se volete essere sicuri che tutto venga ricompilato in modo corretto, dopo ogni cambiamento alla configurazione del kernel eseguite sempre in sequenza i seguenti comandi, applicando le modifiche necessare per la vostra macchina:

cioè ricompilate sempre tutto da zero, rimuovete i moduli precedentemte installati sotto la directory /lib/modules/ (perché il make module_install non rimuove i moduli preinstallati, si limita a ricoprirli con quelli nuovi), e reinstallate quelli appena ricompilati (per i dettagli sul build del kernel date un'occhiata agli HOWTO).

In particolare, evitate accuratamente di togliere il supporto per IPX e per Appletalk tra i moduli nella sezione "Networking options". Anche se non li usate, toglierli significa ritrovarsi con una marea di messaggi a proposito di simoboli non risolti al prossimo avvio del sistema.



Configurazione del software

Innanzitutto per la gestione della scheda vi serve il pacchetto dei programmi di utilità: isdn4k-utils.

Questa è la versione 2.1b2-1, se siete su un sistema che supporta rpm (come RedHat) installatela con

Tra le varie cose contenute in questo pacchetto vi sono il comando isdnctrl che serve a configurare e manipolare il driver isdn, e il programma ipppd, che serve a gestire il PPP sincrono.

Oltre a questo pacchetto dovrete creare un paio di script, oppure scaricare quello che ho preparato e impacchettato in questo tar: isdnscripts.tar.gz, modificandoli per le vostre esigenze.

L'approccio che ho seguito (relativo alla configurazione di sistema come definita da RedHat) è questo:

Dopo aver modificato in modo opportuno il file di configurazione isdn.cfg basterà lanciare (come utente root)

per attivare il supporto isdn, creando la relativa interfaccia di rete point-to-point. Allo stesso modo il comando rimuove l'interfaccia di rete e i moduli dal kernel, togliendo così il supporto isdn. Anche se può sembrare assurda questa ultima possibilità ricordo che la norma per gli script che attivano servizi al boot stabilisce che prevedano sia la loro attivazione (start) che la loro disattivazione (stop) al momento dello shutdown, anche se di fatto questa non fa nulla di pratico.

Inoltre questo ci permetterà di attivare/disattivare manualmente il supporto isdn ogni volta che lo desideriamo, cosa utilissima durante la fase di configurazione e di testing.



Configurazione del software: i parametri in isdn.cfg

Passiamo perciò all'azione. Questo è il contenuto del file isdn.cfg:

A parte la variabile ENABLE_ISDN che sarà sempre "yes" (è lì solo perché per fare esperimenti volevo attivare o disattivare al boot il supporto isdn senza dover pasticciare troppo con i file di configurazione), queste sono le informazioni che passiamo o al modulo hisax o ai comandi isdnctrl e ifconfig per abilitare isdn:

HISAX_INTR

HISAX_ADDR

HISAX_DEBUG

LOCAL_IP

LOCAL_DIAL

REMOTE_IP

REMOTE_DIAL

REMOTE_BACK

REMOTE_MASK



Configurazione del software: parametri in ioptions

Il processo ipppd, gestore del protocollo PPP sincrono, usa per default il file di configurazione /etc/ppp/ioptions, controparte del file options usato da pppd, il gestore del protocollo PPP asincrono:

   name ilmiopc
   user pluto
   ipcp-accept-local
   ipcp-accept-remote
   noipdefault
   defaultroute
   lock
   mru 1500
   mtu 1500
   -vj
   #-detach
   #debug
   #kdebug 25
   #netmask 255.255.255.240
   #domain	lapam.mo.it

Questo file va modificato in accordo alle proprie esigenze, probabilmente le uniche cose da modificare saranno il nome della vostra macchina (l'opzione name) e il nome dell'utente (l'opzione user). Quest'ultimo, ovviamente, non è il nome che usate per collegarvi sulla macchina ma quello richiesto dal server per il collegamento.

Le tre righe seguenti (ipcp-accept-default, ipcp-accept-remote, noipdefault) servono ad abilitare la gestione dell'assegnazione dinamica di un indirizzo: indipendentemente da quello che abbiamo usato per definire l'interfaccia point-to-point, al momento della connessione ipppd si occupa di riassegnare una nuova coppia di indirizzi fornita dal server. La direttiva defaultroute forza ipppd a redirigere il routing di default verso i nuovi indirizzi: in questo modo tutte le richieste verso indirizzi non appartenenti al nostro network verranno passate automaticamente all'interfaccia point-to-point isdn.

L'istruzione lock istruisce ipppd ad usare il sistema di bloccaggio della periferica (nel nostro caso /dev/ippp0) tramite un file di lock per impedire accessi multipli indesiderati sulla stessa porta.

La coppia mru e mtu indicano le dimensioni massime dei pacchetti inviati attraverso la connessione, rispettivamente per la ricezione e per la trasmissione. Quelli specificati sono i valori predefiniti. La possibilità di cambiare questi due parametri ha senso su connessioni via modem, dove può essere utile ridurre le dimensioni dei pacchetti su linee disturbate. Su una linea ISDN non ha molto senso. Li ho lasciati, però, per un motivo: può essere che il server richieda una dimensione dei pacchetti non standard, e che rifiuti una connessione con pacchetti di dimensioni diverse da quelle richieste, quindi dovranno essere modificati di conseguenza.

L'istruzione -vj indica che il nostro ipppd si rifiuta di utilizzare la compressione VJ sui pacchetti tcp/ip. Questa opzione deve essere abilitata o meno in relazione al server remoto.

Per quanto riguarda le istruzioni di -detach, debug, kdebug (qui commentate) saremmo tutti felici se non avessimo la necessità di abilitarle, perché vorrebbe dire che tutto ha funzionato al primo colpo. In caso contrario uno sguardo a /var/log/messages dopo averle abilitate può aiutarci a capire cosa c'è che non funziona (per dettagli sul debugging del PPP guardate il PPP-HOWTO).

Uno sguardo alle ultime due righe: non dovrebbe esserci la necessità di specificare in chiaro la netmask dell'interfaccia e il dominio di appartenenza della vostra macchina Linux dopo che la connessione è stata attivata, in quanto sono informazioni la cui gestione dovrebbe essere di competenza del server remoto. Anche in questo caso, però, possono esserci situazioni nelle quali è richiesta una forzatura. Consiglio ancora di dare un'occhiata al PPP-HOWTO per una panoramica delle opzioni, tenendo conto del fatto che non tutte quelle previste per pppd hanno senso o sono utili per ipppd, molte sono inutili perché riferite specificatamente alla gestione delle linee seriali e commutate.



Configurazione del software: parametri in pap-secrets

Configuriamo infine l'ultimo aspetto di una connessione PPP, ovvero le presentazioni al padrone di casa. Vi sono due protocolli, il PAP ed il CHAP. Quello usato di norma è il PAP, che richiede un file, /etc/ppp/pap-secrets, con la definizione delle password utilizzate per le connessioni:

   # Secrets for authentication using PAP
   # client     server  secret			IP addresses
   #
   ilmiopc           *  lamiapassword

È possibile specificare in chiaro il nome del server remoto, questo serve per poter gestire connessioni diversificate. Se il server al quale ci colleghiamo è uno solo, o se la password usata per tutti i server è sempre la stessa (più improbabile), possiamo usare la notazione che vediamo nell'esempio, specificare cioè un asterisco al posto del nome del server.

Il protocollo CHAP è leggermente più complesso: mentre PAP richiede solo a noi di autenticarci presso il server remoto, CHAP richiede sia questo che l'autenticazione del server remoto. Immagino che CHAP sia stato implementato da persone particolamente paranoiche, è come se in banca, alla richiesta dell'impiegato allo sportello di presentare la nostra carta di identità, rispondessimo "ok, questa è la mia, mi fa vedere la sua?".

Anche in questo caso, nell'improbabile ipotesi che sia richiesto CHAP, il PPP-HOWTO indica i semplici passi da fare per abilitarlo.



Configurazione del software: lo script "isdn"

Commenterò ora alcune parti dello script isdn, quelle relative al setup del modulo HiSax, e della configurazione della porta isdn eseguite con isdn start:

    modprobe hisax type=3 protocol=2 io=$HISAX_ADDR irq=$HISAX_INTR id=HiSax

Il comando modprobe viene usato da Linux per tentare il caricamento del modulo specificato. Al posto di modprobe potreste usare il comando insmod che ha una sintassi simile, l'unica differenza sta nel fatto che modprobe gestisce la dipendenza tra i moduli mentre insmod non lo fa.

Come possiamo vedere è qui che indichiamo al modulo quale interrupt e quale porta di i/o utilizzare. Vengono indicati anche il tipo (3 sta per Teles 16.3, ricordo che il modulo HiSax serve a gestire diverse schede tutte basate sul chipset Siemens hisax) e il protocollo da utilizzare per il canale D, che è quello che distingue i vari tipi di ISDN nei diversi paesi (3 sta per EURO/DSS1).

La parte seguente configura il comportamento della scheda. Le possibilità offere da una linea ISDN sono molte, l'esempio qui sotto è quello relativo all'uso minimale che si può fare di una linea digitale. È comunque quello che ci serve di solito:

   # setup isdn device, configure interface and routing
   #
   isdnctrl verbose    $HISAX_DEBUG
   isdnctrl addif      ippp0                      # create interface ippp0
   isdnctrl pppbind    ippp0 0
   isdnctrl addphone   ippp0 out     $REMOTE_DIAL # dial-out number
   isdnctrl addphone   ippp0 in      $REMOTE_BACK # remote callback
   isdnctrl addphone   ippp0 in      $LOCAL_DIAL  # my telephone no
   isdnctrl eaz        ippp0         $LOCAL_DIAL  # my MSN / EAZ
   isdnctrl huptimeout ippp0 $TIMEOUT
   isdnctrl secure     ippp0 on                   # nobody may enter
   isdnctrl l2_prot    ippp0 hdlc
   isdnctrl l3_prot    ippp0 trans
   isdnctrl encap      ippp0 syncppp
Con il comando isdnctrl andiamo a configurare il comportamento del driver. Innanzi tutto dobbiamo creare una interfaccia logica abbinata alla nostra scheda Teles, che sarà quella utilizzata poi per creare l'interfaccia di rete per la connessione point-to-point.

Tale interfaccia deve obbligatoriamente chiamarsi ippp0. Se avessimo più di una scheda isdn, o se volessimo configurare diverse interfaccie sulla stessa scheda (per connetterci a diversi sistemi) avremo una ippp1, una ippp2 e così via. Queste interfaccie corrispondono alle omonime periferiche residenti sotto /dev.

Senza entrare troppo nei dettagli vediamo che, utilizzando ripetutamente il comando isdnctrl impostiamo le caratteristiche che abbiamo descritto nel capitolo precedente, più una serie di altre come il rifiuto di colloquiare con numeri non elencati con "addphone" (il parametro "secure"), l'indicazione di quali protocolli interni utilizzare per la negoziazione al momento della connessione (l2 ed l3), e per ultimo l'incapsulamento, ovvero l'indicazione di quale protocollo di alto livello l'interfaccia dovrà usare per poter trasportare i pacchetti tcp/ip avanti ed indietro: come possiamo vedere abbiamo specificato syncppp, cioè il PPP sincrono.

Il PPP sincrono è l'unico che è possibile specificare qui, e la ragione è molto semplice. Se si vuole utilizzare un protocollo asincrono non c'è bisogno di pasticciare tanto con isdnctrl. Infatti, dato che il protocollo asincrono viene usato per le connessioni via seriale, basta il PPP standard di Linux.

In altre parole, usando il ppp asincrono utilizzate la vostra scheda Teles come se fosse un modem analogico, dovendo quindi passare attraverso la configurazione degli script di chat tipiche dei modem hayes-compatbili. Sotto /dev infatti troviamo una serie di devices ttyInn (notare la I maiuscola) che emulano una seriale connessa ad un modem standard. Tra parentesi questo vi permette di usare emulatori di terminali come seyon per connettervi a BBS, ecc.

Se invece dall'altra parte c'è un'altra scheda isdn (non necessariamente una Teles, ovviamente), usiamo il PPP sincrono.

Creiamo quindi una interfaccia di rete point-to-point con il comando ifconfig e lanciamo il daemon ipppd che gestisce le operazioni di connessione:

   # this enable autodialing
   #
   ifconfig ippp0 $LOCAL_IP pointopoint $REMOTE_IP netmask $REMOTE_MASK
   route add default ippp0
   ipppd /dev/ippp0 &

Possiamo notare che con route abbiamo istruito il nostro sistema a redirigere tutte le richieste tcp/ip che non appartengono al nostro network (cioe tutte se non siamo se nessun network) verso l'interfaccia di rete ippp0 che abbiamo appena configurato.



Configurazione del software: prove e debugging

Perfetto. Teniamo ora una finestra aperta sul file di messaggi della console, con un bel tail -f /var/log/messages e proviamo a vedere se siamo on-line: ping pluto.linux.it (ovviamente se il server a cui ci connettiamo ha un accesso ad internet, altrimenti possiamo provare a pingare il server stesso). Altre utili informazioni di debug possono essere ottenute attivando il comando tail -f /dev/isdninfo.

Se la scheda isdn sembra configurata correttamente ma incontrate problemi alla connessione con il server, provate ad attivare l'opzione di debug nel file /etc/ppp/ioptions, e lanciando a mano la composizione del numero remoto con isdnctrl dial ippp0 potrete controllare dai messaggi di console o della device isdn cosa succede. In casi estremi abilitate anche il "kdebug", per avere un debuf più dettagliato di cosa sta facendo ipppd.

Assicuratevi che il server remoto usi il PPP sincrono, se dall'altra parte non c'è una scheda isdn ma un modem seriale dovete usare il PPP asincrono sui device ttyI*.



Riferimenti, ringraziamenti, festeggiamenti

Innanzi tutto il PPP-HOWTO, ed eventualmente il NET-3-HOWTO se siete digiuni di reti e compagnia. Le pagine dei manuali di pppd, ipppd, isdnctrl, isdninfo.

Nella directory /usr/src/linux/Documentation/isdn troviamo molte cose utili.

Tra i siti con elenchi di risorse riguardanti ISDN per Linux questo è uno di quelli che più mi ha aiutato nella navigazione: ISDN for Linux. Se avete problemi a leggere documentazione in inglese potete tirare un sospiro di sollievo: per questo argomento il 90% della documentazione è... in tedesco!

Poi, ovviamente, c'è sempre il Pluto, al quale io stesso non ho esitato a rompere le scatole proprio su questo argomento (e loro mi hanno ripagato in questo modo, obbligandomi a scrivere questo articolo ... naaa, non è vero, in realtà mi sono divertito un mondo a farlo, e credo proprio che ripetereò l'esperienza in futuro).

Infine potete contattarmi via e-mail, kanna@lapam.mo.it, se trovo il tempo prometto di rispondere (le ultime parole famose). Non scrivetemi però per lamentarvi delle prossime bollette telefoniche, ho già mia moglie che assolve a questo ingrato compito, e che approfitto per ringraziare perché mi supporta e sopratutto mi sopporta nelle mie attività extra-lavorative.

di Lorenzo Canovi


[precedente] Trucco HW - Copertina - Data e ora [successivo]