Linux: Hit Zugang über pppd/chat

1 Einleitung

Ich beschreibe hier meine Erfahrung hinsichtlich des Zugangs zur Hit von einem Linux Rechner über pppd/chat mit Modem. Mit eventuell kleineren Änderungen werden die Skripte auch für ISDN Zugang benutzbar sein.

Als Alternative zu dem beschriebenen Weg kommt dip in Betracht. Wie man mit dip mit der Hit Kontakt aufnimmt, ist in der Internet-Fibel auf der Webseite des Handshake beschrieben (geringfügig veraltet hinsichtlich Telefonnummer und "slip" statt "ppp" Benutzung).

Als Erweiterung der Basisverbindung über pppd kann man an diald denken (automatischer Abbau länger unbenutzter Verbindungen und automatischer Wiederaufbau bei Bedarf). Ich selbst habe keine Erfahrung mit diald.

2 Hintergrund

Linux Rechner können PPP-Verbindungen über den PPP-Demon, pppd, aufbauen. pppd initialisiert das Modem (die ISDN-Karte), baut die Verbindung auf und veranlasst den Kern im Erfolgsfall eine IP und/oder IPX Verbindung zum PPP-Partner aufzubauen. Auf Wunsch wird eine Default-Route zu dem PPP-Partner eingerichtet: alle Pakete an Rechner, für die keine explizite Route bekannt ist, werden über diese Route weitergeleitet. Das ist sinnvoll für Internetbenutzung.

Für die Details der Modem-Initialisierung und des Anmeldens beim Online Dienstleister bedient sich pppd eines externen Shell-Kommandos. Meistens wird in diesem Kommando das Programm chat benutzt. chat wird kontrolliert durch ein chat Skript. Ein solches Skript besteht im wesentlichen aus einer Folge von "warte auf/sende" Sequenzen, etwa in der Form warte auf ogin: sende USER.

Nachdem die Verbindung aufgebaut ist, wird sie von pppd überwacht (genauer: offengehalten). Wenn der pppd Prozess beendet wird, wird die Verbindung abgebaut, das Modem legt auf. Geht umgekehrt die Verbindung verloren, etwa weil der Partner auflegt, beendet sich pppd normalerweise (sofern er nicht durch eine Option angewiesen wurde, es nicht zu tun).

Der Normalablauf für den Kontakt mit der Hit hat also die Schritte:

  1. Start von pppd zum Verbindungsaufbau mit der Hit
  2. Nutzen der IP-Verbindung, bis man keine Lust mehr hat
  3. Abbrechen des pppd Prozesses, die Verbindung wird abgebaut.
Da Schritte 1 und 3 wiederkehrende und nicht ganz unkomplizierte Kommandos beinhalten, gießt man sie zweckmäßig in up und down Skripte.

pppd und chat sind in der Linux-Dokumentation (man) detailliert beschrieben.

3 Das up Skript -- Verbindungsaufbau zur Hit

#! /bin/bash

#CHATDEBUG="-V -v"
#PPPDEBUG="debug"

TTY=`tty`
CHAT=~/scripts/handshake.chat

/usr/sbin/pppd /dev/modem 115200 \
    lock modem defaultroute crtscts -ipx-protocol bsdcomp 12 \
    connect "/usr/sbin/chat $CHATDEBUG -f $CHAT 2>$TTY"
ist ein einfaches Skript zum Verbindungsaufbau mit der Hit. Es setzt voraus, dass /dev/modem ein symbolischer Link auf Eurer Modem/ISDN-Device ist und dass das chat Skript in ~/scripts/handshake.chat liegt. Beides kann natürlich geändert werden.

Bei Problemen könnt Ihr die Zeilen mit den Debug-Definitionen durch Löschen des Kommentarzeichens aktivieren. pppd protokolliert in diesem Fall über syslog, d.h. Ihr findet die Meldungen in /var/log/messages. Die chat Meldungen sollten nach /var/log/messages und das Terminal gehen.

4 Das chat Skript -- Details der Anmeldung mit der Hit

ABORT	BUSY
ABORT	"NO DIALTONE"
ABORT	"NO CARRIER"
ABORT	ERROR
REPORT	CONNECT
TIMEOUT	5
""	ATZ
OK	ATDT0192378
TIMEOUT	60
CONNECT	""
TIMEOUT	15
ogin:--ogin: ppp-user
word: password
ist ein chat Skript das, abgelegt unter ~/scripts/handshake.chat, im obigen up Skript benutzt werden kann.

Die ABORT Zeilen definieren Fehlersituationen: sollte das Modem BUSY bis ERROR melden, wird sofort mit Fehler abgebrochen. Die REPORT Zeile legt fest, dass wir die connect-Information sehen möchten. Die TIMEOUT Zeilen verändern den Timeout, mit dem auf Antworten gewartet wird. Die übrigen Zeilen sind die "Warte auf/Sende" Paare. Die ATZ wartet auf nichts und sendet ATZ, das Modem wird initialisiert. Die nächste Zeile wartet auf OK (die Antwort des Modems auf die Initialisierung) und sendet die Telefonnummer. Dann wird auf CONNECT gewartet und nur ein Zeilenwechsel gesendet. Die nächste Regel ist etwas komplexer: es wird auf ogin: (für login:) gewartet. Kommt kein ogin: in der Timeout-Zeit an, wird der String zwischen den beiden - geschickt (es wird automatisch ein Zeilenvorschub angehängt, also tatsächlich ein weiterer Zeilenvorschub gesendet) und wieder auf ogin: gewartet. Im Erfolgsfall wird ppp-user geschickt, Eure Benutzerkennung für ppp Benutzung. Dann wird auf word: (für Password:) gewartet und password geschickt, Eurer Online-Kennwort.

Selbstverständlich müsst Ihr user und password durch Eure Benutzerkennung und Euer Online Kennwort ersetzen.

Achtung: Wenn Ihr in einer unsicheren Umgebung seid, solltet Ihr sicherstellen, dass das Skript nur von Euch gelesen werden kann. Wer es liest, erfährt Eure Handshake Anmeldeinformation und kann auf Eure Kosten surfen!

5 Das down Skript -- Verbindungsabbau

#!/bin/sh
# /etc/ppp/ppp-down
# (c) Klaus Franken, S.u.S.E. GmbH Fuerth, Germany
# 12.06.97, kfr@suse.de

DEVICE=ppp0
FILE=/var/run/$DEVICE.pid

if test -r $FILE ; then
        echo "Killing PPP: $DEVICE"
        kill -INT `cat $FILE`
        if test $? != 0; then
                echo "WARNING: stale pid file or pppd still running"
                echo "         please check by hand"
                rm -rf $FILE
                exit 1
        fi
else 
        echo "PPP not running on $DEVICE"
        exit 2
fi
exit 0
beendet den pppd Prozess und baut damit die Verbindung ab. Ihr seht, das Skript enthält nichts Handshake Spezifisches und kann für den Abbruch aller ppp0 Verbindungen genutzt werden. Es benutzt, dass pppd in der Datei /var/run/ppp0.pid seine Prozessnummer ablegt.

6 Etwas mehr Komfort

Das obige up Skript baut zwar eine Verbindung auf, aber es sagt nicht, wenn es damit fertig ist. Wenn man zu früh einen Kontakt versucht, erhält man eine hässliche Fehlermeldung: network is unreachable. Wen das stört, der kann fortschrittliche Möglichkeiten von pppd benutzen, um über den abgeschlossenen Aufbau informiert zu werden.

pppd ruft die Programme/Skripte /etc/ppp/ip-up und /etc/ppp/ip-down beim Auf- bzw. Abbbau einer IP-Verbindung auf, sofern sie existieren.

ACHTUNG: Diese Skripte werden als root ausgeführt. Sie stellen ein Sicherheitsrisiko dar. Ihr solltest sicherstellen, dass sie nur als root verändert/angelegt werden können, sofern Ihr in einer unsicheren Umgebung seid.

#! /bin/bash
FILE=/var/run/$1.ready

echo `date` $* > $FILE

legt die Datei /var/run/ppp0.ready an. Es kann als ip-up Skript verwendet werden.

#! /bin/bash
FILE=/var/run/$1.ready

/bin/rm -f $FILE

löscht die Datei /var/run/ppp0.ready. Es kann als ip-down Skript benutzt werden.

Sofern die Skripte entsprechend verwendet werden, ist im Normalfall (das heißt, wenn pppd nicht auf ungewöhnliche Weise beendet wurde und das ip-down Skript nicht ausgeführt werden konnte) die Existenz von /var/run/ppp0.ready ein Indiz dafür, dass eine IP-Verbindung besteht.

#! /bin/bash

#CHATDEBUG="-v -V"
#PPPDEBUG="debug"

BASE=/var/run/ppp0
TTY=`tty`
CHAT=~/scripts/handshake.chat

/usr/sbin/pppd /dev/modem 115200 \
    lock modem defaultroute crtscts -ipx-protocol bsdcomp 12 -detach \
    connect "/usr/sbin/chat $CHATDEBUG -f $CHAT 2>$TTY" &
PID=$!

while true; do
    if [ -f $BASE.ready ]; then exit 0; fi
    if kill -0 $PID; then sleep 2; continue; fi
    exit 1
done

ist ein erweitertes up Skript. Es nutzt dieses Indiz, um erst zurückzukehren, wenn die Verbindung steht, oder pppd sich wegen eines Fehlers beendet hat.

Wie oben erwähnt, dürfte diald wesentlich mehr Komfort bieten.

7 Fehler/Probleme

Natürlich können die Skripte noch Fehler enthalten. Bitte habt Verständnis, dass ich keinerlei Garantie übernehmen kann und die Benutzung vollständig auf Euer Risiko geht. Ich bin aber an Problemmeldungen interessiert und helfe Euch gerne bei der Analyse Eurer Probleme. Die Ergebnisse werden in eine Verbesserung der Skripte einfließen.


Dieter Maurer
Last modified: Tue Aug 10 11:09:59 CEST 1999