Kdyby si každý dělal své vlastní rozhraní a normy, tak by to nedopadlo příliš dobře. Na štěstí je tu standardysované rozhraní pro připojení externích modemů k počítači a toto rozhraní nazýváme RS-232 a je to vlastně sériový port. V důsledku toho mohou být externí modemu připojeny k libovolnému počítači, který má toto rozhraní, a to je v dnešní době i na těch nejstarších počítačích. Kromě externích modemů existují ještě interní modemy. To jsou modemy, které připojujeme přes PCI slot na základní desce počítače. V dnešní době se už většinou používají externí modemy, které se připojují přes USB rozhraní a interní modemy mohou být dokonce integrovány do základních desek počítačů. Kromě klasických modemů už v dnešní době máme modemy hlasové a nejsme v dnešní době vázáni pouze na spojení přes telefonní linku, např. ISDN, optická vlákna,... Modemy už neslouží pouze pro přenos dat mezi dvěmi počítači nebo jako spojení mezi datovým terminálem a počítačem, který chce získat data, v dnešní době se např. používají pro přenos videa a hlasu. To rovněž znamená, že narozdíl od prvotních "nízkých" přenosových rychlostí kolem 300b/s se dnes pohybujeme kolem 28Kb/s či ještě více. Taktéž se dnes používají účinnější techniky pro kompresi dat, detekci chyb a jejich opravy.
Jak to funguje v praxi? Volající modem zavolá na nějaké číslo. Na druhé straně modem zjistí, že na něj někdo "zvoní", takže zvedne linku a
pošle tón o určité délce a na určité frekvenci. Modem na druhé straně zjistí, že mu došel tento tón a řekne si, hmmm tak to je modem. Tóny
se totiž volí tak, aby člověk nemohl vydat takový tón. Modem, který chtěl volat mu odpoví tónem na svoji nosné frekvenci (pokud se vysílá
daný tón, spojení je ustaveno, jinak se zruší). Pokud se nedohodnou, nezjistí se odpověď, posílá první modem na nižší frekvenci. Viz.
předchozí odstavec.
1.3 Normy platné pro modemy
Komunikace mezi dvěmi zařízeními může pracovat pouze pokud jsou obě dvě rozhraní definovaná a schválená. Pro modemy standarty definují
techniky používané pro modulaci, opravu chyb a modulaci a ostatní atributy. Mezi
organizace vydávající standardy definující rozhraní patří ITU (International Telecommunications Union an agency of the United Nations -
Geneva), ISO (International Standards Organization) a CCITT (International Telegraph and Telephone Consultative Comittee a group of ITU).
Standardy modemů byly postupně vyvíjeny a vydávány, nejvíce v USA a to organizací ANSI (American National Standards Institute).
Standardy:
Standard | Rychlost | Druh modulace |
V.21 | 200b/s | FSK |
V.22 | 1200b/s | PSK |
V.22 bis | 2400b/s | QAM |
V.23 | 1200b/s | FSK |
V.26 | 2400b/s | PSK |
V.26 bis | 2400b/s | PSK |
V.26 ter | 2400b/s | PSK |
V.27 | 4800b/s | PSK |
V.27 bis | 4800b/s | PSK |
V.27 ter | 4800b/s | PSK |
V.29 | 9600b/s | QAM |
V.32 | 9600b/s | QAM |
V.32 bis | 14400b/s | TCM |
V.32 ter | 19200b/s | TCM |
V.32 fast | 28800b/s | TCM |
V.34 | 36600b/s | TCM |
V.42 | 57600b/s | TCM |
V.42 bis | 115200b/s | TCM |
Když je počítač nastartován, operační systém nastartuje proces init, který je odpovědný za to, že getty běží na odpovídajících vstup/výstupních zařízeních jako jsou např. virtuální terminály, sériové linky a modemy. Proces init načte svůj konfigurační soubor /etc/inittab, který mu řekne, že /dev/tty2a je kontrolovaný přes mgetty. Vytvoří tedy záznam v /etc/utmp (toto login potřebuje udělat a to je zároveň důvod, proč se nemůžete přihlásit pokud zkoušíte spustit mgetty ručně) a vytvoří nový mgetty proces, který používá uvedenou příkazovou řádku.
Když je mgetty nastartován, nejprve zkontroluje jestli neexistuje odpovídající platný zamykací soubor držený jiným procesem. Pokud tato situace nastane, znamená to, že nějaký jiný program používá uvedený port a mgetty počká až se tento zamykací soubor odstraní. Neplatné zamykací soubory, např. pro neexistující procesy, jsou ignorovány. Jakmile je port volný, mgetty vytvoří svůj vlastní zamykací soubor, inicializuje modem a odstraní zamykací soubor. Nyní mgetty čeká, až se někdo připojí na daný port. Jen taková poznámka, mgetty nečte z uvedeného portu žádné znaky, pouze ověřuje, zda je někdo na portu dostupný pomocí systémových volání poll() nebo select().
Nyní mohou nastat dvě možné situace, co se stane, když dorazí na port znaky. Nějaký jiný program (např. uucico) nastartoval volání ven nebo byl modemem zaslán signál RING. V prvním případě mgetty opustí samotný port. To je jednoduché, pokud volající program vytvoří platný zámykací soubor: mgetty ho najde, počká až se odstraní tento soubor a potom se ukončí. To bude mít za následek, že init způsobí znovuzavolání nového procesu mgetty, který bude čekat na další volání. Ve druhém případě, pokud neexistuje zamykací soubor, mgetty předpokládá, že telefon zvoní, vytvoří zamykací soubor a začne číst dostupné znaky. Jestliže nalezne RING, zvedne telefon zasláním ATA a čeká na zprávu CONNECT. Jestliže se jedná o fax, uloží fax v adresáři FAX_SPOOL_IN (obvykle jím bývá /var/spool/fax/incomming) a ukončí se. Pokud se jedná o modem, vytiskne /etc/issue a zobrazí přihlašovací prompt. Jakmile dostane řetězec s uživatelským jménem, zavolá /bin/login a nechá od této chvíle řízení na něm. Login načte heslo a spustí uživatelský shell, uucico nebo cokoliv jiného, ale mgetty už se o to nestará. Zamykací soubor zůstává, takže žádný jiný program nemůže přistupovat k modemu, když je někdo nalogovaný. Pokud použijeme login.config, tak můžeme pomocí něj nadefinovat spouštění i jiných programů, než je /bin/login. Jakmile je mgetty přerušen ať už z jakéhokoliv důvodu, init může znovu inicializovat port a nastartovat nový mgetty proces, který odstraní všechny zbývající zamykací soubory z předchozího přihlášení.
Řízení přes zamykací soubory je obtížné, ale velmi důležité. Je nezbytné, aby se všechny programy, které používají modem, dohodly
na jednom zamykacím protokolu, jinak nově spuštěný program nemusí vědět, že je modem používán a může se snažit připojit na nějaký jiný modem.
Typicky je zamykací soubor nazýván /usr/spool/uucp/LCK..ttyxx a obsahuje ID procesu, který právě používá modem. Ostatní procesy mohou
číst tento soubor a říci jestli tento zamykací soubor patří existujícímu procesu nebo jestli už tento proces neexistuje a můžeme
tento soubor odstranit.
Konfigurační soubory:
V Linuxu je funkce protokolu rozdělena na dvě části, na vysokoúrovňový ovladač HDLC, který se nachází v jádře operačního systému, a na
démona uživatelského prostoru pppd, který se stará o různé řídící protokoly. Protokol PPP je implementován pomocí speciálního režimu
linky. Chcete-li používat nějakou sériovou linku s protokolem PPP, musíte nejprve vytvořit spojení pomocí modemu a následně převést linku
do režimu protokolu PPP. V tomto režimu budou všechna příchozí data postoupena ovladači protokolu PPP, který ověří platnost rámců
protokolu HDLC, rozbalí je a odešle je. Ovladači jádra operačního systému pomáhá démon pppd, který provádí veškerou inicializační fázi a
fázi ověřování totožnosti.
PPP může běžet jak pro ustanovení PPP spojeni (jako klient) nebo i pro přijímání neznámých hovorů (jako server).
Jádra řady 2.2 obsahují starší verzi PPP jaderného ovladače, který nepodporuje multilink (připojení více spojení najednou). Pokud tuto
vlastnost budete potřebovat, je potřeba použít jádro řady 2.4. Ovladač pro jádro 2.4 byl kompletně přepsán s podporovou multilinku a s podporu operací přes různé komunikační média (ovladač pod jádrem 2.2 povoloval pouze operace nad sériovými porty a zařízeními, která
vypadala jako sériové porty jako jsou např. pseudoterminály).
Pokud máte v jádře zakompilovanou podporu ovladače PPP tak se vám ve výpisu dmesg nebo v adresáři /lib/modules/<verze jádra>
objeví
Zdrojové kódy si můžete stáhnout mimo jiné z adresy www.samba.org/ppp.
4.3 Instalace
Tento balík se opět dodává ve formě rpm (nižší verze, instalace rpm -i mgetty*.rpm) nebo zdrojových kódů, poslední verze je mgetty-1.1.29 a je jej možné stáhnout z tohoto odkazu
www.leo.org. Tento soubor se dá jednoduše rozbalit pomocí
příkazu tar -xzf mgetty1.1.29-Nov25.tar.gz. Vlastní kompilování tohoto balíku je docela jednoduché. Zkopírujte si soubor policy.h-dist
na policy.h a upravte si v něm své lokální nastavení bezpečnostní politiky. Nemusíte se obávat, pokud chcete po nainstalování nějaké
nastavení změnit, jde to jednoduše udělat v souboru mgetty.config. Pro správné nastavení se můžete inspirovat bohatými komentáři v souboru
policy.h. Následně musíte upravit Makefile. V něm je nutné upravit instalační cesty a systémově závislé knihovny. Nyní již stačí pouze
zadat příkaz make pro sestavení programu a make install, pro jeho nainstalování. Pokud si překladač stěžuje na řádky #ident, spusťte
make noident před make install, který se postará o tyto řádky. Pokud dostanete při linkování chybové hlášení "unresolved symbols", musíte
balíku říci, kde máte umístěná systémová volání select(S) nebo poll(S), pomocí přepínačů -DUSE_SELECT nebo -DUSE_POLL v Makefilu (pokud
to nevíte, zkuste použít oba tyto přepínače, dokud nebude chyba odstraněna). Pokud není chyba příbuzná k voláním select() nebo poll(), zjistěte si v
systémových manuálových stránkách, které knihovny jsou linkované a přidejte patřičný argument -l<knihovna> k LIBS.
Pokud přeložíte mgetty s parametrem -DSYSLOG, všechny chybové a logovací zprávy budou ukládány do syslog, pokud to váš systém umožňuje.
4.4 Konfigurační soubory
Z toho, jak mgetty pracuje, je doufám jasné, že potřebujeme záznam v /etc/inittab. Tento záznam pro mgetty je ve tvaru:
id:runlevels:(respawn/off):/usr/local/sbin/mgetty [options] <device>
Výběr pár základních parametrů, které se uvádí v poli options:
Jednoduchý příklad řádku v /etc/inittab: Fla:23:respawn:/usr/local/sbin/mgetty -x 3 tty2a.
Logovací soubory mgetty jsou uloženy na cestě LOG_PATH.<device>, kde LOG_PATH je definována v policy.h.
Standartně jsou uloženy v /var/log/mgetty.ttyxx
5.0 PPP
5.1 Co to je PPP?
PPP (Point to Point Protocol) je protokol sloužící pro posílání datagramů po sériové lince, odstraňující spoustu nedostatků
protokolu SLIP (Serial Line IP). Umožňuje, aby si obě komunikující strany dohodly na začátku parametry spojení jako např. maximální velikost datagramu.
Dále poskytuje ověření totožnosti klienta. Protokol PPP se skládá z několika dalších protokolů. Na nejnižší vrstvě je tzv.
Vysokoúrovňový protokol pro řízení datových spojení (HDLC), který definuje pole jednotlivých rámců protokolu PPP a poskytuje
kontrolní součet. Dále může obsahovat i paket jiných protokolů jako IPX nebo Appletalk a to tak, že k základnímu rámci je přidáno
speciální protokolové pole identifikující typ paketu přenášeného daným rámcem. Dalším protokolem je Protokol pro řízení spojení (LCP)
, který se používá nad protokolem HDLC a slouží ke sjednávání parametrů týkajících se datového spojení jako je např. MRU (Maximum
Receive Unit), určující maximální velikost datagramu, kterou je jedna ze stran ochotna přijmout. Dalšími důležitými protokoly, které se
používají pomocí protokolu PPP jsou protokoly pro ověřování totožnosti: Protokol pro ověřování hesla (PAP) a Protokol na
ověření inicializační výzvy (CHAP). Kromě vlastního posílání IP-datagramů po lince podporuje PPP také tzv. Van Jacobsonovu kompresy hlaviček
IP-paketů, což je technika používající zmenšování hlaviček TCP-paketů až na 3bajty. 5.2 Jaderný ovladač PPP a instalace PPP
Podporu PPP potřebuje mít zakompilovanou podporu v jádře. Pokud tomu tak je, tak můžete tuto část přeskočit a pokračovat instalací PPP.
Jestliže nemáte podporu zakompilovanou v jádře, pak budete muset jádro znovu přeložit. Budete se muset rozhodnout, jestli budete chtít
mít tento ovladač přímo zakompilovanýv jádře a nebo jej budete mít přeložený jako modul. Když je ovladač PPP přímo zakompilovaný, tak se
bude spouštět při startu celého jádra. Pokud je zakompilovaný pouze jako modul, potom je uložen v adresáři /lib/modules v podobě
jednoho nebo více souborů a je natahován do jádra a to jen tehdy, když je potřeba.
K PPP se můžete dostat ve formě rpm, tu stačí jednoduše nainstalovat pomocí příkazu rpm -i ppp-2.4.1.rpm, nebo ve formě zdrojových kódů.
Zdrojové kódy lze jednoduše rozbalit příkazem tar -xzf ppp-2.4.1.tar.gz. Potom již stačí provést v rozbaleném adresáři pouze příkazy
./configure, make a make install. Proto, aby jste mohli provést make install ovšem musíte mít práva roota. Po nainstalování se vám v
adresáři /etc/ppp vytvoří konfigurační soubory PPP.5.3 Nastavení systému pro pppd
Důležité je mít nastavené forwardování paketů (Podívejte se, zda soubor /proc/sys/net/ipv4/ip_forward obsahuje 1, pokud ne
tak ji tam napište, pokud tento soubor ve vašem systému není IPForwarding nastaven. Zkuste jej nastavit v /etc/sysconfig/network nebo /etc/sysctl.conf).
Jádro řady 2.4
Pod jádrem řady 2.4 pppd potřebuje otevřít znakové zařízení /dev/ppp (108,0). Pokud používáte devfs (device filesystem), /dev/ppp bude
automaticky vytvořeno po nahrání modulu ppp_generic nebo hned po startu (pokud je tento modul zakompilován do jádra). Pokud používáte
ppp_generic jako modul, budete muset přidat tento řádek do /etc/devfsd.conf:
LOOKUP ppp MODLOAD
Pokud tento modul nepoužíváte, budete muset toto zařízení vytvořit sami pomocí příkazů: mknod /dev/ppp c 108 0 a chmod 600 /dev/ppp.
Pokud používáte automatické nahrávání modulů a máte PPP přeloženo jako modul, budete muset přidat následující řádky do /etc/modules.conf:
alias | /dev/ppp | ppp_generic |
alias | char-major-108 | ppp_generic |
alias | tty-ldisc-3 | ppp_async |
alias | tty-ldisc-14 | ppp_synctty |
alias | ppp-compress-21 | bsd_comp |
alias | ppp-compress-24 | ppp_deflate |
alias | ppp-compress-26 | ppp_deflate |
alias | tty-ldisc-3 | ppp_async |
alias | ppp-compress-21 | bsd_comp |
alias | ppp-compress-24 | ppp_deflate |
alias | ppp-compress-26 | ppp_deflate |
Protože démon pppd musí běžet pod právy roota, musíte nastavit (poud již nejsou nastavena) práva setuid roota na souboru /usr/sbin/pppd příkazem
chmod u+s /usr/sbin/pppd.
Pokud chcete, aby pppd nemohl spouště každý, nechejte práva na souboru /usr/sbin/pppd bez setuid, vytvořte si v /etc/group novou skupinu,
např. PPP, přidejte této skupině práva na soubory /usr/sbin/pppd, /usr/sbin/ppp-on, /usr/sbin/ppp-off a přidejte si do skupiny PPP pouze
ty uživatele, pro které chcete spouštění pppd povolit.
Příklad jednoduchého souboru /etc/ppp/options:
Pokud nepožadujete autentizaci pomocí CHAP nebo PAP (ty budou probírány až za chvíli), můžete použít dodávané skripty
skripty ppp-on, ppp-on-dialer (ten lze používat i s PAP/CHAP) a ppp-off:
Příklad ppp-on-dialer skriptu:
Příklad ppp-off skriptu
Oproti tomu protokol CHAP je založen na protokolu typu výzva odpověď a nikdy neposílá sdílené tajemství v otevřeném
textu. Server pošle výzvu (řetězec znaků) a klient musí prokázat znalost svého tajemství zasláním hashe ze svého
tajmeství a zaslané zprávy, tím je ověřena jeho identita. CHAP používá konfigurační soubor /etc/ppp/chap-secrets.
Každý řádek je tvaru: uživatel server tajemství, např. libor iris bababa.
ppp0 Link encap: Point-to-Point Protocol
Pro další testování linky můžete použít příkazy ping, netstat a route. Pro ukončení můžete použít skript ppp-off, modem
chvíli po spuštění tohoto skriptu sám zavěsí linku. Pro jistotu ještě zkontrolujte a případně po sobě smažte zámky,
které mohly zůstat v adresáři /var/lock a mají tvar LCK..ttySx.
Pro provozování PPP jako server, musíte přidat nového uživatele ppp do /etc/passwd případně i do /etc/shadow. Dále je
dobré vytvořit ppplogin skript, obsahující něco ve stylu:
#!/bin/sh
mesg zabrání ostatním uživatelům zapisovat do tty při používání, stty vypíná výstup znaků na obrazovku, parametr ppp -detach zajistí
oddělení pppd od kontroly tty, silent znamená, že pppd počká na zaslání paketu předtím než začne odpovídat, modem říká,
že se použije zařízení modem, crtscts vypne hardwarový handshake.
Do /etc/mgetty/login.config přidejte tento řádek:5.4.2 Soubory PPP a jejich příklady
Nyní přistupime ke konfigurování samotného PPP. PPP používá tyto soubory:
V adresáři /etc/ppp najdete soubor options.tpl, který obsahuje bohatě okomentované možnosti nastavení PPP. Podle tohoto soubor by jste si měli
vytvořit soubor /etc/ppp/options a dále soubory /etc/ppp/options.ttyXX pro konfiguraci zařízení ttyXX.
# /etc/ppp/options (bez autentizace PAP/CHAP)
#
# Zabránit pppd forkování na pozadí
-detach
#
# použít kotrolu modemu
modem
# použít zamykací soubory ve stylu uucp pro zajištění exklusivního přístupu k sériovému zařízení
lock
# použít hardwarovou kontrolu toku
crtscts
# vytvořit implicitní cestu pro toto spojení v tabulce cest (routing table)
defaultroute
# nenastavuj kontrolu pomocí Escape sekvencí
asyncmap 0
# použij maximální délku vysílaného paketu 552 bajtů
mtu 552
# použij maximální délku přijímaného paketu 552 bajtů
mru 552
#
#-------konec vzorového soubor /etc/ppp/options (bez autentizace PAP/CHAP)
Tento soubor vám bude jistě fungovat i na vašem systému, pro uzpůsobení však použijte další volby ze šablony options.tpl.
Příklad ppp-on skriptu:
#!/bin/sh
TELEPHONE=555-123456 #telefonní číslo pro připojení
ACCOUNT=libor #uživatelské jméno
PASSWORD=ambruz #heslo pro přihlášení
LOCAL_IP=0.0.0.0 #Lokální IP adresa, jestliže ji znáte, pokud se ale přiděluje dynamicky, uveďte 0.0.0.0
REMOTE_IP=0.0.0.0 #Vzdálená IP adresa, jestliže je vyžadována, normálně uveďte 0.0.0.0
NETMASK=255.255.255.255 #Síťová maska, jestliže je potřeba
export TELEPHONE ACCOUNT PASSWORD
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
exec /usr/sbin/pppd debug lock modem crtscts /dev/ttyS0 38400 \
$LOCAL_IP:$REMOTE_IP \
connect $DIALER_SCRIPT
#!/bin/sh
/usr/sbin/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 \
#!/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 15.4.3 PAP versus CHAP
Pokud budete chtít používat autentizaci, pak nejprve musíte přidat do hlavního konfiguračního souboru /etc/ppp/options řádek
name vaše_jméno jméno_serveru, name říká jméno uživatele, pro kterého je daný řádek platný. Pro autentizaci můžete použít
buď PAP(Password Authentication Protocol) a nebo CHAP(Chalenge Handshake Authentication Protocol).
Jaký je mezi nimi rozdíl? PAP je oproti CHAP méně bezpečný protokol, protože posílá serveru, ke kterému se chce autentizovat
, v čistém textu vaše jméno i heslo a vrací zpět odpověď, zda došlo ke správnému přihlášení. Tento protokol používá konfigurační
soubor /etc/ppp/pap-secrets, kde jsou záznamy ve tvaru:
klient server heslo nepovinný_parametr_akceptované_lokální_IP_adresy, např. libor * ambruz 5.4.4 Klient versus server a spojení s mgetty
Pokud se vám spouštění přes skripty nelíbí a nebo jen pro testovací účely můžete spouštět PPP ručně. Nejprve ustavte spojení
např. pomocí výše uváděného programu Minicom a ukončete jej bez zavěšení linky (C-A Q). Nyní zadejte z příkazové
řádky příkaz pppd -d -detach /dev/ttyS0 38400&. Nyní si můžete ověřit příkazem ifconfig nastavení linky, měli by jste
vidět něco ve stylu:
inet addr:10.144.153.104 P-t-P:10.144.153.51 Mask:255.255.255.255
UP POINTTOPOINT RUNNING MTU:552 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0
TX packets:5 errors:0 dropped:0 overruns:0
mesg n
stty -echo
exec pppd -teach silent modem crtscts5.4.5 Tip jak zkloubit ppp s mgetty
/AutoPPP/ - ppp /usr/sbin/pppd auth -chap +pap login (případně nastavte znamenka opačně, - zakazuje a + povoluje daný způsob
). Nakonfigurujte modem na režim automatické odpovědi příkazem ATS0=3 (toto ovšem není nutné při použití mgetty).
Nakonfigurujte sériové zařízení s getty pro automatickou odpověď, použitím mgetty. Rozhodněte se pro způsob autentizace.
Nakonfigurujte pppd jako server viz. výše. Zvažte routování (routing), pokud jej budete používat, použijte skript ip-up.
Zdroje