heise online
  • c't
  • iX
  • Technology Review
  • Mac & i
  • mobil
  • Security
  • Netze
  • Open Source
  • Developer
  • c't-TV
  • Download
  • Telepolis
  • Resale
  • Foto
  • Autos
  • Preisvergleich
  • Stellenmarkt
  • Abo
  • weitere Angebote
    • Shop
    • Artikel-Archiv
    • Veranstaltungen
    • Whitepapers
    • heise-marktplatz
    • IT-Markt
    • Tarifrechner
    • Jobs bei Heise

c't Magazin
  • Startseite
  • Artikel
  • c't-Projekte
  • Hotline & FAQ
  • Treiber & mehr
  • Kolumnen
Software zu Projekten Allgemeine Hinweise
Archiv-Suche Newsletter RSS-FeedRSS

c't › c't-Projekte

c't
  • Login
  • Help/Guide
  • About Trac
  • Preferences
  • Register
  • Wiki
  • Timeline
  • Roadmap
  • Browse Source
  • View Tickets
  • Search

Context Navigation

  • Start Page
  • Index
  • History
  • Last Change

ISDN-Karte einrichten

Hier wird beschrieben, wie eine ISDN-Karte mit CAPI-Treiber eingerichtet werden kann. Zum Internetsurfen wird diese zwar nicht (mehr) benötigt, dafür kann ich aber Funktionen wie Einzelverbindungsnachweis, Fax, Anrufbeantworter und externen Zugang über Handy nutzen.

Da ich möglichst keine proprietären Treiber auf meinen System habe möchte, habe ich mir bei e-bay eine AVM B1 ISA 3.0 (aktive Karte) gekauft. Dieses hat die Sache aber leider ziemlich verkompliziert, daher diese Beschreibung. Betreiben möchte ich die Karte in der DOM-0.

Kernel neu kompilieren

Eigentlich sollte man für eine so alte Hardware keine (neuen) Treiber brauchen, welche noch nicht in dem Standardkernel enhalten sind. Doch leider sind durch die XEN-Patches sämtliche ISA-Treiber von der Kernelkonfiguration ausgenommen (tauchen in make menuconfig nicht mehr auf) und werden daher nicht mehr mitgebaut. Wahrscheinlich gibt es gute Gründe dafür, diese werde ich aber an dieser Stelle ignorieren.

Das Kompilieren von Debian-Kerneln hat sich (wahrscheinlich seit Etch) etwas verändert. Früher wurde einfach das Paket linux-source installiert, die Kernel-Sourcen unter /usr/src/linux entpackt, mit der aktuellen config aus /boot vorkonfiguriert und dann mit make-kpkg ein Debian-Kernelpaket gebaut. Bei diesen Kernelsourcen sind aber offenbar nur ein Teil der Patches enthalten, welche sich in dem laufenden Kernel befinden. Insbesondere von XEN gibt es keine Spur.

Eine Anleitung für die aktuelle Vorgehensweise ist im Abschnitt-4.2 im Debian Linux Kernel Handbook oder auch im Artikel Efw2Xen beschrieben. Hierbei werden mit apt-get source die Quellen eines Kernelpaketes geholt, vorkonfiguriert, gepatcht und dann ein Debian-Paket erstellt.

Als erstes wird der Name des aktuell verwendeten Kernel-Paketes ermittelt und die zugehörgen Sourcen geholt (diese werden in das aktuellen Verzeichnis entpackt):

server:~# uname -r
2.6.18-5-xen-686
server:~# dpkg -S /boot/vmlinuz-2.6.18-5-xen-686
linux-image-2.6.18-5-xen-686: /boot/vmlinuz-2.6.18-5-xen-686
server:~# apt-get source linux-image-2.6.18-5-xen-686

Als nächstes werden die notwendigen Entwicklungstools installiert (falls noch nicht erledigt):

server:~# apt-get install build-essential fakeroot libncurses5-dev
server:~# apt-get build-dep linux-2.6

Jetzt lasse ich den Kernel für den gewünschten Flavor (i386-xen-686) patchen und vorkonfigurieren:

server:~# cd linux-2.6-2.6.18.dfsg.1/
server:~/linux-2.6-2.6.18.dfsg.1# fakeroot debian/rules debian/build debian/stamps
server:~/linux-2.6-2.6.18.dfsg.1# fakeroot make -f debian/rules.gen setup-i386-xen-686

Darauf ändere ich die Sourcen so, dass sich wieder Treiber für ISA-Karten auswählen lassen:

server:~/linux-2.6-2.6.18.dfsg.1# cd debian/build/build-i386-xen-686
server:~/linux-2.6-2.6.18.dfsg.1/debian/build/build-i386-xen-686# vi arch/i386/Kconfig
--- schnipp --- (etwa Zeile 1089)
config ISA
        bool "ISA support"
        depends on !(X86_VOYAGER || X86_VISWS || X86_XEN)
--- schnapp ---
ändern zu 
--- schnipp ---
config ISA
        bool "ISA support"
        depends on !(X86_VOYAGER || X86_VISWS)
--- schnapp ---

Jetzt kann der Kernel wie gewohnt konfiguriert ...

server:~/linux-2.6-2.6.18.dfsg.1/debian/build/build-i386-xen-686# make menuconfig
Bus options (PCI, PCMCIA, EISA, MCA, ISA)  --->
  [*] ISA support
Device Drivers  --->
  ISDN subsystem  --->
    Active AVM cards  --->
      <M>   AVM B1 ISA support

... und ein Debian-Paket erstellt werden:

server:~/linux-2.6-2.6.18.dfsg.1/debian/build/build-i386-xen-686# cd ../../../
server:~/linux-2.6-2.6.18.dfsg.1# fakeroot make -f debian/rules.gen binary-arch-i386-xen-686

Wenn alles geklappt hat, liegen nach dem Buildvorgang die fertigen Pakete ein Verzeichnis höher und können mit dpkg -i eingespielt werden:

server:~/linux-2.6-2.6.18.dfsg.1#  cd ../
server:~# dpkg -i linux-image-2.6.18-6-xen-686_2.6.18.dfsg.1-18etch1_i386.deb linux-modules-2.6.18-6-xen-686_2.6.18.dfsg.1-18etch1_i386.deb

Bei mir waren danach der Originalkernel (2.6.18-5) und der eigene Kernel (2.6.18-6) gleichzeitig installiert, wobei der eigene Kernel beim Bootloader als Default eingestellt ist. Das Modul b1isa.ko sollte sich jetzt im Verzeichnis /lib/modules/2.6.18-6-xen-686/kernel/drivers/isdn/hardware/avm/ befinden. Wer möchte, kann an dieser Stelle den Rechner mit dem neuen Kernel neustarten.

Firmware / Hardwarekonfiguration

Aktive ISDN-Karten haben einen eigenen Controller und brauchen dementsprechend eine Firmware. Diese ist bei meiner Karte nicht in einem (Ee)prom/Flash auf der Karte gespeichert, sondern muss vor der Verwendung der Karte in dessen Speicher geladen werden.

Das Debian-Paket "isdnactivecards" enthält bereits Firmwaredateien für diverse ISDN-Karten, meine Karte ist aber leider nicht dabei. Diese kann man aber bei AVM herunterladen.

In dem Tar-Archiv befinden sich unter anderem zwei RPM-Dateien für SuSE. Diese können mit Hilfe des Tools alien in Debian-Pakete oder auch in .tar.gz-Dateien umgewandelt werden. Da ziemlich alles außer der Firmwaredatei bereits in anderen Debian-Paketen enthalten ist, wandle ich die RPM-Datei mit der Firmware in ein Tar-Archiv um und kopiere die Firmware manuell an die richtige Stelle:

server:~# apt-get install alien
server:~# tar xvfz b1-suse8.1-03.10.02.tar.gz
server:~# cd active/
server:~/active# alien --to-tgz c4l-b1-2003.01.28-1.i386.rpm
server:~/active# tar xvfz c4l-b1-2003.01.28.tgz
server:~/active# cp usr/lib/isdn/b1.t4 /usr/share/isdn/

Jetzt muss noch die Hardware konfiguriert werden. Der Jumper auf der Karte ist auf 0x150 eingestellt. Eine kurze Prüfung mit cat /proc/ioports bestätigt mir, dass noch kein anderer Treiber diesen Speicherbereich benutzt. Der Interrupt wird nicht über einen Jumper, sondern über den Treiber eingestellt. Ein cat /proc/interrupts verrät mir, dass z. B. IRQ 5 noch frei ist. Damit das auch bei späteren Änderungen bei anderen (PCI-)Karten so bleibt, reserviere ich beim nächsten Neustart diesen Interrupt im Bios-Setup unter PCI AND PNP SETUP für ISA. Der Rest wird in der Datei /etc/isdn/capi.conf (Paket "capiutils") konfiguriert:

server:~# apt-get install capiutils
server:~# vi /etc/isdn/capi.conf
# card          file            proto   io      irq     mem     cardnr  options
b1isa          b1.t4           DSS1    0x150   5       -       -       P2P
#b1pci          b1.t4           DSS1    -       -       -       -

Hier müssen nur in der 2. Zeile das Kommentarzeichen vor b1isa entfernt und ggf. die Konfiguration der I/O-Basisadresse (io) und des Interrupts (irq) angepasst werden. Nach einem (Neu-)Start von capiutils sollte die Karte bei Auruf von capiinfo angezeigt werden. Dafür muss natürlich bereits der modifizierte Kernel laufen.

server:~# /etc/init.d/capiutils stop
server:~# /etc/init.d/capiutils start
Starting ISDN CAPI Cards....
server:~# capiinfo
Number of Controllers : 1
Controller 1:
Manufacturer: AVM GmbH
CAPI Version: 2.0
Manufacturer Version: 3.10-02  (49.2)
Serial Number: 0203241

Falls es hier zu Problemen kommt, sollte auf jeden Fall die Ausgabe von dmesg überprüft werden. Offenbar gibt es auch in paar kleinere Bugs in einzelnen ISDN/Capi-Modulen, die ein sauberes Entladen der Module aus dem Kernel verhindern. Daher kann es beim Probieren möglicherweise zu Situationen kommen, wo der ganze Rechner neugestartet werden muss. Dieses sollte aber später im Betrieb nicht mehr passieren...

Einrichtung von CapiSuite

Die Programme aus dem Paket "capisuite" stellen Faxdienste und einen Anrufbeantworter bereit. Im Gegensatz "älteren" Progammen wie z. B. "vbox" greifen diese Programme nicht über eine "Modememulation" (Gerätedateien /dev/ttyI*), sondern direkt über die Capi-Schnittstelle auf die Hardware zu.

Zur Zeit habe ich erst einmal nur den Faxempfang eingerichtet, weitere Funktionen und auch die Schnittstelle für eigene Skripte sind sehr ausführlich auf der Homepage von CapiSuite beschrieben. Darüber hinaus hat Neobiker in seinem Wiki beschrieben, wie der Anrufbeantworter individueller konfiguriert und unbekannte Anrufer über eine Rückwärtssuche im Telefonbuch erkannt werden können.

Der Faxempfang wird sehr einfach über die Datei "/etc/capisuite/fax.conf" einstellt:

server:~# vi /etc/capisuite/fax.conf
--- schnipp ---
#[gernot]
#fax_numbers="11,12"
#fax_stationID="+49 89 123456"
#fax_headline="Gernot Hillier - sent by CapiSuite"
#fax_email=""
#fax_action="MailAndSave"
--- schnapp ---

Hier müssen die Kommentarzeichen entfernt und der Name "gernot" durch einen existierenden lokalen Benutzer ersetzt werden. Unter "fax_numbers" werden eine oder mehrere Telefonnummern ohne Vorwahl eingetragen. In der Voreinstellung werden alle Faxe unter "/var/spool/capisuite/users/" abgelegt und zusätzlich per E-Mail an den ensprechenden lokalen User gesendet.

Falls das Feld "fax_email" verwendet werden soll, um eine externe Mail-Adresse anzugeben, muss in den meisten Fällen der Mailserver entsprechend konfiguriert sein. Mein interner Mailserver ist zu diesem Zeitpunkt noch nicht eingerichtet, daher kann ich diese Funktion im Moment noch nicht testen. Auch das Senden an den lokalen User hat bei mir nicht auf Anhieb geklappt, ich konnte aber sehen, dass in dem o. g. Verzeichnis ein Fax angekommen ist.

Jetzt muss noch der Dämon von CapiSuite aktiviert werden. Diese wird über die Datei "/etc/default/capisuite" erledigt:

server:~# vi /etc/default/capisuite
--- schnipp ---
# run_capisuite_daemon:
#       set 'y' to activate the boot/shutdown script
#       /etc/init.d/capisuite (Don't forget to
#       configure the files in /etc/capisuite/
#
run_capisuite_daemon=y
--- schnapp ---
server:~# /etc/init.d/capisuite start
Starting capisuite daemon: capisuite.

Ab dem nächsten Neustart wird der Dämon dann automatisch gestartet.

Isdnlog

Obwohl CapiSuite alle Gespräche in der Datei "/var/log/capisuite.log" festhält, möchte ich gerne wieder die Funktionen von isdnlog und isdnrep haben. Diese Programme setzen aber auf die alte ISDN-API (I4L) auf, welche u. a. über die Gerätedatei /dev/isdnctrl arbeitet.

Damit "alte" I4L-Anwendungen funktionieren, muss das Interfacemodul "capidrv" geladen sein. Damit dieses bei jedem Neustart automatisch passiert, wird das Modul in die Datei "/etc/modules" eingetragen:

server:~# vi /etc/modules
--- schnipp ---
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

loop
capidrv
--- schnapp ---
server:~# modprobe capidrv

Jetzt wird isdnlog installiert und gestartet:

server:~# apt-get install isdnlog
server:~# /etc/init.d/isdnutils start

Während der Installation wird normalerweise die Vorwahlnummer abgefragt. Diese muss mit führender 0 (also z. B. "040") eingeben werden.

Zu Testzwecken kann man sich jetzt mal selber anrufen. Darauf sollte dieser Anruf mit isdnrep bzw. isdnrep -E angezeigt werden. Aliase für die eigenen Nummern sowie die Nummern der Anrufer werden in der Datei "/etc/isdn/callerid.conf" (muss evtl. angelegt werden) eingestellt. Hierauf gehe ich an erst einmal nicht weiter ein, die Manpage "callerid.conf(5)" enthält alle nötigen Informationen.

Wer möchte, kann die Ausgabe von isdnrep über einen Webserver anzeigen lassen. Der bereits vorhandene Webserver (dhttpd) auf Port 82 ist hierfür aber nicht geeignet, da dieser keine CGI-Skripte ausführen kann. Daher habe ich zusätzlich den Apache2-Server installiert. Hierfür sollte ein apt-get install apache2 ausreichen.

In der Default-Konfiguration ist CGI für alle Dateien aktiviert, die im Verzeichnis "/usr/lib/cgi-bin" liegen. Hier lege ich mein Wrapperscript für isdnrep an:

server:~# mkdir /usr/lib/cgi-bin
server:~# vi /usr/lib/cgi-bin/isdnrep
--- schnipp ---
#!/bin/sh
if [ $# = 0 ] ; then
    isdnrep -w1 -E $@ # default, falls ohne Parameter
else
    isdnrep -w1 $@
fi
--- schnapp ---
server:~# chmod a+x /usr/lib/cgi-bin/isdnrep

Ab jetzt kann der Einzelverbindungsnachweis über die Adresse http://server/cgi-bin/isdnrep angezeigt werden.

V110-Zugang einrichten

Bei vorhandener ISDN-Karte is es möglich, sich von unterwegs mit Laptop und Handy auf dem Server einzuwählen. Dieser kann dann auch als Gateway in das Internet verwendet werden.

Im Zeitalter von DSL-Flatrates und UMTS hat diese Einwahlmöglichkeit mit Sicherheit an Bedeutung verloren, denn 9,6 bzw. 19,2 kBit/s sind nicht wirklich schnell. Aber wer den Internetzugang unterwegs nur sporadisch braucht und sich deswegen keinen speziellen Datentarif für sein Handy zulegen möchte, kann diesen Zugang z. B. für Homebanking über HBCI oder zum selektiven Herunterladen von E-Mails benutzen.

Auf meinem System erfolgt die Einwahl direkt in die Dom-0 und nicht über die Endian-Firewall. Wer vor einem Update des Kernels auf der Firewall nicht zurückschreckt, kann auch versuchen, die ISDN-Karte an die Endian-FW durchzureichen. Um die Sicherheit des Systems nicht zu sehr zu untergraben, soll eine Einwahl nur von ausgewählten Rufnummern aus möglich sein.

Benötigt werden die Pakete ppp und mgetty. Man könnte zwar auch den pppd ohne mgetty verwenden, dann kann aber nicht nach Rufnummern gefiltert werden.

mgetty einrichten

Mgetty "lauscht" auf einem Modem bis ein Anruf eingeht. Darauf kann es die Verbindung an ein anderes Programm (z.B. pppd oder login) übergeben. Der Begriff "Modem" ist auch für ISDN-Karten zutreffend, der Treiber "isdn_tty" stellt 64 "ISDN-Modems" über die Gerätedateien /dev/ttyI* zur Verfügung.

Obwohl sich diese Gerätedateien aus der Anwendungsperspektive in etwa wie ein analoges Modem an einer seriellen Schnittstelle verhalten, kann normalerweise keine Verbindung zu solchen Gegenstellen aufgebaut werden. Die meisten Handys können sich wahlweise wie ein Analogmodem oder wie eine ISDN-Karte verhalten. Vereinfacht kann man sich vorstellen, dass der Mobilfunkprovider die Verbindung zu unserem Server je nach gewählter Verbindungsart entweder über eine analoge Modemkarte (V34) oder über eine ISDN-Karte (V110) herstellt.

Mgetty wird über die Dateien in /etc/mgettty/ konfiguriert. In der Datei dialin.config werden alle Rufnummern eingetragen, von denen aus sich eingewählt werden kann:

--- schnipp ---
# Ich
171xxxxxxx
#
# Matthias
173xxxxxxx
172xxxxxxx
# don't allow calls when there's no callerid:
!none
# don't allow access to my machine for those callers
!P
# disallow all other calls
!all
--- schnapp ---

Die Datei login.config beschreibt, was nach erfolgreicher Einwahl passiert. In den meisten Fällen wird man wohl wie bei "normalen" Internetzugängen PPP benutzen wollen, daher muss die Zeile mit "/AutoPPP/" am Anfang aktiviert sein. Auf keine Falls sollte hier die Option "login" entfernt werden, da ansonsten unter Umständen keine Authentifikation mehr stattfindet.

--- schnipp ---
/AutoPPP/ -     a_ppp   /usr/sbin/pppd auth -chap +pap login debug
--- schnapp ---

Anstatt eine PPP-Verbindung aufzubauen, kann auch ein normales Login durchgeführt werden. Dieses ähnelt sehr der Benutzung eines seriellen Terminals und wird wohl von den meisten Leuten nicht benötigt (schließlich kann man über die PPP-Verbindung auch eine oder mehrere SSH-Session(s) starten). Bei mir habe ich diese Möglichkeit deaktiviert indem ich die Shell auf /bin/false gesetzt habe.

--- schnipp ---
*       -       -       /bin/false @
--- schnapp ---

pppd einrichten

Je nach Handy und Provider ist die Einwahl mit 9,6 oder 19,2 kBit/s möglich (hierbei enstehen evtl. auch unterschiedliche Kosten!). Für jede Einwahlvariante konfiguriere ich ein eigenes ISDN-Modem mit jeweils einer eigenen MSN. Bei mir habe ich die gleichen MSNs verwendet, wie auch zum Telefonieren. Ob das mit jeden Telefonanbieter und mit jeder Telefonanlage reibungslos funktioniert, kann ich natürlich nicht sagen. Aber im Prinzip sollten sich die einzelnen Dienste aufgrund der unterschiedlichen Service-IDs nicht in die Quere kommen.

Ich verwende die beiden ISDN-Modems /dev/ttyI0 und /dev/ttyI1. Falls diese schon für andere Dienste (z. B. vbox) verwendet werden, können auch beliebige andere Nummern benutzt werden. Die jeweiligen Nummern haben nichts mit den verfügbaren B-Kanälen zu tun.

Der pppd wird über die Dateien /etc/ppp/options.ttyI0 bzw. .ttyI1 konfiguriert:

--- schnipp ---
lock
idle 300
crtscts
modem

192.168.0.2:192.168.0.254
nodefaultroute
proxyarp

ms-dns 192.168.0.2

noipx

auth
require-pap
name hostname
login
--- schnapp ---

Die Adresse 192.168.0.2 ist die von meinem Server, 192.168.0.254 bekommt der Anrufer. Der Name "hostname" muss wirklich so heißen, ansonsten passen die Einträge in der Datei "pap-secrets" nicht.

mgetty aktivieren

Mgetty wird normalerweise direkt von Init-Prozess verwaltet und muss daher in die Datei /etc/inittab eingetragen werden (bitte eigene MSNs entsprechend ersetzen):

--- schnipp ---
#-- isdnutils begin
# Change the line below for your local requirements and uncomment them.
# Use "init q" to reread inittab.
# look at the mgetty manpage for more information (mgetty isn't standard!)
#
I0:2345:respawn:/sbin/mgetty -D -m '"" AT&F OK AT&E12345678&R9600S19=0 OK' -s 38400 ttyI0
I1:2345:respawn:/sbin/mgetty -D -m '"" AT&F OK AT&E23456789&R19200S19=0 OK' -s 38400 ttyI1
--- schnapp ---

Mit (tel)init -q wird die inittab dann neu eingelesen. Ob mgetty korrekt startet kann in den Logdateien im Verzeichnis /var/log/mgetty überprüft werden.

IP-Forwarding einschalten

Da normalerweise die Endian-Firewall das Routing übernimmt, ist in der Dom-0 das IP-Forwarding nicht aktiviert. Dieses kann über ein echo 1 > /proc/sys/net/ipv4/conf/default/forwarding geändert werden. Damit diese Einstellung automatisch bei jedem Systemstart durchgeführt wird, muss in der Datei /etc/sysctl.conf das Kommantarzeichen vor der entsprechenden Zeile entfernt werden.

Laptop/Handy konfigurieren

Auf dem Laptop wird die Verbindung wie eine normale Internetverbindung eingerichtet. Wichtig hierbei ist, dass das Handy anstelle des V34-Protokolls V110 verwendet.

Bei Siemens-Handys reicht es normalerweise aus, einfach vor der Rufnummer ein "i" einzugeben. Bei den meisten anderen Geräten muss der Init-String auf "AT+CBST=71,0,1" eingestellt werden. Für 19,2 kBit/s funktioniert möglichweise die Einstellung "AT+CBST=79,0,1". Von Sony/Ericson gibt es im Internet eine recht ausführliche Beschreibung aller unterstützten AT-Befehle, welche evtl. auch auf Geräte anderer Hersteller zutrifft. In diesen Zusammenhang kann es ggf. hilfreich sein, sich mit einem Terminalprogramm (z. B. minicom unter Linux bzw. HyperTerm unter Windows) mit dem Handy zu verbinden und die verfügbaren Einstellungen für die AT-Befehle abzufragen. Zum Beispiel liefert ein "AT+CBST?" die aktuelle Einstellung und ein "AT+CBST=?" die anderen Einstellmöglichkeiten.

Download in other formats:

  • Plain Text

Trac Powered

Powered by Trac 0.11.1
By Edgewall Software.

http://www.ctmagazin.de/
http://www.ctmagazin.de/projekte/

  • Datenschutzhinweis
  • Impressum
  • Kritik, Anregungen bitte an c't-WWW
  • Mediadaten
  • Copyright © 2011 Heise Zeitschriften Verlag
  • International: The H, The H Security, The H Open Source