Capitolo successivo Capitolo precedente Indice

62. PPP

Per poter utilizzare il protocollo PPP occorre avere compilato il kernel attivando la gestione della rete e del protocollo PPP.

Per verificare che il kernel riconosca il protocollo PPP occorre controllare che all'interno dei messaggi di avvio ciò sia indicato.

dmesg | less

Si dovrebbero poter leggere le righe seguenti:

PPP: version 2.2.0 (dynamic channel allocation)
PPP Dynamic channel allocation code copyright 1995 Caldera, Inc.
PPP line discipline registered.

62.1 Strumenti necessari

Per ottenere una connessione PPP attraverso una linea commutata occorre il daemon pppd e il programma chat per instaurare la connessione.

# chat

chat [<opzioni>] [<script>]

Il programma chat permette di definire una comunicazione tra il computer e il modem. Il suo scopo principale è quello di stabilire una connessione tra il daemon pppd ( pppd) locale e quello di un computer remoto.

Opzioni

-f <chat-file>

Con questa indicazione, chat legge il chat script (lo script di colloquio) dal file indicato. L'uso di questa opzione esclude l'indicazione dello script sulla riga di comando. Il file può contenere più righe, le stringhe possono essere separate utilizzando spazi o tabulazioni.

-t <timeout>

Fissa il valore del timeout, cioè del tempo massimo di attesa per la ricezione di una stringa.

-r <report-file>

Definisce il nome del file per contenere il rapporto quando viene utilizzata la parola chiave REPORT. Se non viene specificato questo file viene utilizzato lo standard error.

-v

Attiva la modalità dettagliata per cui viene utilizzato il log di sistema per registrare i messaggi di chat.

-V

Attiva la modalità dettagliata nello standard error. In tal modo possono essere visualizzati sulla console i messaggi che intercorrono tra chat ed il modem. Questa opzione non funzionerà come previsto se lo standard error è ridiretto altrove, per esempio quando chat viene eseguito da pppd in modalità detached.

script

Se non viene specificato un file di script attraverso l'opzione -f questo deve essere fornito nella riga di comando, molto probabilmente anche racchiuso tra virgolette per permettere l'inserimento di spazi.

Chat script

Lo script di colloquio definisce la comunicazione. Lo script consiste di una o più coppie di stringhe di attesa-invio separate da spazi, con una coppia di stringhe opzionale subattesa-subinvio separate da un trattino. Per esempio:

ogin:-BREAK-ogin: paperino ssword: sfortuna

indica che chat si aspetta di ricevere la stringa ogin:. Se ciò non avviene entro il tempo del timeout stabilito, invia una sequenza di interruzione (break) al sistema remoto e quindi attende di nuovo la stringa ogin:. Se la stringa ogin: viene ricevuta già la prima volta, la sequenza di interruzione non viene generata. Se fallisce anche la seconda volta l'attesa, chat termina l'esecuzione. Quando chat ha ricevuto la stringa ogin: invia la stringa paperino e quindi si mette in attesa di ricevere la stringa ssword:. Quando la riceve invia la stringa sfortuna. Alla fine di ogni stringa trasmessa da chat viene aggiunto un ritorno a carrello (<CR>). Al contrario, per indicare che si attende un codice di ritorno a carrello, si utilizza la sequenza \r.

Il motivo per il quale si indica solo la parte finale delle stringhe di identificazione è che in questo modo si possono ignorare le parti di stringa superflue che potrebbero anche essere giunte alterate. Uno esempio molto simile al precedente potrebbe essere:

ogin:--ogin: paperino ssword: sfortuna

In questo caso, se non si riceve la stringa ogin: al primo tentativo, chat invia un semplice ritorno a carrello e quindi attende ancora una volta.

ABORT - stringhe di interruzione

Le stringhe di interruzione permettono di interrompere la comunicazione quando il modem restituisce una parola chiave particolare. Per esempio:

ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ATDT123456 CONNECT

questa sequenza non attende nulla (i due apostrofi delimitano una stringa nulla ed è quel ``nulla'' che si attende), e quindi invia la stringa ATZ. La risposta attesa è la stringa OK. Quindi invia ATDT123456 e attende CONNECT. Quando viene ricevuta anche questa ultima stringa, lo script prosegue. Se però, in qualunque momento, il modem restituisce una delle stringhe BUSY o NO CARRIER, l'esecuzione dello script viene interrotto.

REPORT - stringhe di rapporto

Le stringhe di rapporto permettono di registrare nel file di rapporto (-r) gli eventi specificati. Per esempio:

REPORT CONNECT ABORT BUSY '' ATZ OK ATDT123456 CONNECT

questa sequenza non attende nulla (i due apostrofi delimitano una stringa nulla ed è quel ``nulla'' che si attende), e quindi invia la stringa ATZ. La risposta attesa è la stringa ``OK''. Quindi invia ATDT123456 e attende CONNECT. Quando viene ricevuta anche questa ultima stringa, lo script prosegue, e in più viene scritto all'interno del file di rapporto la parola CONNECT seguita da tutto quello che il modem ha inviato insieme fino al raggiungimento del carattere di ritorno a carrello.

TIMEOUT - tempo massimo

Il timeout iniziale è di 45 secondi e può essere cambiato utilizzando il parametro -t oppure durante l'esecuzione dello script. Per esempio:

'' ATZ OK ATDT123456 CONNECT TIMEOUT 10 ogin:--ogin: paperino TIMEOUT 5 ssword: sfortuna

prima di attendere l'invito del login viene cambiato il timeout a 10 secondi, e prima di attendere l'invito della password viene cambiato a 5 secondi. Quando viene cambiato il valore del timeout, questo resta così fino al prossimo cambiamento.

EOT - invio del codice di fine testo

Il simbolo di EOT può essere rappresentato con ^D. Quando si invia questo carattere, non viene aggiunto il ritorno a carrello, al contrario del solito.

BREAK - interruzione

La stringa speciale BREAK rappresenta un segnale speciale nella trasmissione. L'azione normale del modem ricevente questo segnale è quello di cambiare la velocità di trasmissione. La sequenza di interruzione può essere incorporata all'interno di una stringa utilizzando la sequenza \K.

Sequenze di escape - simboli speciali

''   ""

Una coppia di apici singoli o di apici doppi rappresenta la stringa vuota. Se viene inviata una stringa vuota, in pratica si invia solo un ritorno a carrello.

\b

Backspace.

\c

Elimina il carattere ritorno a carrello alla fine di una riga da trasmettere. È l'unico modo per evitare di trasmettere una stringa che non termini con il solito ritorno a carrello. Si utilizza alla fine della stringa da trasmettere e non vale per le stringhe da ricevere.

\d

Attende per un secondo. Vale solo per le stringhe da trasmettere.

\K

Inserisce un BREAK. Vale solo per le stringhe da trasmettere.

\n

Rappresenta un carattere newline o <LF>.

\N

Invia un carattere <NUL>. Vale solo per le stringhe da trasmettere.

\p

Esegue una pausa di 1/10 di secondo. Vale solo per le stringhe da trasmettere.

\q

Sopprime la scrittura della stringa nel log di sistema. Al suo posto appariranno alcuni punti interrogativi. Vale solo per le stringhe da trasmettere.

\r

Invia o attende un ritorno a carrello.

\s

Rappresenta uno spazio e può essere usato quando non si vuole usare la tecnica delle virgolette per racchiudere una stringa che contiene spazi.

\t

Invia o attende un carattere di tabulazione.

\\

Invia o attende un carattere \

\ooo

Rappresenta un carattere in notazione ottale. Alcuni simboli non possono essere ricevuti (attesi).

^x

Rappresenta una sequenza del tipo ^A, ^B, ^C ... Per esempio, ^Q rappresenta il codice <DC1> pari a 17 in decimale. Alcuni simboli non possono essere ricevuti (attesi).

Codici di uscita

0   Conclusione normale: lo script è stato eseguito senza problemi.

1   Almeno uno dei parametri non è valido.

2   Errore durante l'esecuzione: potrebbe trattarsi di un errore di lettura di un file, o la ricezione di un segnale di SIGINT.

3   Errore di timeout.

4   È stata ricevuta la prima delle stringhe indicata come condizione di interruzione (ABORT).

5   È stata ricevuta la seconda delle stringhe indicata come condizione di interruzione (ABORT).

6   È stata ricevuta la terza delle stringhe indicata come condizione di interruzione (ABORT).

7   È stata ricevuta la quarta delle stringhe indicata come condizione di interruzione (ABORT).

...

# pppd

pppd [<opzioni>] [<nome-del-terminale>] [<velocità>]

Il protocollo PPP (Point-to-Point) provvede a un metodo di trasmissione dei datagram attraverso collegamenti seriali tra due soli computer.

Alcune opzioni

<nome-del-terminale>

L'indicazione esplicita di questo argomento permette di definire il nome del dispositivo da utilizzare per la comunicazione.

<velocità>

È la velocità di trasmissione espressa semplicemente con un numero che rappresenta il numero di bps o bit per second. I valori utilizzabili dipendono molto anche dal sistema operativo utilizzato.

connect <comando>

Permette di utilizzare il comando, eventualmente espresso tra virgolette, per attivare la comunicazione attraverso la linea seriale. Di solito viene eseguito uno script che a sua volta utilizza il comando chat ( chat) per la connessione attraverso il modem su una linea commutata.

crtscts

Utilizza un controllo di flusso hardware, ovvero RTS/CTS.

modem

Abilita la gestione dei segnali di comunicazione per il modem.

xonxoff | -crtscts

Utilizza un controllo di flusso software, ovvero XON/XOFF.

local

Disabilita la gestione dei segnali di comunicazione per il modem.

defaultroute

Quando la connessione tra i due computer ai due lati del collegamento seriale è avvenuta, aggiunge un percorso di instradamento predefinito (default route) alla tabella di instradamento di sistema utilizzando il computer peer (quello dall'altra parte del filo) come router. Questo percorso di instradamento viene rimosso dalla tabella di instradamento di sistema quando la connessione PPP viene interrotta.

disconnect <comando>

Esegue il comando o lo script indicato, eventualmente tra virgolette, subito dopo la fine della connessione. Ciò può essere utile per esempio per inviare al modem un comando di aggancio (hung up) se la connessione fisica con il modem non consente di inviare i segnali di controllo necessari.

mru n

Fissa il valore dell'MRU (Maximum Receive Unit) al valore di n. pppd richiederà al computer peer di utilizzare pacchetti di dimensione non superiore a questo valore. Il valore minimo teorico è 128, il valore predefinito è 1500.

netmask <maschera-di-rete>

Fissa il valore della maschera di rete per la comunicazione con il computer peer. Il valore viene indicato secondo la notazione decimale puntata.

passive

Abilita la modalità passiva per mezzo della quale, pppd tenta inizialmente di connetersi al computer peer e se non riceve alcuna risposta, resta in attesa passiva di una richiesta di connessione da parte del computer che prima non aveva risposto. Normalmente questa modalità non è attiva e di conseguenza pppd termina la sua esecuzione quando non riceve risposta.

<indirizzo-IP-locale>:<indirizzo-IP-remoto>

Permette di stabilire l'indirizzo locale e/o quello del computer peer remoto. Gli indirizzi possono essere forniti in notazione decimale puntata o in forma di nome. Il valore predefinito dell'indirizzo del computer locale è il primo indirizzo IP del sistema, a meno che non sia stata indicata l'opzione noipdefault. Il valore predefinito dell'indirizzo del computer peer remoto viene ottenuto dal computer remoto stesso se non viene indicato esplicitamente in alcuna opzione. Generalmente, l'indicazione di questi indirizzi non è necessaria.

Le opzioni possono anche essere fornite a pppd attraverso un file di testo. pppd prima di analizzare la linea di comando fornitagli, analizza i file /etc/ppp/options e ~/.ppprc. Questo file viene interpretato scomponendolo in una serie di parole divise da uno spazio bianco. Se all'interno delle opzioni devono essere forniti degli spazi, questi devono essere racchiusi tra virgolette. Il simbolo di \ (barra rovescia) serve per evitare di tradurre il carattere che lo segue (per esempio \" rappresenta un doppio apice che non serve per delimitare). Il simbolo # (hash o cancelletto) indica un commento fino alla fine della riga.

62.2 Client PPP personale

Per potersi connettere a un ISP (Internet Service Provider) attraverso un modem con il protocollo PPP occorre configurare opportunamente il proprio sistema.

Gli indirizzi locali

Se si utilizza il proprio computer all'interno di una rete locale, si devono utilizzare indirizzi IP che non vadano in conflitto con quelli utilizzati nella rete esterna Internet.

Di solito, per questo si usano gli indirizzi della classe C destinati appositamente all'utilizzo nelle reti locali i cui computer non devono essere accessibili da parte della rete Internet: da 192.168.0.0 a 192.168.255.255.

DNS

Dovendo accedere alla rete esterna Internet, un problema importante è costituito dalla risoluzione dei nomi. Se si utilizza il proprio computer per accedere a Internet, è molto probabile che non si disponga di una un server locale per la risoluzione dei nomi (name server), al massimo si utilizza il file /etc/hosts con l'elenco dei computer locali. Per non perdere la possibilità di comunicare con la propria rete locale, pur potendo accedere a Internet occorre configurare il file /etc/host.conf ( host.conf) in modo da utilizzare prima il file /etc/hosts e quindi i DNS server.

order hosts,bind
multi on

Quindi occorre preparare il file /etc/resolv.conf ( resolv.conf) in modo da utilizzare i DNS server indicati dal proprio ISP. Segue un esempio con indirizzi inventati.

nameserver 195.345.145.15
nameserver 194.145.123.77

Se invece si desidera attivare localmente un name server si può vedere quanto trattato nel capitolo `DNS'.

Il sistema di posta

Quando si utilizza un ISP per accedere a Internet, di solito si ottiene un indirizzo di posta elettronica riferito a un computer dell'ISP e per acquisire la posta da quel computer si utilizza di solito popclient ( popclient) per trasferire la posta remota nel proprio sistema di posta locale.

Per l'invio della posta elettronica, la cosa cambia un po', nel senso che la gestione di questa richiede che sia configurata per utilizzare un name server. Alcune distribuzioni Linux consentono di scegliere il tipo di configurazione preferito, altre ne propongono solo uno.

Di conseguenza, se si utilizza una distribuzione in cui si propongono diverse configurazioni, è meglio scegliere quella che permette l'uso di un name server, nelle altre, è molto probabile che ciò sia già la modalità predefinita.

<!>   Quando si utilizza un sistema di gestione della posta attraverso un name server, è molto probabile che il recapito di questa all'interno della rete locale non possa funzionare se non si attiva un name server locale. Il capitolo `DNS' mostra una serie di esempi in cui alla fine si giunge alla soluzione di questo problema.

Script per la connessione

Per attivare la connessione occorre utilizzare il daemon pppd ( pppd), ma per farlo è meglio predisporre alcuni script o utilizzare un programma di interfaccia apposito.

Segue l'esempio di due script: il primo per la connessione, il secondo per la chiusura del collegamento. Questi script dovrebbero risiedere all'interno della propria directory home, protetti anche contro la lettura da parte degli altri utenti, perché contengono già tutto ciò che serve per la connessione con l'ISP, password inclusa.

<!>   Perché la connessione possa avvenire, è necessario che l'utente che la effettua abbia i privilegi necessari per utilizzare il file di dispositivo riferito alla interfaccia cui è connesso il modem.

#!/bin/bash
#======================================================================
# ~/ppp-connetti
#
# Attiva la connessione al proprio ISP attraverso pppd e chat.
#
# Questo script è molto semplificato rispetto a quelli standard.
# Il problema sta nel fatto che molto dipende da come si
# comporta il computer dell'ISP.
# In questo esempio, in particolare, alla fine dello script di
# chat, viene inviato un ritorno a carrello senza il quale la
# connessione non avviene.
#
# Si presume che la connessione avvenga utilizzando il dispositivo
# "ppp0".
#
# Questo script non utilizza alcun argomento dalla riga di comando.
#======================================================================

#======================================================================
# Variabili.
#======================================================================

    #------------------------------------------------------------------
    # Indirizzo del ISP (Internet Service Provider).
    # In teoria, non è necessario indicare l'indirizzo IP del
    # computer remoto. Se non funziona, occorre indicarlo.
    #------------------------------------------------------------------
    IP_ISP="0.0.0.0"
    #------------------------------------------------------------------
    # Indirizzo del proprio computer.
    # L'indirizzo IP del proprio computer non deve essere indicato,
    # a meno che non sia stato deciso diversamente con il proprio ISP.
    # Infatti, di solito viene assegnato l'indirizzo locale in
    # maniera dinamica.
    #------------------------------------------------------------------
    IP_LOCALE="0.0.0.0"
    #------------------------------------------------------------------
    # La porta di comunicazione utilizzata per il modem.
    # In questo caso è la seconda porta seriale.
    #------------------------------------------------------------------
    DISPOSITIVO="/dev/cua1"
    #------------------------------------------------------------------
    # Velocità massima di trasmissione.
    #------------------------------------------------------------------
    VELOCITA="38400"
    #------------------------------------------------------------------
    # Il numero di telefono dell'ISP.
    #------------------------------------------------------------------
    TELEFONO="123456"
    #------------------------------------------------------------------
    # Il nome utente utilizzato per accedere al computer dell'ISP.
    #------------------------------------------------------------------
    PPP_ACCOUNT="paperino"
    #------------------------------------------------------------------
    # La password per accedere.
    #------------------------------------------------------------------
    PPP_PASSWORD="sfortuna"

#======================================================================
# Inizio.
#======================================================================

    #------------------------------------------------------------------
    # Prima di iniziare si controlla che non sia già attiva una
    # connessione con la periferia "ppp0" che sta a indicare
    # una connessione PPP.
    #------------------------------------------------------------------
    if `/sbin/ifconfig | grep "ppp0" > /dev/null`
    then
        #--------------------------------------------------------------
        # Esiste già una connessione con "ppp0", quindi non si può
        # procedere (si interrompe lo script).
        #--------------------------------------------------------------
        echo "È già attiva una connessione con ppp0"
        exit 1
    fi
    #------------------------------------------------------------------
    # Viene attivato pppd con l'aiuto di chat.
    # In particolare, chat esegue le seguenti operazioni:
    #  - imposta il tempo di attesa a 3 secondi;
    #  - interrompe in caso di messaggio ABORT
    #  - interrompe in caso di messaggio NO CARRIER;
    #  - senza attendere, richiede il prelievo della configurazione del
    #    modem;
    #  - dopo l'OK invia la richiesta di composizione del numero
    #    telefonico;
    #  - cambia il tempo di attesa portandolo a 30 secondi;
    #  - attende CONNECT e quindi invia un ritorno a carrello;
    #  - attende la richiesta di login e invia il nome dell'utente;
    #  - attende la richiesta della password e invia la password;
    #  - senza attendere invia un ritorno a carrello.
    #------------------------------------------------------------------
    /usr/sbin/pppd \
connect "/usr/sbin/chat -v \
TIMEOUT      3 \
ABORT        BUSY \
ABORT        'NO CARRIER' \
''           ATZ \
OK           ATDT,$TELEFONO \
TIMEOUT      30 \
CONNECT      '' \
ogin:--ogin: $PPP_ACCOUNT \
word:        $PPP_PASSWORD \
''           ''  " \
crtscts modem \
defaultroute \
$IP_LOCALE:$IP_ISP \
$DISPOSITIVO \
$VELOCITA

#======================================================================
# Fine.
#======================================================================

#!/bin/sh
#======================================================================
# ~/ppp-chiudi
#
# Chiude la connessione inviando un segnale di SIGINT a "ppp0".
#
# Questo script non utilizza alcun argomento dalla riga di comando.
#======================================================================

#======================================================================
# Inizio.
#======================================================================

    kill -INT `cat /var/run/ppp0.pid`

#======================================================================
# Fine.
#======================================================================

Prima di poter eseguire uno script è importante ricordare di attribuirgli i permessi di esecuzione necessari.

chmod +x <nome-del-file>

Verifica della connessione

Il modo migliore per verificare che la connessione funzioni è quello di inviare un ping a qualche computer remoto conosciuto.

Inizialmente verso i computer DNS server. In questo caso l'indirizzo è specificato in forma numerica (notazione decimale puntata). Se rispondono, si può provare a fare la stessa cosa verso un altro computer utilizzando un indirizzo normale cioè fatto di nome e dominio.

 

1997.10.26 - Scritto da Daniele Giacomini   daniele@calion.com   (vedi copyright: Appunti Linux).


Capitolo successivo Capitolo precedente Indice