Einwahl mit Linux und ISDN4Linux

Torsten Hilbrich

Zusammenfassung:

Dieser Artikel beschreibt die Punkte, die auf meinem Rechner zur Konfiguration des IN-Zugangs per ISDN notwendig war.

Voraussetzungen

Bevor es an das Eingemachte geht, möchte ich gerne die Voraussetzungen beschreiben, die bei meiner Konfiguration gegeben ist. Ich habe 2 Arten von ISDN-Karten erfolgreich getestet, zum einen die Teles 16.3c PnP und die Elsa Quickstep 1000 PCI. Ich benutze jetzt letztere Karte, die erste war ein Leihexemplar gewesen.

An Kernelversionen habe ich 2.0.33 benutzt, inwzischen läuft das Ganze auch mit 2.0.35. Als Distribution benutze ich Debian Linux 2.0, der Einfluß der Distribution auf die Konfiguration ist aber nur marginal, da ich mit Bordmitteln von Debian die Konfiguration nicht hinbekam (sicher mein Fehler).

Gewisse Kerneleinstellungen wie z.B. IP-Forwarding-Support setze ich voraus, da diese für alle Dialup-Zugänge, egal ob PPP oder SyncPPP über ISDN, notwendig sind. Hinweise hierzu finden sich z.B. im PPP-Howto.

Treibereinbindung

Der erste große Schritt zur erfolgreichen Nutzung einer ISDN-Karte unter Linux ist die Einbindung und Konfiguration des entsprechenden Kerneltreibers. Hier beginnt schon das erste Problem, da die derzeit weitverbreiteten Karten nicht vo Hause aus von den aktuellen Userkernel (2.0.x) unterstützt werden. Also heißt es zuerst, die benötigte neuere Version der ISDN-Treiber zu besorgen. Die aktuelle HiSax-Version ist jeweils von ftp://ftp.franken.de/pub/isdn4linux erhältlich. Dort gibt es auch das Paket isdn4k-utils, dabei ist auf die korrekte Version (2.0) für die Userkernel zu achten.

Zur Einbindung der Treiber ist es am einfachsten, das /usr/src/linux/drivers/isdn komplett zu löschen und durch das aus dem Treiberpakt zu ersetzen. Die Include-Dateien aus dem Paket habe ich einfach nach /usr/src/linux/include/linux kopiert und bereits vorhandene Dateien ersetzt. Die Dokumentation einfach in das entsprechende /usr/src/linux/Documentation/isdn kopieren, die diff-Datei konnte ich ignorieren, da sie mit der beim Kernel mitgelieferten bereits übereinstimmte. Übrigens sind Patch-Skripte bei den Treibern mitgeliefert, allerdings habe ich diese (in einer Treiber-Version von Mitte März) nicht zum korrekten Arbeiten bewegen können.

Danach geht es an die Konfiguration des Kernels. Besitzer einer Teles 16.3c PnP müssen zwingend ISDN als Modul konfigurieren, bei der PCI-Karte wäre auch eine direkte Einbindung in den Kernel möglich. Ich stelle nachfolgend die Variante mit dem Modul vor.

Hier die von mir in der Kernel-Version 2.0.35 benutzten Optionen:
 <M> ISDN support                                                   
 [ ] ABC-Ext. Support (Compress,TCP-Keepalive ...)                  
 [*] Support synchronous PPP                                        
 [*] Use VJ-compression with synchronous PPP                        
 [*] Support generic MP (RFC 1717)                                  
 [ ] Support dynamic timeout-rules                                  
 [ ] Support budget-accounting                                      
 [*] Support audio via ISDN                                         
 < > ICN 2B and 4B support                                          
 < > PCBIT-D support                                                
 <M> HiSax SiemensChipSet driver support                            
 [*] HiSax Support for EURO/DSS1                                    
 [*] Support for german chargeinfo                                  
 [ ] Support for australian Microlink service (not for std. EURO)   
 [*] HiSax Support for german 1TR6                                  
 [ ] HiSax Support for Teles 16.0/8.0                               
 [ ] HiSax Support for Teles 16.3 or PNP or PCMCIA                  
 [ ] HiSax Support for Teles 16.3c                                  
 [ ] HiSax Support for Teles PCI                                    
 [ ] HiSax Support for Teles S0Box                                  
 [ ] HiSax Support for AVM A1 (Fritz)                               
 [*] HiSax Support for Elsa cards                                   
 [ ] HiSax Support for ITK ix1-micro Revision 2                     
 [ ] HiSax Support for Eicon.Diehl Diva cards                       
 [ ] HiSax Support for ASUSCOM cards                                
 [ ] HiSax Support for TELEINT cards                                
 [ ] HiSax Support for Sedlbauer speed card/win/star                
 [ ] HiSax Support for USR Sportster internal TA                    
 [ ] HiSax Support for MIC card                                     
 [ ] HiSax Support for NETjet card                                  
 [ ] HiSax Support for Niccy PnP/PCI card                           
 < > Spellcaster support (EXPERIMENTAL)                             
 < > AVM-B1 with CAPI2.0 support

Die Auswahl des Lowlevel-Treibers muß abhängig von der Karte geschehen, im obigen Beispiel ist der Elsa-Treiber ausgewäahlt.

Nachdem die Konfiguration gesichert ist, kann ein neuer Kernel erzeugt werden. Sollte dabei während der Übersetzung von drivers/isdn/hisax/config.c eine Fehlermeldung auftauchen, am besten den folgenden Patch anwenden:
103c103
<       X(elsa_init_pcmcia,"elsa_init_pcmcia"),
---
>       _basic_version(elsa_init_pcmcia,"elsa_init_pcmcia"),

Das Makro X ist in meiner Kernelversion nicht definiert gewesen.

Die zentrale Datei, /etc/init.d/isdn

Jetzt kommt der interessante Abschnitt, die Konfiguration des ISDN-Zugangs. Als Beispiel nehme ich hier den Zugang zu IN-Berlin, die Hinweise sind allerdings allgemein gültig. Lediglich bei den Optionen für ipppd können je nach Provider Unterschiede auftreten, mache ISDN-Einwahlpunkte kommen z.B. mit den Komprimierungsverfahren überhaupt nicht zurecht und lehnen jede Verbindung ab. Ich werde an der entsprechenden Stelle einen Alternativ-Aufruf angeben.

Damit diese Datei beim Systemstart ausgeführt wird, müssen je nach System unterschiedliche Maßnahmen getroffen werden. Bei Debian ist der folgende Programmaufruf ausreichend:
update-rc.d isdn defaults

Bei anderen System müssen in den entsprechenden rc2.d die Links Sxxisdn und Kxxisdn selbst erzeugt werden (xx ist eine Nummer, die die Startreihenfolge angibt).

Die Einstellungen des Skriptes

Am Anfang des Skriptes kommt der ¨bliche Magiccode zum Ausführen der Datei und die Konfigurationsoptionen. Ich werde hier im Skript die Originalnummern und Namen verwenden, diese müssen natürlich angepaßt werden.
#!/bin/sh

# This script is used to initiate and stop an ISDN connection
# For IN-Berlin

# The number of the peer
REMOTE_NUMBER="454871"

# The MSN allowed to call in
IN_NUMBER="3056497102"

# My name
MY_NAME="myrkr"

# The providers name
REMOTE_NAME="in-berlin"

# The IP-Adresses are pseudo addresses used for configuring the interface
# and setting up routes
LOCAL_IP="10.0.0.1"
REMOTE_IP="10.0.0.2"
DEVICE="ippp0"

CONTROLLER="isdnctrl0"

LOG_FILE=/var/log/isdn.errors

Die Variable LOCAL_NUMMER ist diejenige MSN, die beim Rauswählen verwendet wird. Wichtig ist dies, wenn diese Nummer beim Provider angegeben wurde und dieser nur dieser Nummer den Zugang gestattet. Jeder andere sollte aber auch sich eine korrekte Nummer nehmen, dadurch kann man auf der Telefonrechnung gleich alle Zugänge über ISDN erkennen.

REMOTE_NUMBER ist die Telefonnummer des Providers. Die oben angegebene ist für IN-Berlin gültig. MY_NAME ist derjenige Name, der mit dem Provider vereinbart wurde. Zusammen mit dem Paßwort (in der Datei /etc/ppp/pap-secrets) und dem Namen des Providers (REMOTE_NAME) dient diese zur Authentification.

Die Variablen LOCAL_IP, REMOTE_IP, DEVICE und CONTROLLER brauchen im Normalfall nicht geändert zu werden.

Die letzte Variable LOG_FILE ist die Logdatei, in dem die Ausschriften der ganzen Programme zum Aufbau der ISDN-Verbindung geschrieben werden. Im Moment ist eine normale Datei eingestellt, bei einer funktionierenden Anbindung kann einfach /dev/null an dieser Stelle eingesetzt werden.

Start des ISDN-Subsystem, Konfiguration des Treibers

Ich benutze für diese Init-Datei den bekannten SysV-Init Stil mit den Parametern start, stop, online und offline. Hier ist der start-Zweig zu finden.
case "$1" in
  start)
    echo -n "Initializing ISDN device and setting up logger ... " 
    {
    isdnctrl addif $DEVICE
    isdnctrl addphone $DEVICE out $REMOTE_NUMBER
    isdnctrl eaz $DEVICE $LOCAL_NUMBER
    isdnctrl l2_prot $DEVICE hdlc
    isdnctrl l3_prot $DEVICE trans
    isdnctrl encap $DEVICE syncppp
    isdnctrl huptimeout $DEVICE 200
    isdnctrl chargehup $DEVICE on
    isdnctrl secure $DEVICE on
    isdnctrl pppbind $DEVICE `echo ${DEVICE} | sed 's/ippp//'`

    hisaxctrl line0 1 4

Der ISDN-Treiber wird auf SyncPPP über HDLC eingestellt. Zusätzlich wird ein Timeout von 200 Sekunden eingestellt und das Auflegen bei Inaktivität kurz vor dem nächsten Gebührenimpuls eingeschaltet.

Als nächstes muß der ipppd gestartet werden. Bei Debian-Systemen sollte der folgende Abgeschnitt benutzt werden:
    start-stop-daemon --start --quiet \
        --pidfile /var/run/ipppd.$DEVICE.pid \
        --exec /usr/sbin/ipppd -- \
            user ${MY_NAME} remotename ${REMOTE_NAME} \
            noipdefault \
            defaultroute \
            ipcp-accept-remote \
            debug \
            /dev/${DEVICE} &

Benutzer einer anderen Distribution benutzen die vereinfachte Version:

     /usr/sbin/ipppd \
            user ${MY_NAME} remotename ${REMOTE_NAME} \
            noipdefault \
            defaultroute \
            ipcp-accept-remote \
            debug \
            /dev/${DEVICE} &

Keinesfalls sollte die Option +pap angegeben werden, denn sie bewirkt, daß von der Gegenstelle (also IN-Berlin) ebenfalls eine Autorisierung verlangt wird, diese erfolgt nicht, und die Verbindung wird sofort wieder getrennt. Diese Option ist nur interessant, wenn man selbst Einwahlserver spielt.
Die drei Möglichkeiten:
-pap     -> Verweigere die Autorisierung bei der Gegenstelle.
+pap     -> Verlange die Autorisierung der Gegenstelle.
<nichts> -> Autorisiere dich bei der Gegenstelle (wenn sie
            es verlangt).
Für die Einwahl zu einem Provider trifft die letzte Variante zu.

Die Debug-Einstellung sollte solange bleiben, bis das System stabil läuft. Bei meiner eigenen Konfiguration wird noch ein isdnlog gestartet, aber dieser Aufruf würde hier etwas zu weit führen.

Ich hatte ja hier ein paar zusätzliche Optionen für wiederspenstige ISDN-Einwahlknoten versprochen. Hier sind sie nun, aber vorsicht, nicht einfach fortlaufend in die Datei übernehmen, sondern zwischen die Argumente von ipppd einfügen.
            -vjccomp -ac -pc \
            -bsdcomp \

Mit der Konfiguration des Netzwerkgerätes, einer netten Ausschrift und dem Blockende endet die Initialisierung:
    ifconfig $DEVICE $LOCAL_IP pointopoint $REMOTE_IP metric 1 -arp

    } >> ${LOG_FILE} 2>&1

    echo "done"
    ;;

Going online

Dieser Abschnitt des Skriptes macht die Verbindung scharf. Ich habe mit Absicht die ISDN-Treiber in einem Zustand gestartet, in dem das versehentliche Rauswählen wegen eines DNS-Lookups nicht möglich ist. Wer dies nicht wünscht, schreibt die Befehle dieses Abschnittes einfach in den start-Bereich hinein.
  online)
    echo -n "Turning ISDN device semionline ... "
    {
    ifconfig $DEVICE up
    route add default dev $DEVICE
    } >> ${LOG_FILE} 2>&1
     echo "done"
     ;;

Danach führt ein Verbindungswunsch in die weite Welt zum Verbindungsaufbau und hoffentlich wird dabei die PPP-Verbindung korrekt initialisiert. Hier ist das Überwachen der entsprechenden Syslogd-Ausgabedatei (Facility daemon) zu empfehlen, um den aktuellen Stand der Verbindung zu überwachen. Die möglichen Fehlermeldungen sind sehr ähnlich zu dem des normalen PPP-Dämon, so daß die entsprechenden Tips zur Fehlersuche sehr hilfreich sein können.

Der Abbau der Verbindung

Dieser Abschnitt beendet die derzeitige Verbindung und tut auch das nötige, um weiteres dial-on-demand zu verhindern.
  offline)
    echo -n "Turning ISDN device offline ... "
    {
    ifconfig $DEVICE down
    isdnctrl hangup $DEVICE
    route del default dev $DEVICE
    } >> ${LOG_FILE} 2>&1
    echo "done"
    ;;

Herunterfahren des ISDN-Systems

Wenn mal einiges im Argen liegt oder einfach der Rechner heruntergefahren wird, ist das Entladen der Treiber und ein Beenden des ipppd sehr hilfreich.

Hier wieder zuerst der Aufruf für Debian:
  stop)
    echo -n "Shutting down ISDN device ... " 
    {
    start-stop-daemon --stop --quiet \
        --pidfile /var/run/ipppd.$DEVICE.pid \
        --exec /usr/sbin/ipppd

    ifconfig $DEVICE down
    isdnctrl delif $DEVICE

    rmmod hisax
    rmmod isdn
    rmmod slhc
    } > ${LOG_FILE} 2>&1
    echo "done"
    ;;

Anwender anderer Linux-Versionen ersetzen die Zeilen:
    start-stop-daemon --stop --quiet \
        --pidfile /var/run/ipppd.$DEVICE.pid \
        --exec /usr/sbin/ipppd
durch
    killall ipppd &

Etwas rabiat, wer möchte, kann ja auch die Nutzung von PID-Dateien einbauen.

Abschließend der Abschnitt für die Unwissenden, die entweder die Datei ohne Parameter aufrufen oder aber falsche Parameter übergeben:
  *)
    echo "Usage: $0 {start|stop|online|offline}"
    exit 1
    ;;
esac

exit 0;

Authentifizierung

Wie bereits oben angedeutet, muß sich der Nutzer bei seinem Internetprovider identifizieren. Am häufigsten kommt bei ISDN hier das PAP zum Einsatz. Ich gebe mal eine Beispieldatei der /etc/ppp/pap-secretsmit falschem Paßwort an, dabei sind die Werte der Variablen REMOTE_NAME und MY_NAME wiederzufinden:
myrkr           in-berlin       <hier kommt das Paßwort rein>

Schlußwort

Ich hoffe, die Anleitung war eine Hilfe bei der Konfiguration des ISDN-Zugangs. Ich konnte an manchen Stellen nicht alle Punkte genau erläutern, ansonsten wäre das Dokument viel zu lange geworden. Bevor ich schließe, möchte ich aber noch auf zusätzliche Informationsquellen eingehen. Zum einen gibt es die Dokumentation und Manualpages des isdn4k-utils-Paketes. Dort sind die ganzen Kommandos erklärt und auch ein paar zusätzliche Informationen zu finden. Insbesondere Spezialitäten wie isdnlog, vbox und die Zusatzprogramme isdnload, imontty werden hier erläutert. Eine weitere wertvolle Informationsquelle ist die FAQ, zu finden auf ftp://ftp.franken.de/pub/isdn4linux/FAQ. Wer Probleme und Fragen zu dem isdn4linux-Paketes hat, sollte sich entweder in der Newsgruppe de.alt.comm.isdn4linux oder der Mailingliste bei majordomo@hub-wueNSpAm.franken.de melden (Für die Mailingsliste:
   9. Gibt es eine Mailinglist zu isdn4linux?

      Ja, die gibt es. Um daran teilzunehmen, schickt man eine Mail an
      "majordomo@hub-wue.franken.de". Der Betreff der Nachricht ist
      egal. Im Nachrichtentext gibt man an: "subscribe isdn4linux
      <emailadresse>". Im Feld <emailadresse> gibt man die Adresse
      an, an die die Mails aus der Liste geschickt werden
      sollen. Zur Zeit kommen etwa 20-50 Mails pro Tag.

Die Mailingsliste und die Newsgruppe sind per bidirektionalen Gateway verbunden.

Ergänzung: Online-on-demand von Unterwegs

von Gernot

Nicht jeder hat eine Standleitung oder Callback, und nicht jeder möchte so etwas haben. Häufiger erreicht uns der Wunsch nach Callback auch nur (das wissen wir aus der Begründung), um z.B. aus der Firma oder von Unterwegs den eigenen Rechner erreichen zu können.

Mit einem einfachen Trick geht das auch ohne Callback, indem man die Verbindung selbst auslöst, und zwar mit einem Anruf vom Handy oder einem Telefon mit Rufnummernübermittlung von Arbeit aus oder dergleichen auf eine dafür reservierte MSN (man bekommt auf Anfrage bis zu 10 MSN insgesamt kostenlos). Dazu muss isdnlog laufen und löst dann bei erkanntem Anruf die Einwahl aus.

Hat man keine feste IP-Nummer benötigt man noch einen dynamischen DNS-Eintrag, z.B. bei dynodns.net, dyndns.org oder dyn.ee. Will man also an den eigenen Rechner, ruft man zu Hause auf der extra MSN an, lässt es ein-zweimal klingeln, legt auf und wartet einen Moment, bis der Rechner gewählt hat und der dynamische DNS-Eintrag passiert ist (das wird man in /etc/ppp/ip-up machen, je nach DNS gibt es verschiedene Clients). Dann kann man mit slogin rechner.dyn.ee auf den eigenen Rechner.

IN-Berlin plant und testet bereits selbst einen solchen dynamischen DNS, bis dieser aber soweit ist, empfehlen sich oben genannte. Es gibt außer den dreien noch viele weitere Anbieter solcher Dienste, jedoch sind die DNS-Einträge bei manchen zu langlebig, d.h. man muss nach der Einwahl mehrere Minuten auf ein Update des Records warten, wenn die Daten irgendwo im Cache stecken. Sie richten sich eher an Leute, die auf einer Flatrate einen Server betreiben wollen. Bei den genannten funktioniert es dagegen innerhalb weniger Sekunden.

Die Einwahl habe ich so realisiert:
  1. In /etc/isdn/callerid.conf
    [MSN]
    NUMBER = 1234567-die-extra-MSN
    SI = *
    ALIAS = Einwahlausloeser
    ZONE = 1
    START = {
    [FLAG]
    FLAGS = I|R
    PROGRAM = pfad/zu/script.sh \$2
    }
  2. Das Script enthält dann soetwas wie:
    #!/bin/sh
    if [ "$2" = "+4917handynummer" -o "$2" = "+4930dienstnummer1" ]
    then
    /sbin/isdnctrl dial ippp0
    fi
    fi
    Das Script muss natürlich für den User ausführbar sein, unter dessen ID isdnlog läuft (falls nicht root), und er muss auch isdnctrl aufrufen können, ggf. ersetze man es durch ein ping auf irgendeinen Rechner. Mit Ping geht das übrigens auch für IN-Berlin-Light-Teilnehmer, die sich woanders einwählen, z.B. T-DSL-Flat haben.

Ergänzung: Kanalbündelung

von Gernot

IN-Berlin (und auch viele andere Anbieter) erlauben, mehr als eine Verbindung zu bündeln. Das geht zwar sogar auch mit Modems, hat aber erst bei ISDN richtig Sinn. Voraussetzungen:
  • Der Kernel kann es. Das muss man beim Compilieren angeben, bei der ISDN-Konfiguration. Und zwar hier:
    ...
    x x <M> ISDN support x x
    x x [*] Support synchronous PPP x x
    x x [*] Use VJ-compression with synchronous PPP x x
    hier -------> [*] Support generic MP (RFC 1717) x x
    x x [*] Support audio via ISDN x x
    ...
  • Der ipppd kann es. Können aber eigentlich alle halbwegs aktuellen Versionen.
  • Man hat den Kanal nicht voll:-), also einen zweiten B-Kanal. Das ist nicht so selbstverständlich, wenn man z.B. am internen S0-Bus einer Anlage sitzt. Es gibt nämlich welche, die das nicht ohne Tricks zulassen.
Nachdem die Voraussetzungen abgeklärt sind, geht es los:
  • Man gibt zum eigentlichen isdn-Device einen Slave hinzu. Möglicherweise kollidiert man an dieser Stelle mit dem Konfigurations-Konzept seiner Distribution, die z.B. nur eine Variable DEVICE vorsieht - jetzt brauchen wir nämlich zwei. Notfalls muss man das also per Hand machen oder die Konfig-Scripte auf den Kopf stellen (siehe Start des ISDN-Subsystem, Konfiguration) Jedenfalls muss hinterher, wir nehmen mal an, das erste Device ist ippp0, die Sache so aussehen:
     ...
    isdnctrl addif ippp0
    isdnctrl addslave ippp0 ippp1
    isdnctrl eaz ippp0 <eine_MSN>
    isdnctrl eaz ippp1 <eine_MSN>
    isdnctrl addphone ippp0 out 454871
    isdnctrl addphone ippp1 out 454871
    und so weiter, alles doppelt halt
    isdnctrl dialmode ippp1 auto
    Der Dialmode des Slaves muss auf auto stehen, wenn man später den 2. Kanal automatisch hinzuschalten lassen will (mit ibod, siehe unten). Sonst kann er natürlich auch auf manual stehen, und man wählt per isdnctrl dial ippp1 per Hand.
    Hat man eine TK-Anlage, die Kanalbündelung verhindert, kann man zwei verschiedene MSNs nehmen (ausgehend), meine Auerswald kann ich so austricksen.
  • Man sagt dem ipppd bescheid, dass er einen Slave hat und Bündelung vorbereiten soll. Dazu muss man nur die Option +mp hinzufügen und natürlich das zweite Device, z. B. so:
     /usr/sbin/ipppd \
    user ${MY_NAME} remotename ${REMOTE_NAME} \
    noipdefault \
    defaultroute \
    ipcp-accept-remote \
    debug \
    +mp \
    /dev/ippp0 /dev/ippp1 &
    (Wenn man es schafft, für die beiden Devices Variablen zu nehmen, sollte man es tun, z.B. ${MASTER} und ${SLAVE} oder so, wenn die Distribution sowas kann.)
    Jetzt kann man schon loslegen und den zweiten Kanal mit isdnctrl dial ippp1 per Hand dazuschalten. Klappt das, kommt...
  • Leider geht die Kanalbündelung nach Traffic nur bei raw-IP-Devices, nicht bei ippp. Dagegen gibt es ein Tool namens IBOD. Dieses überwacht den Traffic und löst die Anwahl per IOCTL aus. Leider hat sich die Entwicklung von IBOD mehrfach gespalten, und die scheinbar offizielle Version von Jan Obladen hat zwar ein nettes neues X-Interface, jedoch die gleichen Macken wie die alte 1.4er Version. Ein anderer Zweig von Thomas Pfeiffer trägt Versionsnummer 1.6, einen Patch hat er mir zwar abgenommen, aber der Zweig scheint verschwunden zu sein, diese Version hat SuSE weiterentwickelt zu einer Version 1.5-66 (pds-Version), na und so weiter. Daher habe ich die Pfeiffer-Version mit meinen Änderungen auf unserem Webserver abgelegt. Diese läuft bei mir sowohl mit Kernel 2.0.38 als auch 2.2.17ff.
Achtung: Kanalbündelung kostet auch das Doppelte!

Userdoc.DocumentationForm edit

Title Einwahl mit Linux und ISDN4Linux
Type HowTo
Classification Dialup
QuickFind no
Keywords ISDN Linux ISDN4Linux

  • QuickFind



 
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding IN-Berlin Public Wiki? Send feedback