Point-To-Point Protokol

Zbyněk VACL, xvacl@fi.muni.cz


Obsah


Úvod

Sériový přenos je přenos dat po jedno vodiči, bity jdou za sebou.
Modem je zařízení, které mění digitální signál na analogový pro přenos po jednom nebo dvou párech vodičů, určených pro přenos zvuku. Máme dva druhy přenosů, synchronní vs. asynchronní. Je nutno zabezpečit výlučný přístup k modemu. Všechny programy, které modem používají musí mít stejnou metodu zamykání (flock(2) nebo přes soubor /var/lock/LCK...)
Synchronní přenos (V.35, X.21 ...) se používá nad pevnými linkami (dvou- nebo čtyřdrát), vysílající musí začít vysílat v pevně daném okamžiku, předávají se taktovací informace.
Asynchronní přenos (RS-232, V.34 ...) se zcela běžně používá pro dial-up spojení, rychlost tohoto spojení je běžně 300 - 115 200 bps, nejlepší čipy dosahují dnes 460 kbps. Asynchronní modemy jsou určeny především pro komutované linky (teoretická propustnost 30 kbps), používají různé komprese (MNP5, V.42bis) a korekce dat (V.42, HST, MNP2-4). Volaný modem řídí vyjednávání o přenosových protokolech. Modemy se ovládají pomocí AT příkazů.
SLIP - Serial Line IP, protokol pro přenos IP datagramů na sériovou linkou.
PPP - Point-to-Point Protokol také slouží pro posílání datagramů nad sériovou linkou, avšak odstraňuje spoustu nedostatků (umožňuje počáteční dohodu na parametrech spojení např. IP adresa, max. velikost datagramu, možnost ověření totožnosti klienta). Specifikace PPP se nalézá v RFC 1548 (request for comments).


AT příkazy

AT příkazy se používají k ovládání modemu, zde je pouze výpis pár nejužívanějších.


Point-to-Point Protokol

Na nejnižší vrstvě protokolu PPP se nachází HDLC - High-Level Data Link Control Protokol, který definuje pole jednotlivých rámců protokolu PPP a poskytuje 16 bitový kontrolní součet. Narozdíl od SLIPu může rámec PPP obsahovat pakety jiných protokolů než IP, např. IPX, Appletalk apod. Je to dáno tím, že k základnímu rámci HDLC protokolu je přidáno speciální protokolové pole, které identifikuje typ přenášeného paketu daným rámcem.

Nad protokolem HDLC se používá LCP - Link Control Protokol ke sjednávání parametrů datového spojení např. MRU - maximum recieve unit, maximální velikost datagramu.

Dalším důležitým krokem ve fázi konfigurace spojení je ověření totožnosti klienta. Není povinné, ale přesto je u většiny linek nabízejících připojení de facto nezbytné. Server obvykle vyzve klienta k ověření své totožnosti za pomocí nějakého tajného klíče. Není-li volající schopen poskytnout správný klíč, je spojení ukončeno. Stejně může žádat identifikaci i klient. Obě tyto procedury jsou na sobě nezávislé. Pro účely těchto dvou různých způsobů ověřování jsou k dispozici dva protokoly PAP - Password Authentication Protocol a CHAP - Challenge/Cryptographic Handshake Authentication Protocol.

Kromě vlastního posílání IP-datagramů po lince podporuje protokol PPP také Van Jacobsonovu kompresi hlaviček IP-datagramů. Používá se por zmenšení velikosti hlaviček Tcp-paketů až na 3 bajty. I použití VJ komprese hlaviček je možno sjednat při spuštění pomocí protokolu IPCP - Internet Protokol Control Protokol.

V Linuxu je funkce rozdělena na dvě části, na ovladač HDLC, který se nachází v jádru a na démona uživatelského prostoru pppd, který se stará o různé řídící protokoly. Protokol PPP je, stejně jako SLIP, implementován pomocí speciálního režimu linky. Chcete-i používat nějakou sériovou linku jako linku s protokolem PPP, musíte nejprve obvyklým způsobem vytvořit spojení s pomocí modemu a následně převést linku do režimu PPP. Pak budou všechna příchozí data postoupena ovladači PPP, který ověří platnost rámců HDLC, rozbalí je a odešle. Ovladači jádra Linuxu pomáhá démon pppd, který provádí veškerou inicializační fázi a fázi ověřování totožnosti.

pppd

/etc/ppp/options - soubor, který pppd vždy prohlíží ještě před analýzou příkazové řádky, je dobré použít tohoto souboru ke specifikaci některých globálních implicitních nastavení, čímž zabráníte vašim uživatelům v nechtěném poškození bezpečnosti systému

auth                   #požaduj autorizaci
usehostname            #pro CHAP použij lokální jméno
lock                   #používej zamykání - vytváří soubor /var/lock/LCK..cua3,
                       #pokud se používá zařízení /dev/cua3
domain fi.muni.cz      #doména lokálního stroje

~/.ppprc - každý uživatel si může specifikovat svoji vlastní množinu voleb v tomto souboru

Skripty, které se vykonají po navázaní PPP spojení a po jeho ukončení - /etc/ppp/ip-up, /etc/ppp/ip-down apod. pro IPX - ipx-up, ipx-down

Typické spuštění
pppd conect "chat -f scriptfile" /dev/cua3 38400 -detach crtscts modem defaultroute


Protokol PAP pracuje v podstatě stejně jako klasická přihlašovací procedura. Klient ověří svoji totožnost tak, že serveru pošle jméno uživatele a (volitelně zašifrované) heslo, tato data server porovná se svou tajnou databází. Lze jej obejít prostým odposloucháváním sériové linky.

/etc/ppp/pap-secrets

#uživatel   server     heslo       požadovaná povolená adresa
mujlogin    mujserver  MojeHeslo   moje.adresa.cz

Protokol CHAP takové nedostatky nemá. Server pošle klientovi náhodně vygenerovaný řetězec s výzvou a svůj název hostitele. Klient na základě názvu hostitele vyhledá příslušné tajné informace a zkombinuje je s přijatou výzvou, zašifruje tento řetězec s pomocí jednosměrné šifrovací funkce. Výsledek pak společně s názve hostitele klienta pošle zpět serveru. Ten provede stejné výpočet a dojde-li k témuž výsledku, povolí klientovi přístup. CHAP také kontroluje totožnost klienta v pravidelných intervalech, aby se ujistil, že klienta někdo nenahradil např. přepnutím tel. linek. Implicitně se démon pppd snaží používat tento protokol pro ověření totožnosti.

/etc/ppp/chap-secrets

#klient server tajemství adresa
#pole adresa může být prázdné = jakýkoliv požadavek na IP adresu bude úspěšný,
#nebo obsahovat '-' = žádný požadavek neprojde,
#nebo specifikovat adresy na než bude požadavek IP adresy úspěšný

jsuklient.cz   jsuserver.cz   "blablabla a jeste bla"
jsuserver.cz   jsuklient.cz   "este neco hloupeho"      -
*              jsuserver2.cz  "dalsi hloupe heslo"      public.jsuserver2.cz


chat - program pro komunikaci s modemem, navázání spojení apod.

script-file - je posloupnost řetězců s významem expect send, za každým send řetězcem je odeslán znak CR.
\<znak> - podobně jako v C
ABORT <řetězec> - je-li na vstupu řetězec, skončí program s chybou
REPORT <řetězec> - řetězec a následující text až do konce řádku je vypsán do souboru zpráv TIMEOUT <číslo> - timeout pro následující řetězec
ABORT RING ABORT BUSY ABORT ERROR ABORT "NO CARRIER"
REPORT CONNECT '' ATZ OK ATDT12345 CONNECT
'' ogin: ppp word: PpP
ogin: ppp word: PpP - program chat čeká na řetězec ogin:, aby nevadilo velké či malé písmeno "L" a poté odešle ppp a opět čeká na word:, pak odešle PpP, jako naše heslo

ABORT RING ABORT BUSY ABORT ERROR ABORT "NO CARRIER" - program se zastaví s chybou, pokud je volaná linka obsazena (BUSY) nebo nezvedá telefon (NO CARRIER) apod.

ogin:-BREAK-ogin: ppp word: PpP - pokud není obdržena výzva ogin: v určitém časovém intervalu, odešle se BREAK, a čeká se na ogin:, pokud se nyní výzva ogin: objeví, bude skript pokračovat běžným způsobem, jinak skončí s chybou, podřetězce jsou odděleny znakem - a mají opět syntaxi expect send


Nastavení serveru

Teoreticky je nutné vytvořit speciální účet ppp, přidělit mu nějaký skript, jakožto přihlašovací příkazový interpreter. Do souboru /etc/passwd přidáme například:

ppp:*:500:200Public PPP Account:/tmp:/etc/ppp/ppplogin
Dále je potřeba nastavit nějaké heslo pro tento účet pomocí passwd.
Příklad přihlašovacího skriptu ppplogin:
#!/bin/bash
#
mesg n   #zabrání zápisu na tty např. pomocí write
stty -echo
exec pppd -detach slient modem crtscts auth

Nejdůležitější ze všech voleb démona pppd je volba -detach, protože zabraňuje odpojení démona od tty. Jinak by pppd přešel do pozadí, tím by se ukončil i skript ppplogin a spojení by se zrušilo.

stty - nastavení terminálové linky, bez parametrů vypíše některé informace o lince a linkové disciplíně

Zbyněk VACL