7.15.11. Konfiguracja połączenia przy wykorzystaniu ISDN

ISDN to system telefonii cyfrowej dostępny już na rynku od dłuższego czasu. Urządzenia do jego obsługi mogą występować w kilku formach:

Tutaj zajmiemy się przypadkiem drugim - kart rozszerzeń, oraz konfiguracją do działania zarówno jako serwer i klient dla połączeń przy wykorzystaniu sieci ISDN.

7.15.11.1. Konfiguracja karty

Pierwszym etapem jest konfiguracja samej karty ISDN. Obecnie w jądrze Linuksa istnieją dwa podsystemy do obsługi urządzeń ISDN: isdn4linux oraz mISDN (modular ISDN). Konfigurację oprzemy na pierwszym z nich ponieważ jest standardowo dostępny w jądrach Debiana, natomiast mISDN wymaga kompilacji dodatkowych modułów.

Musimy odnaleźć moduł odpowiedni dla danej karty. Większość kart jest wspieranych przez moduł HiSax. Na podstawie pliku /usr/src/linux/Documentation/isdn/README.HiSax lub strony http://www.linuxpowered.com/html/editorials/isdn/hisaxreadme.html musimy odnaleźć odpowiedni identyfikator typu dla posiadanej karty (np. dla karty opartej na układzie HFC 2BDS0 PCI będzie to 35).

Lista przetestowanych kart: Sekcja 3.14.

W Debianie należy utworzyć plik w katalogu /etc/modprobe.d/ o nazwie np. isdn z zawartością:

options hisax protocol=2 type=35
gdzie w miejsce 35 wpisujemy znaleziony typ. Po utworzeniu pliku można załadować moduł poleceniem:
modprobe hisax

W RedHacie tworzymy plik /etc/sysconfig/isdncard o zawartości:

MODULE=hisax
RESOURCES="protocol=2 type=35"
po czym restartujemy serwis isdn:
service isdn restart
(musimy także pamiętać o tym, by serwis ten był ładowany w czasie uruchamiania komputera - możemy to zrobić np. przy użyciu narzędzia ntsysv).

Po tych operacjach karta terminala ISDN jest już gotowa do dalszej konfiguracji.

7.15.11.2. Konfiguracja systemu Debian

Należy zadbać o to, by były zainstalowane następujące pakiety:

isdnutils-base
isdnlog
ipppd
(są one dostarczone z naszą dystrybucją).

Poniżej zamieszczamy zalecane odpowiedzi na pytania zadawane w trakcie instalacji tych pakietów:

Po zakończeniu instalacji konieczne jest również poprawienie pliku /etc/isdn/isdn.conf ponieważ kod kraju ustawiany jest nieprawidłowo. Należy wpisać:

COUNTRYCODE = 48

Pliki konfiguracyjne ISDN znajdują się w katalogu /etc/isdn/. Z każdą kartą powiązane są dwa interfejsy ippp, które mogą być wykorzystywane niezależnie. Dla każdego interfejsu potrzebne są dwa pliki konfiguracyjne device.ipppX i ipppd.ipppX. Pierwszy z nich ustawia parametry urządzenia, drugi zawiera opcje dla daemona ipppd. Poniżej zamieszczamy przykładową konfigurację. Pliki te można również utworzyć przy pomocy narzędzia isdnconfig. Tworzy ono przykładową konfigurację, którą należy dostosować do własnych potrzeb.

Najpierw omówiona zostanie konfiguracja połączeń wychodzących. Zwykle sprawia ona mniej problemów może więc posłużyć do przetestowania karty.

7.15.11.2.1. Połączenia wychodzące

Konfiguracja urządzenia device.ipppX

#!/bin/sh

set -e

# Adresy IP.
# Jezeli sa przydzielane dynamicznie nalezy pozostawic wartosci
# domyslne. W wypadku gdy sa statyczne nalezy je wpisac.
LOCALIP=169.255.255.169	# IP klienta
REMOTEIP=10.0.0.2	# IP serwera

# Numery telefonow
LOCALMSN=203123456 	# numer lokalny
REMOTEMSN=221345789	# numer serwera z kierunkowym, bez 0
			# moze byc lista rozdzielona spacjami
LEADINGZERO=0		# dodawane do numeru serwera

# Tryb pracy urzadzenia, nie zmieniac.
DIALMODE=auto

# Czy ustawiac default route na to urzadzenie?
DEFROUTE=1

# urzadzenie - ipppX
devnums=`basename $0`; devnums=${devnums##device.ippp}
device=ippp$devnums


dowhat="$1"

masterslave="$2"
case "x$masterslave" in
    xmaster)	master=true;  slave=false;;
    xslave)	master=false; slave=true; masterdevice="$3";;
    x)		master=false; slave=false;;
    *)		echo "Error, $0 called with unknown 2nd arg '$masterslave', aborting!"
    		exit 1;;
esac

# Configuration (start)

case "$dowhat" in
start)
    [ -f /proc/sys/net/ipv4/ip_dynaddr ] && echo 5 > /proc/sys/net/ipv4/ip_dynaddr

    # Utworzenie interfejsu
    if $slave
    then	isdnctrl addslave ${masterdevice} ${device}
    else	isdnctrl addif ${device}
    fi

    # Ustawienie MSN
    isdnctrl eaz ${device} $LOCALMSN

    # Ustawienie numeru, pod ktory dzwonimy
    if [ ! -z "$REMOTEMSN" ]; then
	for MSN in $REMOTEMSN; do
	    isdnctrl addphone ${device} out $LEADINGZERO$MSN
	done
    fi

    # Rozlaczanie po X sekund nieaktywnosci, 0 wylaczone
    isdnctrl huptimeout ${device} 0

    # Enkapsulacja
    isdnctrl encap ${device} syncppp

    # Protokoly
    isdnctrl l2_prot ${device} hdlc
    isdnctrl l3_prot ${device} trans

    # Gadatliwosc isdn, UWAGA dotyczy wszystkich urzadzen
    isdnctrl verbose 2

    # zwiazanie z deamonem ipppd
    bindnum=`expr $device : 'ippp\(.*\)'` || true
    if [ ! -z "$bindnum" ]; then
	isdnctrl pppbind ${device} $bindnum
    fi

    # KONFIGURACJA SIECI

    if ! $slave; then
	ifconfig ${device} $LOCALIP pointopoint $REMOTEIP netmask 255.255.255.255
	set +e	# ignore errors from here on

	route del -host $REMOTEIP ${device} 2>/dev/null
	route add -host $REMOTEIP ${device}

	# default route
	if [ "$DEFROUTE" = 1 ]; then
	    route del default 2>/dev/null
	    route add default netmask 0 ${device}
	fi

    fi # not slave

    if $slave
    then	isdnctrl dialmode $device auto      >/dev/null 2>&1
    else	isdnctrl dialmode $device $DIALMODE >/dev/null 2>&1
    fi
    ;;

# Usuwanie interfejsu
stop)
    set +e

    isdnctrl dialmode $device off >/dev/null 2>&1

    if ! $slave; then
	route del $REMOTEIP $device	2> /dev/null

	# usuwanie default route
	if [ "$DEFROUTE" = 1 ]; then
	    route del default netmask 0 2>/dev/null
	fi
	ifconfig $device down	2> /dev/null
	isdnctrl delif $device	2> /dev/null
    fi
    ;;

*)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac

exit 0
W docelowym pliku należy ustawić:

  • numery telefonów w zmiennych LOCALMSN i REMOTEMSN - odpowiednio lokalny i zdalny,

  • adresy ip - jeśli są znane, w przeciwnym wypadku pozostawić domyślne,

  • czy urządzenie ma być wykorzystywane jak domyśla brama (zmienna DEFROUTE).

Konfiguracja daemona ipppd ipppd.ipppX

# Komunikaty daemona
debug			# wlacz dodatkowe komunikaty
kdebug 1		# poziom logowanych komunikatow

lcp-restart 1		# Set timeout for LCP 

# Autoryzacja
user ppp		# nazwa uzytkownika
noauth			#

# Kompresja wylaczona
noccp
nolzs

# Adresy IP
noipdefault
netmask 255.255.255.255

# Routing
nohostroute		# nie ustawiaj routingu

#usepeerdns		# uzyj serwerow dns podanych przez interfejs

mru 1524		# maksymalny rozmiar odbieranych pakietow
mtu 1500		# maksymalny rozmiar wysylanych pakietow

ipcp-accept-local	# Accept peer's address for us 
ipcp-accept-remote	# Accept peer's address for it 
Przedstawione ustawienia powinny umożliwić nawiązanie połączenia. Konieczne jest ustawienie nazwy użytkownika (user) oraz dodatnie wpisu z hasłem do pliku /etc/ppp/pap-secrets w postaci:
nazwa_użytkownika   *	hasło *
na przykład:
ppp * ppp *
Nie należy dodawać opcji defaultroute nawet gdy połączenie ISDN będzie podstawowym łączem. Routing ustawiany jest przez skrypt device.ipppX. Do bardziej zaawansowanej konfiguracji routingu wykorzystuje się skrypty:
/etc/ppp/ip-up.d/00-ipppd
/etc/ppp/ip-down.d/99-ipppd

7.15.11.2.2. Połączenie przychodzące

Konfiguracja urządzania device.ipppX

#!/bin/sh

set -e

# Adresy IP.
LOCALIP=192.168.8.1	# IP serwera
REMOTEIP=192.168.8.8	# IP klienta

# Numery telefonow
LOCALMSN=203123456 	# numer serwera bez 0
REMOTEMSN='*'		# akceptowane numery klientow, * - wszystkie

LEADINGZERO=0		# dodawane do numeru serwera

# Tryb pracy urzadzenia, nie zmieniac.
DIALMODE=auto

# Czy ustawiac default route na to urzadzenie?
DEFROUTE=0

# urzadzenie - ipppX
devnum=`basename $0`; devnums=${devnum##device.ippp}
device=ippp$devnum


dowhat="$1"

masterslave="$2"
case "x$masterslave" in
    xmaster)	master=true;  slave=false;;
    xslave)	master=false; slave=true; masterdevice="$3";;
    x)		master=false; slave=false;;
    *)		echo "Error, $0 called with unknown 2nd arg '$masterslave', aborting!"
    		exit 1;;
esac

# Configuration (start)

case "$dowhat" in
start)
    [ -f /proc/sys/net/ipv4/ip_dynaddr ] && echo 5 > /proc/sys/net/ipv4/ip_dynaddr

    # Utworzenie interfejsu
    if $slave
    then	isdnctrl addslave ${masterdevice} ${device}
    else	isdnctrl addif ${device}
    fi

    # Ustawienie MSN
    isdnctrl eaz ${device} $LOCALMSN

    # Ustawienie numeru, pod ktory dzwonimy
    if [ ! -z "$REMOTEMSN" ]; then
	for MSN in $REMOTEMSN; do
	    isdnctrl addphone ${device} out $LEADINGZERO$MSN
	done
    fi

    # Rozlaczanie po X sekund nieaktywnosci, 0 wylaczone
    isdnctrl huptimeout ${device} 0

    # Enkapsulacja
    isdnctrl encap ${device} syncppp

    # Protokoly
    isdnctrl l2_prot ${device} hdlc
    isdnctrl l3_prot ${device} trans

    # Gadatliwosc isdn, UWAGA dotyczy wszystkich urzadzen
    isdnctrl verbose 2

    # zwiazanie z deamonem ipppd
    bindnum=`expr $device : 'ippp\(.*\)'` || true
    if [ ! -z "$bindnum" ]; then
	isdnctrl pppbind ${device} $bindnum
    fi

    # KONFIGURACJA SIECI

    if ! $slave; then
	ifconfig ${device} $LOCALIP pointopoint $REMOTEIP netmask 255.255.255.255
	set +e	# ignore errors from here on

	route del -host $REMOTEIP ${device} 2>/dev/null
	route add -host $REMOTEIP ${device}

	# default route
	if [ "$DEFROUTE" = 1 ]; then
	    route del default 2>/dev/null
	    route add default netmask 0 ${device}
	fi

    fi # not slave

    if $slave
    then	isdnctrl dialmode $device auto      >/dev/null 2>&1
    else	isdnctrl dialmode $device $DIALMODE >/dev/null 2>&1
    fi
    ;;

# Usuwanie interfejsu
stop)
    set +e

    isdnctrl dialmode $device off >/dev/null 2>&1

    if ! $slave; then
	route del $REMOTEIP $device	2> /dev/null

	# usuwanie default route
	if [ "$DEFROUTE" = 1 ]; then
	    route del default netmask 0 2>/dev/null
	fi
	ifconfig $device down	2> /dev/null
	isdnctrl delif $device	2> /dev/null
    fi
    ;;

*)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac

exit 0
Podobnie jak przy połączeniach wychodzących należy ustawić prawidłowy numer telefonu linii, do której podłączony jest modem, oraz adresy IP. Zmienna REMOTEMSN odpowiada za numery, z których połączenia będą akceptowane. * oznacza, że przyjmowane będą wszystkie połączenia.

Uwaga! Komunikaty

kernel: isdn_net: ippp0: No phone number, signalling dst_link_failure
...
kernel: isdn_tty: Incoming call without CPN, assuming '0'
kernel: isdn_tty: call from 846385042 -> 0 ignored
oznaczają, że modem odbierający połączenie nie otrzymuje informacji pod jaki numer dzwoni modem nawiązujący połączenie. W tej sytuacji należy ustawić LOCALMSN na 0.

Konfiguracja daemona ipppd.ipppX

# Komunikaty daemona
debug			# wlacz dodatkowe komunikaty
kdebug 1		# poziom logowanych komunikatow

lcp-restart 1		# Set timeout for LCP 

# Autoryzacja
auth
+pap

# Kompresja wylaczona
noccp
nolzs

# Adresy IP
192.168.8.1:192.168.8.8	# serwer:klient
netmask 255.255.255.255

# Routing
nohostroute		# nie ustawiaj routingu

#usepeerdns		# uzyj serwerow dns podanych przez interfejs

mru 1524		# maksymalny rozmiar odbieranych pakietow
mtu 1500		# maksymalny rozmiar wysylanych pakietow
Przed uruchomieniem należy sprawdzić czy adres IP w pliku device.ipppX jest zgodny z ipppd.ipppX.

7.15.11.3. Konfiguracja systemu RedHat

Poniżej omówiona zostanie konfiguracja dla systemu RedHat 7.3. Ten sposób konfiguracji może być również wykorzystany jako alternatywa dla Debiana w wypadku, gdy podany wyżej opis nie zadziała.

Mając skonfigurowany terminal, możemy spróbować połączyć się z czymś na zewnątrz. Do połączenia się z naszym ulubionym dostawcą (TPSA - numer 0-202422) można wykorzystać następujący skrypt (/opt/szarp/bin/isdn-up-out.sh):

#!/bin/sh

if [ x$1 = x ]; then
  devicenum=0
  device=ippp0
else
  devicenum=$1
  device=ippp$1
fi

#numer telefonu
number=0202422

#konfiguracja dla dial-out
isdnctrl addif $device
isdnctrl addphone $device out $number
isdnctrl huptimeout $device 0
isdnctrl l2_prot $device hdlc
isdnctrl l3_prot $device trans
isdnctrl encap $device syncppp
/usr/sbin/ipppd \
  user ppp \
  ipcp-accept-local ipcp-accept-remote noipdefault lock \
  mru 1500 mtu 1500 usepeerdns useifip \
  /dev/$device
isdnctrl pppbind $device $devicenum
ifconfig $device up
i możemy go wywołać np. tak:
/opt/szarp/bin/isdn-up-out.sh 0

Musimy jeszcze skonfigurować hasło dla użytkownika ppp. Robimy to poprzez dodanie do pliku /etc/ppp/pap-secrets linijki:

ppp "*" ppp
W tym momencie terminal już jest skonfigurowany do połączeń z tpsa. W celu dokonania właściwego połączenia wywołujemy komendę:
isdnctrl dial ippp0
Możemy jeszcze ustawić właściwy routing:
route add default ippp0
Jeśli będziemy chcieli się rozłączyć, to wystarczy wywołać coś takiego:
isdnctrl hangup ippp0

Uruchomienie połączeń przychodzących wymaga trochę innego skryptu: (/opt/szarp/bin/isdn-up-in.sh):

#!/bin/sh

if [ x$1 = x ]; then
  devicenum=0
  device=ippp0
else
  devicenum=$1
  device=ippp$1
fi

#konfiguracja dla dial-in
isdnctrl addif $device
isdnctrl eaz $device 19
isdnctrl addphone $device in "*"
isdnctrl huptimeout $device 0
isdnctrl l2_prot $device hdlc
isdnctrl l3_prot $device trans
isdnctrl encap $device syncppp
/usr/sbin/ipppd \
  auth +pap \
  proxyarp netmask 255.255.224.0 192.168.8.1:192.168.8.8 \
  mru 1500 mtu 1500 usepeerdns useifip \
  /dev/$device
isdnctrl pppbind $device $devicenum
ifconfig $device up
Wywołujemy go podobnie jak poprzedni:
/opt/szarp/bin/isdn-up-in.sh 0
Musimy jeszcze skonfigurować hasło dla użytkownika ppp. Robimy to poprzez dodanie do pliku /etc/ppp/pap-secrets linijki:
ppp "*" ppp
W tym momencie terminal już jest skonfigurowany do przyjmowania połączeń przychodzących.

Może się także zdarzyć, iż chcemy, by na danej maszynie istniały obydwie konfiguracje. Wtedy wystarczy, iż wywołamy coś takiego:

/opt/szarp/bin/isdn-up-out.sh 0
/opt/szarp/bin/isdn-up-in.sh 1

W tym momencie powinniśmy już mieć możliwość jednoczesnego dzwonienia i przyjmowania połączeń.

Jeśli chcemy, by połączenia były konfigurowane przy starcie systemu musimy dodać wywołania skryptów isdn-up-*.sh do /etc/rc.local (RedHat). Możliwe jest jednoczesne używanie połączeń przychodzących i wychodzących. Należy tylko zadbać aby numer urządzeń w wywołaniach skryptów były różne (np. 0 - wychodzące, 1 - przychodzące).

W Debianie uruchomienie połączeń przy starcie systemu można uzyskać tworząc skrypt/etc/isdn/device.ipppX o następującej zawartości:

#!/bin/sh

#prefix - skąd skrypty do isdn (kopiowane z palca)
prefix=
#dir - kierunek (in/out)
dir=out
#id - nr device'a (0/1 - ippp0/ippp1)
id=0

case "$1" in
    start)
        /opt/szarp/$prefix/isdn-up-$dir.sh $id
    ;;
    stop)
        /opt/szarp/bin/isdn-down.sh $id
    ;;
    *)
        echo "$0: (start|stop)"
        exit 1
    ;;
esac
W miejsce X i do zmiennej id przypisujemy numer urządzenia. By przetestować konfigurację wywołujemy:
invoke-rc.d isdn restart