Inbelserver: ISDN
Dit artikel legt de configuratie van een inbel-server onder Linux uit,
waarmee je via het b-kanaal van je ISDN lijn kunt inbellen op je Linux
computer.
Inhoud:
Een terminal login wordt hier niet besproken: alleen toegang tot de
(lokale) webserver zal zijn toegestaan.
Je hebt een ISDN lijn en een ISDN kaart/ISDN modem die ondersteund wordt
door Linux.
We nemen aan de Linux computer PPP ondersteuning in de kernel heeft,
ingecompileerd of als module. Als je geen PPP hebt, ga je naar een shell
en type je man pppd en lees je de PPP-HOWTO.
We nemen ook aan dat de ISDN hardware correct geïnstalleerd is, dus
dat je een verbinding met een ISP (Internet Service Provider) kunt
opzetten via isdnctrl dial ippp0. Als dit niet werkt zou je
eerst de ISDN-HOWTO moeten lezen.
Eerst maak je een NETDEV in de /etc/rc.config en wijs je hier een IP
adres aan toe. Het gemaakte device wordt aan het eind van de regels
gemarkeerd. Wij nemen "ippp2 als de nieuwe NETDEV omdat wij "ippp0"
en "ippp1" gebruiken om te verbinden met onze ISPs. Als je "ippp0" en
"ippp1" nog niet gebruikt, kun je deze gebruiken.
YAST van SuSE ondersteund ook het maken van NETDEV, maar als je het met de
hand doet, weet je beter wat er gebeurd.
De configuratie ziet eruit als:
1. Introductie
Het gebruikte protocol is PPP (Point-to-Point-Protocol), de authenticatie
methode is PAP (Password Authentication Protocol) of CHAP
(Cryptographic Handshake Authentification Protocol).
Om beveiligingsredenen hoeven de bellers geen persoonlijke account op de
machine te hebben. Voor de methode die we hier presenteren maakt het
overigens niet uit of de beller een gebruikersaccount op de Linux machine
heeft of niet.
De beschreven configuratie is gebaseerd op een SuSE 6.3 distributie, maar
zou vergelijkbaar op andere systemen moeten werken. Het kan zijn dat
enkele paden aan je lokale systeem moeten worden aangepast.
2. Benodigde hardware en software
Klaar met lezen? Okee, dan gaan we beginnen.
3. Configuratie
Een net-device opzetten
| Part of the /etc/rc.config |
# Commentaren beginnen met een # en worden genegeerd # Witruimte wordt genegeerd # Network configuratie: # Aantal netwerk apparaten; hier worden de apparaten 0 tot 3 gedefinieerd # NETCONFIG="_0 _1 _2 _3" # # IP adressen van de apparaten # IPADDR_0="192.168.0.1" # dit is onze netwerkkaart IPADDR_1="192.168.0.99" # IP voor NETDEV 1 IPADDR_2="192.168.0.98" # IP voor NETDEV 2 IPADDR_3="192.168.0.97" # Het nieuwe NETDEV IP # # Namen van de NETDEVS: # NETDEV_0="eth0" # eth0 = netwerk kaart NETDEV_1="ippp0" # Niet interesant, belt naar onze ISP NETDEV_2="ippp1" # Niet interesant, belt naar onze ISP NETDEV_3="ippp2" # De nieuwe NETDEV is ippp2 # # Parameters voor ifconfig (meer informatie met "man ifconfig" ;-) # IFCONFIG_0="192.168.0.1 broadcast 192.168.0.255 netmask 255.255.255.0 up"# niet interessant IFCONFIG_1="192.168.0.99 dynamic pointopoint 192.168.0.1 up" # niet interessant IFCONFIG_2="192.168.0.98 dynamic pointopoint 192.168.0.1 up" # niet interesant IFCONFIG_3="192.168.0.97 pointopoint 192.168.0.1 metric 1" # De nieuwe NETDEV |
Na het aanpassen van dit bestand start je "SuSEconfig om de veranderingen actief te maken.
Nu bekijken we de nieuwe instellingen bij i4l. Het
configuratiebestand voor ISDN4Linux is (onder SuSE)
/etc/rc.config.d/i4l_default.rc.config
/etc/rc.config.d/i4l_option.rc.config
Andere distributies plaatsen dit ook onder /etc/rc.config. In het
"default" bestand worden alle algemene instellingen opgegeven en in het
"option" bestand stel je de configuratie voor ieder apparaat in
detail in.
Het bestand /etc/rc.config.d/i4l_default.rc.config zou er ongeveer
zo uit moeten zijn:
| Deel van /etc/rc.config.d/i4l_default.rc.config |
# Commentaren beginnen met een # # start ISDN4LINUX? (yes/no) I4L_START="yes" # In Duitsland is 1TR6 wordt soms nog 1TR6 gebruikt, Euro-ISDN komt # meer voor. # D-kanaal protocol 1=1TR6, 2=EDSS1(Euro-ISDN) voor HiSax I4L_PROTOCOL="2" # # Mogelijkheden zijn "auto", "off" of "manual". # off: geen verbindingen inkomend of uitgaand # manual: gebruiker start de verbinding, bijvoorbeeld met # "isdntrl dial ippp0". # auto: verbindt automatisch wanneer nodig # Voor meer informatie zie de documentatie van i4l ;-) I4L_DIALMODE_0="auto" # voor andere devices I4L_DIALMODE_1="auto" # voor andere devices I4L_DIALMODE_2="auto" # voor andere devices I4L_DIALMODE_3="auto" # De NIEUWE NETDEV |
En nu i4l_option.rc.config:
| Part of the /etc/rc.config.d/i4l_default.rc.config |
# IDLE-time alvorens op te hangen, in seconden: # I4L_IDLETIME_0="60" I4L_IDLETIME_1="120" I4L_IDLETIME_2="120" I4L_IDLETIME_3="60" # # Max aantal pogingen alvorens op te geven. Niet belangrijk voor NETDEV3! I4L_DIALMAX_0="5" I4L_DIALMAX_1="5" I4L_DIALMAX_2="5" I4L_DIALMAX_3="5" # # De MSN of EAZ. Voor i4l zijn deze gelijk (in principe). # Als je een telefooncentrale hebt, kan het belangrijk zijn. # Ik heb er een. Het wijst een extern bellend-nummer toe aan een intern # nummer. Als je er geen hebt gebruik je gewoon het nummer waar de NETDEV # op moet reageren. # Deze moet je aanpassen! I4L_LOCALMSN_0="" I4L_LOCALMSN_1="123456" I4L_LOCALMSN_2="123456" I4L_LOCALMSN_3="18" # # Welk nummer moet worden gebeld bij uitbel verbindingen? # Out NETDEV moet een inbel-apparaat zijn, vul hier dus niets in. I4L_REMOTE_OUT_0="" I4L_REMOTE_OUT_1="myProvider 1" I4L_REMOTE_OUT_2="myProvider 2" I4L_REMOTE_OUT_3="" # # Welke nummers worden toegestaan om in te bellen? # Omdat we de toegang controleren met PAP/CHAP laten we dit vrij. Er # zullen genoeg beveiligings-problemen zijn op andere plaatsen. ;-))) I4L_REMOTE_IN_0="" I4L_REMOTE_IN_1="" I4L_REMOTE_IN_2="" I4L_REMOTE_IN_3="" # # Protocol. Synchonous PPP of ... ? -> i4l documentatie! I4L_ENCAP_0="syncppp" I4L_ENCAP_1="syncppp" I4L_ENCAP_2="syncppp" I4L_ENCAP_3="syncppp" # # Opties: # "on" : alleen de opgegeven nummers mogen inbellen # "off" : allle nummers mogen inbellen I4L_SECURE_0="off" I4L_SECURE_1="off" I4L_SECURE_2="off" I4L_SECURE_3="off" |
Nu moeten we een configuratie bestand voor het NETDEV ippp2 maken.
De bestanden, geschreven door Klaus Franken (kfr@suse.de) zijn onderdeel van de SuSE distributie en vormen de
basis voor de volgende configuratie.
Deze bestanden komen met de i4l installatie van YAST, dus spam hem aub
niet. Gedetailleerde commentaren op de instellingen zijn beschreven in de
lokale support database die ook met YAST meekomt!
De bestanden voor het ISDN apparaat staan in /etc/ppp/.
Daar vindt je
/etc/ppp/options - globale instellingen voor PPPD
(man ppp)
/etc/ppp/ioptions - globale instellingen voor PPPD
(man pppd)
/etc/ppp/options.ippp2 - instelllingen voor de gekozen NETDEV
Voor de authenticatie hebben we ook de PAP en CHAP bestanden nodig:
/etc/ppp/pap-secrets - Wij gebruiken alleen PAP authenticatie
/etc/ppp/chap-secrets - Kan simultaan of op zichzelf worden
gebruikt
De authenticatie zelf wordt gedetailleerd beschreven in de manpage van
PPPD en IPPPD. Het wordt aangeraden dit even door te lezen...
Afhankelijk van het aantal ISDN en analoge apparaten zijn er meer bestanden. Laten we de bestanden eens stap voor stap bekijken:
| Deel van /etc/ppp/ioptions |
# Voor meer informatie, zie ook tail -f /var/log/messages # Handig voor het vinden van fouten: debug # Als je het wachtwoord in dit bestand ook wilt loggen, verwijder je het # commentaar-teken op de volgende regel - hopelijk hoeven we er niet op # te wijzen wat dit betekend voor de beveiliging! # +pwlog |
Dat is alles.
Nu configureer je het ippp device dat overeenkomt met je NETDEV.
| Deel van /etc/ppp/ioptions |
# /etc/ppp/options.ippp2 # gebaseerd op het originele script van # Klaus Franken, kfr@suse.de # |
De authenticatie gaat via PAP. Dus heb je alleen deze
/etc/ppp/pap-secrets :
testuser * test nodig.
De structuur is username, remote-host-restricties, plaint-text-wachtwoord, alles gescheiden door tabs.
Nu kan een MsWin98 computer inbellen zonder aanvullende scripts.
Nu moet je i4l herstarten. De configuratie is niet zonder het potentieel
van fouten, dus het kan handig zijn om het volgende script in /usr/bin
te plaatsen:
| restart-isdn |
/sbin/init.d/i4l stop /sbin/init.d/i4l_hardware stop /sbin/init.d/i4l_hardware start /sbin/init.d/i4l start |
De lees- en uitvoer (read en execute) permissies moeten goed staat. Root en misschien de dial-out groep krijgen toegang. Natuurlijk kun je deze commando's ook met de hand in een shell gebruiken.
Nu is het tijd om de inbel verbinding te testen. Met
tail -f /var/log/messages kun je snel zien of alles goed
werkt.
Als alles goed gaat, ziet de uitvoer er ongeveer zo uit:
(opmerking: wij hebben de configuratie intern getest, daarom verschijnt
het nummer **18 (MSN)! Maar als alles op deze werkte, kun je ook extern
inbellen).
| De uitvoer van tail -f /var/log/messages |
isdnlog: Dec 30 18:03:08 * Call to tei 127 from TN **11 on +49 1234/18, myHomeRING (Data)
isdnlog: Dec 30 18:03:08 Call to tei 67 from TN **11 on +49 1234/18, myHome CONNECT (Data)
isdnlog: Dec 30 18:03:08 tei 65 calling TN **18 with ? COLP TN **18
isdnlog: Dec 30 18:03:08 tei 65 calling TN **18 with ? CONNECT
isdnlog: Dec 30 18:03:08 tei 65 calling TN **18 with ? CHARGE: free of charge -
internal call
kernel: isdn_net: ippp2 connected
kernel: isdn_net: chargetime of ippp2 now 2805504
ipppd[188]: Local number: 18, Remote number: , Type: incoming
ipppd[188]: PHASE_WAIT -> PHASE_ESTABLISHED, ifunit: 2, linkunit: 0, fd: 7
ipppd[188]: sent [0][LCP ConfReq id=0x1 <mru 1524> <auth pap> <magic
0xb45a62> <pcomp> <accomp>]
ipppd[188]: rcvd [0][LCP ConfReq id=0x1 <magic 0x58468> <pcomp>
<accomp> <callback 6>]
ipppd[188]: sent [0][LCP ConfRej id=0x1 <callback 6>]
ipppd[188]: rcvd [0][LCP ConfAck id=0x1 <mru 1524> <auth pap>
<magic 0xb45a62> <pcomp> <accomp>]
ipppd[188]: rcvd [0][LCP ConfReq id=0x2 <magic 0x58468> <pcomp> <accomp>]
ipppd[188]: sent [0][LCP ConfAck id=0x2 <magic 0x58468> <pcomp> <accomp>]
ipppd[188]: lcp layer is UP
ipppd[188]: rcvd [0][PAP AuthReq id=0x1 user="testuser" password not logged for security
reasons! Use '+pwlog' option to enable full logging.]
ipppd[188]: Check_passwd called with user=testuser
ipppd[188]: sent [0][PAP AuthAck id=0x1msg="Login ok"]
ipppd[188]: MPPP negotiation, He: No We: No
ipppd[188]: sent [0][IPCP ConfReq id=0x1 <addr 192.168.0.97> <compress VJ 0f 01>]
ipppd[188]: CCP enabled! Trying CCP.
ipppd[188]: CCP: got ccp-unit 0 for link 0 (protocol: 0x80fd)
ipppd[188]: ccp_resetci!
ipppd[188]: rcvd [0][IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr
192.168.0.240> <ms-dns1 0.0.0.0> <ms-wins1 0.0.0.0> <ms-dns2 0.0.0.0>
<ms-wins2 0.0.0.0>]
ipppd[188]: sent [0][IPCP ConfRej id=0x1 <ms-dns1 0.0.0.0> <ms-wins1 0.0.0.0>
<ms-dns2 0.0.0.0> <ms-wins2 0.0.0.0>]
ipppd[188]: rcvd [0][IPCP ConfAck id=0x1 <addr 192.168.0.97> <compress VJ 0f 01>]
ipppd[188]: rcvd [0][IPCP ConfReq id=0x2 <compress VJ 0f 01> <addr 192.168.0.240>]
ipppd[188]: sent [0][IPCP ConfAck id=0x2 <compress VJ 0f 01> <addr 192.168.0.240>]
ipppd[188]: local IP address 192.168.0.97
ipppd[188]: remote IP address 192.168.0.240
|
En als de verbinding wordt gesloten door de remote (M$Win) computer, ziet
het er als volgt uit:
| Uitvoer van tail -f /var/log/messages |
ipppd[188]: rcvd [0][LCP TermReq id=0x3]
ipppd[188]: LCP terminated by peer
ipppd[188]: sent [0][LCP TermAck id=0x3]
isdnlog: Dec 30 18:03:43 Call to tei 67 from TN **11 on +49 1234/18, myHome
Normal call clearing (User)
kernel: isdn_net: local hangup ippp2
kernel: ippp2: Chargesum is 0
ipppd[188]: Modem hangup
ipppd[188]: Connection terminated.
ipppd[188]: taking down PHASE_DEAD link 0, linkunit: 0
ipppd[188]: LCP is down
ipppd[188]: closing fd 7 from unit 0
ipppd[188]: link 0 closed , linkunit: 0
ipppd[188]: reinit_unit: 0
kernel: ippp, open, slot: 2, minor: 2, state: 0000
kernel: ippp_ccp: allocating reset data structure
ipppd[188]: Connect[0]: /dev/ippp2, fd: 7
isdnlog: Dec 30 18:03:45 Call to tei 67 from TN **11 on +49 1234/18, myHome
HANGUP ( 0:00:35 I=250.0 b O=144.0 b)
isdnlog: Dec 30 18:03:45 tei 65 calling TN **18 with ? Normal call clearing (User)
isdnlog: Dec 30 18:03:45 tei 65 calling TN **18 with ? HANGUP ( 0:00:37)
|
Enkele hints:
Problemen:
Als de verbinding na enkele seconden automatisch wordt gesloten en je een
Hybride modem (ELSA Microlink ISDN/TL V.34) gebruikt, ziet
tail -f /var/log/messages er ongeveer zo uit:
| Uitvoer van tail -f /var/log/messages |
ipppd[188]: rcvd [0][proto=0x801] 7f
ipppd[188]: rcvd [0][proto=0x801] af 82 00 03 01 01 03
ipppd[188]: rcvd [0][proto=0x801] 7f
ipppd[188]: sent [0][LCP ConfReq id=0x1 <mru 1524> <auth pap> <ma
gic 0x93b35c1e> <pcomp> <accomp>]
ipppd[188]: rcvd [0][proto=0x801] af 82 00 03 01 01 03
ipppd[188]: rcvd [0][proto=0x801] 7f
ipppd[188]: rcvd [0][proto=0x801] af 82 00 03 01 01 03
ipppd[188]: rcvd [0][proto=0x801] 7f
ipppd[188]: rcvd [0][proto=0x801] af 82 00 03 01 01 03
ipppd[188]: rcvd [0][proto=0x801] 7f
ipppd[188]: sent [0][LCP ConfReq id=0x1 <mru 1524> <auth pap> <ma
gic 0x93b35c1e> <pcomp> <accomp>]
ipppd[188]: rcvd [0][proto=0x801] af 82 00 03 01 01 03
ipppd[188]: rcvd [0][proto=0x801] 7f
ipppd[188]: rcvd [0][proto=0x801] af 82 00 03 01 01 03
ipppd[188]: rcvd [0][proto=0x801] 7f
ipppd[188]: sent [0][LCP ConfReq id=0x1 <mru 1524> <auth pap> <ma
gic 0x93b35c1e> <pcomp> <accomp>]
isdnlog: Dec 30 18:11:52 Call to tei 67 from TN **11 on +49 1234/18, myHome
Normal call clearing (User)
isdnlog: Dec 30 18:11:52 tei 65 calling TN **18 with ? HANGUP ( 0:00:10)
kernel: ippp2: remote hangup
kernel: ippp2: Chargesum is 0
ipppd[188]: Modem hangup
ipppd[188]: Connection terminated.
ipppd[188]: taking down PHASE_DEAD link 0, linkunit: 0
ipppd[188]: sent [0][LCP TermReq id=0x2 6c 69 6e 6b 20 63 6c 6f 73 65 64]
ipppd[188]: LCP is down
ipppd[188]: closing fd 7 from unit 0
ipppd[188]: link 0 closed , linkunit: 0
ipppd[188]: reinit_unit: 0
ipppd[188]: Connect[0]: /dev/ippp2, fd: 7
kernel: ippp, open, slot: 2, minor: 2, state: 0000
kernel: ippp_ccp: allocating reset data structure
isdnlog: Dec 30 18:11:52 Call to tei 67 from TN **11 on +49 1234/18, myHome
HANGUP ( 0:00:11 I=108.0 b O=104.0 b)
|
Reden:
De Hybride modem gebruikt de verkeerde init scripts en dus een "fout"
protocol voor de overdracht.
Verander de init-string zo dat de Hybride modem wordt gedwongen om een
ISDN verbinding op te zetten (AT \N10 zorgt hiervoor), of zorg ervoor dat
je helemaal geen /Nxx parameters gebruikt.
Als je andere problemen (of oplossingen) vindt, laat het ons alsjeblieft
weten!
Wat als het niet werkt? Controleer dan alle entries en/of lees de uitvoer van tail. Lees de documentatie nog eens. Je hebt het gelezen, toch...?
Wat als het nog steeds niet werkt? Als we een vrij moment hebben, zullen
we je helpen. Verder zijn er ook nieuwsgroepen als alt.de.comm.isdn4linux
(Duits) of comp.dcom.isdn (en anderen) waar je je vragen kunt stellen.
Vergeet niet om de interessante delen van de logs en de configuratie
bestanden (oftewel, bewerk de bestanden eerst) bij te voegen.
4. Documentatie:
- man pppd
- man ipppd
- SuSE Support Database
- Nieuwsgroep: alt.de.comm.isdn4linux