Referát: PPP a modemy

Vladimír Grejták, xgrejtak@fi.muni.cz


Obsah


Úvod

Protokol PPP nahradzuje starší SLIP (Serial Line Internet Protocol,
RFC 1055). Na rozdiel od protokolu SLIP umožňuje, aby sa strany dohodli na parametroch spojenia (napr. maximálna džĺka datagramu, maximálna rychlosť), umožňuje autentizáciu. SLIP mohol niesť iba IP. PPP (Point-to-Point Protocol, RFC 1661) bol pôvodne vyvinutý pre zapúzdrenie prenosu IP (prípadne pre IPX) nad 2-bodovými spojmi. Toto zapúzdrenie vychádza z HDLC (High-level Data Link Control) protokolu. Ale služí aj ako štandard pre prideľovanie a následnu manipuláciu s IP adresami, multiplexovanie rôzných sieťových protokolov, konfiguráciu liniek, testovanie liniek a vyjednávanie podmienok pri komunikácii. Schopnosti PPP sa opirajú o LCP (Link Control Protocol - vytvorenie, konfigurácia, testovanie linky) a celú rodinu NCP (Network Control Protocol - konfigurácia a zavedenie protokolov sieťovej vrstvy).

LCP (RFC 1570, RFC 1661) používa 3 druhy paketov

Rodina NCP

Spôsob komunikácie


Kompilácia, inštalácia a nastavenie pppd

Pre použitie PPP musíme mať zakompilovanú jeho podporu v jadre alebo zkompilované príslušné moduly niekde v adresári /lib/modules/<verzia_jadra> ktoré sa nazyvajú:
bsd_comp.o		
ppp_async.o		
ppp_deflate.o		
ppp_generic.o		
ppp_synctty.o		
slhc.o			
Pokiaľ používate jadro rady 2.4, mali by ste vytvoriť zariadenie /dev/ppp.
# mknod /dev/ppp c 108 0
# chmod 600 /dev/ppp
V Linuxu sa pre vytvorenie a správu PPP spojenia používa PPP daemon - pppd. Môžeme ho nainštalovať buď z binárky (.rpm) alebo kompilovať zo zdrojákov. Ukážka kompilácie:
# bzip2 -dc ppp-2.4.1.tar.bz2 | tar -xv
# cd ppp-2.4.1
# ./configure
# make
# make install
Výsledkom by mali byť binárky pppd, pppstats, pppdump a chat v /usr/sbin/, manuálové stránky a dokumentácia a niekoľko skriptov v adresároch /etc/ a /etc/ppp/(zistíme pomocou dpkg -L ppp). Súčasťou balíčku je aj niekoľko utilitek: sú to pon, poff a plog. Používajú sa k naviazaniu, ukončeniu a vypisovaníu PPP spojení. Obvyklé naviazanie spojenia z hľadiska uživateľa vyzerá asi takto:
Pretože PPP vyžaduje nastavenie sieťového zariadenia, zmenu smerovacej tabuľky v jadre , musí takto činiť s oprávnenim roota.
-rwsr-x---    1 root     dialout    173800 Oct 27 08:34 /usr/sbin/pppd
Program pppd môže pracovať v režime server tak aj v režime klient.

Dôležité skripty pre PPP

Všetky okrem posledného môžeme nájsť v balíku ppp-2.4.1.
/etc/ppp/scripts/ppp-on			# zahajuje spojenie k PPP serveru
/etc/ppp/scripts/ppp-on-dialer		# druhá časť skriptu ppp-on
/etc/ppp/scripts/callback		# rozbehne odpovedajúci režim
/etc/ppp/scripts/redialer		# ako ppp-on-dialer ale skúša viac čísel
/etc/ppp/scripts/ppp-off		# ukončí existujúce spojenie
/etc/ppp/options			# parametry spoločné všetkým spojeniam
/etc/ppp/options.ttyXX			# parametry pre každý port zvlášť

Príklad ppp-on skriptu

#!/bin/sh
TELEPHONE=555-1212	# The telephone number for the connection
ACCOUNT=george		# The account name for logon (as in 'George Burns')
PASSWORD=gracie		# The password for this account (and 'Gracie Allen')
LOCAL_IP=0.0.0.0	# Local IP address if known. Dynamic = 0.0.0.0
REMOTE_IP=0.0.0.0	# Remote IP address if desired. Normally 0.0.0.0
NETMASK=255.255.255.0	# The proper netmask if needed
export TELEPHONE ACCOUNT PASSWORD
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
exec /usr/sbin/pppd debug lock modem crtscts /dev/ttyS0 38400 \
    asyncmap 20A0000 escape FF kdebug 0 $LOCAL_IP:$REMOTE_IP \
    noipdefault netmask $NETMASK defaultroute connect $DIALER_SCRIPT

Príklad ppp-on-dialer skriptu

#!/bin/sh
exec chat -v                                            \
        TIMEOUT         3                               \
        ABORT           '\nBUSY\r'                      \
        ABORT           '\nNO ANSWER\r'                 \
        ABORT           '\nRINGING\r\n\r\nRINGING\r'    \
        ''              \rAT                            \
        'OK-+++\c-OK'   ATH0                            \
        TIMEOUT         30                              \
        OK              ATDT$TELEPHONE                  \
        CONNECT         ''                              \
        ogin:--ogin:    $ACCOUNT                        \
        assword:        $PASSWORD

Príklad ppp-off skriptu

#!/bin/sh
if [ "$1" = "" ]; then
        DEVICE=ppp0
else
        DEVICE=$1
fi
if [ -r /var/run/$DEVICE.pid ]; then
        kill -INT `cat /var/run/$DEVICE.pid`
        if [ ! "$?" = "0" ]; then
                rm -f /var/run/$DEVICE.pid
                echo "ERROR: Removed stale pid file"
                exit 1
        fi
        echo "PPP link to $DEVICE terminated."
        exit 0
fi
echo "ERROR: PPP link is not active on $DEVICE"
exit 1

Autentizačné súbory

CHAP a PAP

CHAP - zaistí, že ak sú obe strany už dohodnuté na určitom hesle, tak nieje možné heslo odpočúvať. Funguje to asi tak,že jedna strana pošle [HASH(heslo+soľ),soľ] a overovacia strana spočíta HASH(heslo+soľ), jestliže sa HASH zhoduje, je to vporiadku.

PAP - heslo sa posiela v otevrenej forme.

Pre autentizáciu sa používajú súbory:

/etc/ppp/chap-secrets	# pre Challenge/Handshake Authentication Protocol
/etc/ppp/pap-secrets	# pre Password Authentication Protocol
Obsahujú riadky tvaru klient server heslo akceptovateľná_IP_adresa, kde jednotlivé položky sú od seba oddelené bielym znakom. Poslednú položku na riadku môžeme vynechať, čo znamená, že nám bude dynamicky pridelená IP adresa.
príklad:
prihlasovaciemeno	*	heslo

Príklad prepojenia pomocou null-modemového káblu:


PPP-démon najprv načíta konfiguráciu zo súboru /etc/ppp/options, kde sú uvedené iba parametre, ktoré by sa normálne písali na príkazový riadok.

Na jednej strane sa spustí:

/usr/sbin/pppd 115200 local crtscts lock asyncmap 0 noauth 10.1.1.1:10.1.1.2 /dev/modem
a na druhej
/usr/sbin/pppd 115200 local crtscts lock asyncmap 0 noauth 10.1.1.1:10.1.1.2 /dev/modem passive
Potom sa vytvorí nové ppp0 sieťové zariadenie.

Parametry ppp-démona: 115200
Je maximálna rychlosť, ktorou je ochotný sériový port komunikovať, resp. je to rychlosť, ktorú je schopený váš modem zvládnuť.

modem
To aby pppd vedel, že komunikuje s modemom.

crtscts
Zapne hardwarovú kontrolu toku dat. Ak je vaše pripojenie rýchlejšie ako 9600 bps, určite to použite.

asyncmap 0
Toto číslo je bitová maska, ktorou môžete explicitne zakázať prenos znakov s kódom 0-31. Kôli rychlosti prenosu sa doporučuje nastaviť na 0.

defaultroute
vám nastaví routovaciu tabuľku tak, že ako implicitnú gateway máte ppp0 (IP serveru providera na druhej strane pripojenía).

noipdefault
klasické pripojenie na internet pomocou modemu funguje tak, že vám provider prideľuje ip dynamicky. Keby tu tento parameter nebol, počítač by sa snažil vnutiť providerovi vlastnú IP.

lock
Spôsobí zamknutie /dev/modem, tak zamedzí ostatným programom do neho zapisovať a rušiť tak spojenie.

Vhodný je parameter debug, ktorý značne rozšíri hlášky, ktoré sa píšu do logu, to zjednodušuje ladenie.


Záver

Či linka funguje zistíme pomocou príkazu ifconfig. Výstup by mal obsahovať približne niečo takéto:
ppp0    Link encap:Point-to-Point Protocol
	inet addr:212.11.117.56  P-t-P:212.11.105.2  Mask:255.255.255.255
        UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
	RX packets:414 errors:0 dropped:0 overruns:0 frame:0
	TX packets:461 errors:0 dropped:0 overruns:0 carrier:0
	collisions:0 txqueuelen:3
	RX bytes:208481 (203.5 Kb)  TX bytes:54777 (53.4 Kb)
Pre ďalšie testovanie linky skuste príkazy ping, netstat alebo route.

Program mgetty

Tento program nám dovožuje použíť jeden modem pre príjem hovorov aj vytáčanie, rozpozná hlasovú komunikáciu od datovej.

Po rozbalení zdrojákov ešte pred kompiláciou je nutné vyeditovať súbory Makefile a policy.h (cp policy.h-dist policy.h) a zmeniť ich podľa seba. Potom stačí iba make && make install a môžeme konfigurovať.

Je doporučene spúšťať mgetty zo súboru /etc/inittab:
id:runlevels:respawn:/sbin/mgetty [parametry] <zariadenie>
Niektoré dôležité parametry sú:
-x <level>		# debugging level
-s <speed>		# rychlosť portu
-p <login_prompt>	# prompt pri logováni
-n <rings>		# koľko zvonení než sa začne odpovedať
-i /etc/issue		# pred loginom zobrazí /etc/issue
Konfigurační soubory:
/etc/mgetty+sendfax/mgetty.config	# hlavný konfiguračný súbor
/etc/mgetty+sendfax/sendfax.config	# konfiguracia sendfaxu
/etc/mgetty+sendfax/login.config	# kvôli komu spúštať ktorý program
/etc/mgetty+sendfax/callback.config	# konfigurácia callbacku
/etc/mgetty+sendfax/dialin.config	# kontrola vstupu podľa volajúceho 
Viac podrobností v manuálových stránkach a v súboru policy.h, ktorý ste editovali pred kompiláciou.

AT príkazy

Sada AT príkazov bola vyvinutá spoločnosti Hayes Microcomputer Products za účelom ovládania modemov. Skratka AT pochádza zo slova "attention".

Niektoré dôležité AT príkazy:
ATA           - otvorenie linky a pokus o odpoveď na prichádzajúce spojenie
ATD<cis>      - otvorenie linky a vytočenie čísla <cis>
ATDS=<c1>     - voľba čísla uloženého v pamäti modemu, viz příkaz AT&Z
ATH0          - zavesenie linky
ATL<cis>      - nastavenie hlasitosti modemu, kde <cis> je z {0,1,2,3}
ATP           - pri vytáčaní použíť pulznú voľbu
ATT           - pri vytáčaní použíť tónovú voľbu
ATX<cis>      - štandartne je <cis>=4 a kontroluje sa oznamovací aj obsadzovací signál,
                v prípade chyby skuste ATX3, <cis> je z {0,1,2,3,4}
ATZ<cis>      - reset modemu a načítanie uloženého profilu, nepovinné <cis> je z {0,1}
AT&F<cis>     - nacítanie konfiguracie od výrobcu, nepovinné <cis> je z {0,1}
AT&V          - zobrazenie konfigurácie
AT&W<cis>     - zapísanie aktuálnej konfiguracie do profilu <cis>, <cis> je z {0,1}
AT&Z<c1>=<c2> - uloží do pamäti <c1> číslo <c2>, <c1> je z {0,1,2,3}

Zdroje