Protokoly pro sériové linky, SLIP a PPP, umožňují připojení k Internetu i chudším vrstvám.
Kromě modemu a sériového portu vybaveného vyrovnávací pamětí typu FIFO již není zapotřebí žádný další hardware. Jeho použití není o nic složitější, než používání poštovní schránky, a přitom připojení pomocí modemu nabízí za rozumnou cenu stále více soukromých firem.
V systému Linux je dostupný jak ovladač pro protokol SLIP, tak i ovladač pro protokol PPP.
Protokol SLIP je v něm zabudován už poměrně dlouhou dobu a tudíž pracuje poměrně spolehlivě. Ovladač PPP vytvořili teprve nedávno Michael Callahan a Al Longyear. Tento ovladač bude popsán v další kapitole.
Abyste mohli používat protokoly SLIP nebo PPP, bude třeba nastavit několik základních síťových vlastností, které byly popsány v předchozích kapitolách. Přinejmenším musíte nastavit zpětnovazebné rozhraní a povolit službu pro rozlišení názvů. Když se budete připojovat k Internetu, budete samozřejmě chtít používat systém DNS. Nejjednodušší způsob, jak toho docílit, spočívá ve vložení adresy nějakého jmenného serveru do souboru resolv.conf.
Jakmile bude aktivováno spojení pomocí protokolu SLIP, bude poslán dotaz tomuto serveru.
Čím blíže bude název tohoto serveru od místa, ze kterého voláte, tím lépe.
Toto řešení však není optimální, protože všechna vyhledávání názvů budou využívat spojení SLIP/PPP. Pokud vám dělá starosti šířka pásma, která je k tomuto účelu využívána, můžete nastavit tzv. caching-only jmenný server. Ten ve skutečnosti neobsluhuje doménu, ale působí pouze jako prostředník pro všechny dotazy systému DNS, které pochází z vašeho hostitele. Výhodou tohoto schématu je vytvoření vyrovnávací paměti, kdy je většina dotazů posílána po sériové lince pouze jednou. Soubor named.boot pro tento server vypadá podobně jako následující výpis:
; soubor named.boot pro caching-only server
directory /var/named
primary 0.0.127.in-addr.arpa db.127.0.0 ; zpětnovazebná síť
cache . db.cache ; kořenové servery
K tomuto souboru named.boot musíte v souboru db.cache nastavit korektní sezname kořenových jmenných serverů. To je popsáno na konci kapitoly Konfigurace resolveru.
Dial-up IP-servery často nabízejí službu SLIP pomocí speciálních uživatelských účtů. Po přihlášení k takovému účtu nejste vpuštěni do nějakého obecného uživatelského rozhraní; namísto toho je spuštěn program nebo skript rozhraní, který povolí na serveru pro danou sériovou linku ovladač SLIP a nakonfiguruje patřičné síťové rozhraní. Totéž se musí provést na vaší straně spojení.
V některých operačních systémech je ovladač SLIP speciálním uživatelským programem; v operačním systému Linux je součástí jádra systému, takže je výrazně rychlejší. Je však nutné, aby byla sériová linka explicitně převedena do režimu SLIP. To se provede pomocí speciálního tty režimu linky, tzv. SLIPDISC. Je-li zařízení tty v normálním režimu linky (DISC0), bude si vyměňovat data pouze s uživatelskými procesy pomocí standardních volání read(2) a write(2) a ovladač SLIP nebude schopen zapisovat nebo číst ze zařízení tty. V režimu SLIPDISC jsou role obráceny: nyní nebude moci zapisovat nebo číst ze zařízení žádný uživatelský proces, ale všechna data přicházející na sériový port budou přímo předána ovladači SLIP.
Vlastní ovladač protokolu SLIP rozumí množství variací protokolu SLIP. Kromě běžného protokolu SLIP ovládá také protokol CSLIP, který u odcházejících IP-paketů provádí tzv. Van Jacobsonovu kompresi hlaviček.
To výrazně zvyšuje propustnost dat při interaktivní práci. Mimoto existují i šestibitové verze obou těchto protokolů.
Jednoduchý způsob, jak zkonvertovat sériovou linku do režimu SLIP, spočívá ve využití nástroje slattach. Předpokládejme, že máte modem nastaven na /dev/cua3 a že jste se úspěšně přihlásili k serveru SLIP. Potom spustíte následující příkaz:
# slattach /dev/cua3 &
Tento příkaz přepne linku cua3 do režimu SLIPDISC a připojí ji k jednomu ze síťových rozhraní SLIP. Je-li to vaše první aktivní spojení pomocí protokolu SLIP, bude linka připojena k rozhraní sl0; další bude připojena k rozhraní sl1 atd. Aktuální verze jader operačního systému podporují až osm současných spojení pomocí protokolu SLIP.
Implicitní zapouzdření, které vybere příkaz slattach je protokol CSLIP. K volbě některého jiného režimu lze použít argument -p. Chcete-li používat standardní protokol SLIP (bez komprese), pak byste měli použít následující příkaz:
# slattach -p slip /dev/cua3 &
Další volitelné režimy jsou: cslip, slip6, cslip6 (pro šestibitové verze protokolu SLIP) a adaptive pro adaptivní protokol SLIP. Poslední volba nechává nalezení typu zapouzdření protokolu SLIP, který používá vzdálený počítač, na jádru operačního systému.
Pamatujte, že musíte používat stejný typ zapouzdření, jaký používá váš protějšek. Pokud například hostitel cowslip používá protokol CSLIP, musíte ho použít také. Neshody jednotlivých verzí protokolu SLIP mohou například způsobit, že příkaz ping použitý na vzdáleného hostitele neobdrží zpátky žádné pakety. Pokud nějaký jiný hostitel spustí příkaz ping s vaším jménem, může se na vaší konzole objevit zpráva "Can´t build ICMP header." Jeden ze způsobů, jak se vyhnout takovýmto komplikacím, spočívá v použití adaptivního protokolu SLIP.
Příkaz slattach ale nepovoluje jen použití protokolu SLIP, ale také jiné druhy protokolů, jako jsou například protokoly PPP nebo KISS (další protokol používaný v síti ham radio). Chcete-li více detailů, nahlédněte prosím na manuálovou stránku k příkazu slattach(8).
Jakmile lince přiřadíte ovladač protokolu SLIP, musíte nakonfigurovat síťové rozhraní. Opět k tomu využijeme standardní příkazy ifconfig a route. Předpokládejme, že jsme se z brány vlager připojili k serveru jménem cowslip. Pak je nutné spustit následující sekvenci příkazů:
# ifconfig sl0 vlager pointopoint cowslip
# route add cowslip
# route add default gw cowslip
První příkaz nastaví rozhraní na spojení s hostitelem cowslip na typ point-to-point, druhý a třetí příkaz přidá směrování na hostitele cowslip a implicitní směr, přičemž bude hostitele cowslip využívat jako bránu.
Při rušení spojení pomocí protokolu SLIP musíte nejprve odstranit všechna směrování přes hostitele cowslip. K tomu slouží příkaz route s volbou del. Potom je nutné odpojit rozhraní a poslat nástroji slattach signál zavěšení. Následně byste měli znovu zavěsit modem pomocí svého terminálového programu:
# route del default
# route del cowslip
# ifconfig sl0 down
# kill -HUP 516
Až sem to bylo poměrně jednoduché. Přesto však možná budete chtít výše uvedené kroky zautomatizovat natolik, aby bylo možné celý postup vyvolat pouze jediným příkazem. K tomuto účelu slouží nástroj dip.
Aktuální číslo verze tohoto nástroje je 3.3.7. Ta však byla velmi často upravována a pozměňována, takže vlastně nemůže být o nějakém nástroji dip ani řeč.
Doufejme, že tyto odlišnosti budou začleněny do budoucí verze. Nástroj dip je interpretem jednoduchého skriptového jazyka, který se může starat o modem, nastavovat linku do režimu SLIP a konfigurovat různá rozhraní. Je to poměrně primitivní a omezující, ale ve většině případů to stačí. Doufejme, že některá nová verze nástroje dip bude obsahovat všestrannější jazyk.
Aby bylo možné konfigurovat rozhraní SLIP, musí být nástroji dip přidělena práva superuživatele. Tei to možná vypadá, že pokud nastavíte nástroji dip práva superuživatele, budou se moci všichni uživatelé spojit s libovolným serverem SLIP, aniž by měli přidělena přístupová práva superuživatele. To je velmi nebezpečné, protože nastavení faleiných rozhraní a implicitních směrů pomocí nástroje dip může výrazně poškodit směrování ve vaší síti. A co je ještě horší, vaši uživatelé tím získají možnost spojení s libovolným serverem SLIP a budou moci provádět nebezpečné útoky na vaši síť. Pokud tedy chcete umožnit svým uživatelům provozovat spojení pomocí protokolu SLIP, napište pro každý plánovaný server SLIP malé obslužné programy a teprve z těchto programů volejte nástroj dip s konkrétním skriptem, který založí spojení SLIP. Až potom lze těmto programům bezpečně nastavit práva superuživatele.
Na obrázku 7.1 vidíte vzorový skript. Lze ho použít ke spojení s hostitelem cowslip. Nástroj dip je možné spustit s argumentem, který bude obsahovat název skriptu:
# dip cowslip.dip
DIP: Dialup IP Protocol Driver version 3.3.7 (12/13/93)
Written by Fred N. van Kempen, MicroWalt Corporation
connected to cowslip.moo.com with addr 193.174.7.129
#
Po spojení s hostitelem cowslip a povolení protokolu SLIP se proces dip odpojí od terminálu a dále bude spuštěn na pozadí. Potom můžete začít používat normální síťové služby po lince SLIP. Chcete-li spojení ukončit, vyvolejte nástroj dip s parametrem -k. Tento příkaz pošle procesu dip signál zavěšení, přičemž použije záznamy identifikačního čísla procesu dip,
které se nacházejí v souboru /etc/dip.pid:
# Jednoduchý dip script pro volání hostitele cowslip
# Nastav místní a vzdálené jméno a adresu
get $local vlager
get $remote cowslip
port cua3 # volba sériového portu
speed 38400 # maximální rychlost
modem HAYES # typ modemu
reset # reset modemu a tty
flush
# Příprava na vytočení
send ATQ0V1E1X1\r
wait OK 2
if $errlvl != 0 goto error
dial 41988
if $errlvl != 0 goto error
wait CONNECT 60
if $errlvl != 0 goto error
# Nyní jsme spojeni
sleep 3
send \r\n\r\n
wait ogin: 10
if $errlvl != 0 goto error
send Svlager\r
wait ssword: 5
if $errlvl != 0 goto error
send hey-jude\n
wait running 30
if $errlvl != 0 goto error
# Nyní jsme přihlášeni a vzdálený hostitel spustil SLIP.
print Connected to $remote with address $rmtip
default # Nastavení implicitní směrové cesty
mode CSLIP # Spuštění protokolu SLIP
# v případě chyby pokračujte zde
error:
print SLIP to $remote failed.
# kill -k
Obrázek 7.1 Vzorový skript k nástroji dip
Ve skriptovém jazyku nástroje dip znamenají klíčová slova, před nimiž je uveden symbol dolaru, názvy proměnných. Nástroj dip má předdefinovanou skupinu proměnných, která bude uvedena níže. Například proměnné $remote a $local obsahují názvy místního a vzdáleného hostitele, kteří se účastní spojení pomocí protokolu SLIP.
První dva příkazy ve vzorovém skriptu jsou příkazy get, které reprezentují způsob, jakým nástroj dip nastavuje proměnné. Zde je nastaven název místního a vzdáleného hostitele vlager, resp. cowslip.
Dalších pět řádek nastavuje terminálovou linku a modem. Příkaz reset pošle modemu inicializační řetězec; u modemů kompatibilních se standardem Hayes odpovídá tento řetězec příkazu ATZ. Další příkaz nastaví odpovědi modemu tak, aby přihlašovací sekvence, která následuje na dalších řádcích, pracovala správně. Tato přihlašovací sekvence je poměrně přehledná: nejdříve se vytočí číslo 41 988, což je telefonní číslo hostitele cowslip a hostitel se přihlásí na účet Svlager s heslem hey-jude. Příkaz wait způsobí prodlevu nástroje dip, protože tento bude čekat na vstup odpovídající řetězci, který je uveden v prvním argumentu; číslo uvedené v druhém argumentu odpovídá době, po kterou se bude čekat v případě, že se nepodaří získat hodnotu odpovídající prvnímu argumentu. Příkaz if průběžně uváděný v přihlašovací proceduře kontroluje, zda při spouštění příkazu nedošlo k chybě.
Posledními příkazy spouitinými po přihlášení jsou default, jenž nastaví u spojení SLIP implicitní směr na všechny hostitele, a mode, jenž povolí na dané lince režim SLIP a nakonfiguruje rozhraní a směrovací tabulku.
I když je nástroj dip velmi rozšířen, není zatím příliš dobře zdokumentován. Proto v této stati uvádíme popis většiny příkazů nástroje dip. Přehled všech dostupných příkazů získáte, když nástroj dip spustíte v testovacím režimu zadáním příkazu help. Chcete-li zjistit syntaxi příkazu, stačí ho zadat bez argumentů; samozřejmě, že Výše uvedené nefunguje u příkazů, které nemají žádné argumenty.
$dip -t
DIP: Dialup IP Protocol Driver version 3.3.7 (12/13/93)
Written by Fred N. van Kempen, MicroWalt Corporation
DIP> help
DIP knows about the following commands:
databits default dial echo flush
get goto help if init
mode modem parity print port
reset send sleep speed stopbits
term wait
DIP> echo
Usage: echo on|off
DIP>
V průběhu následujícího výkladu budou řádky začínající řetězcem DIP> ukazovat, jak se zadává příslušný příkaz v testovacím režimu a následující řádky pak budou zobrazovat jeho výstup. Příklady, které příkazovou řádku neobsahují, by měly být chápány jako výpisy skriptu.
Nástroj dip poskytuje značný počet příkazů pro konfiguraci sériové linky a modemu. Význam některých z nich je zřejmý, například příkaz port, který vybírá sériový port, nebo příkazy speed, databits, stopbits a parity, které nastavují obecné parametry linky.
Příkaz modem volí typ modemu. V současné době je jediným podporovaným typem modemu typ HAYES (velká písmena jsou vyžadována). Nástroji dip musíte poskytnout typ modemu, v opačném případě by totiž odmítl spustit příkazy dial a reset. Příkaz reset posílá modemu vstupní inicializační řetězec; použitý typ řetězce závisí na vybraném typu modemu.
U modemů kompatibilních se standardem HAYES je tímto řetězcem příkaz ATZ.
Příkaz flush slouží ke smazání všech odpovědí, které modem v minulosti poslal. V opačném případě by mohl být přihlašovací skript, který následuje po příkazu reset, ipatný, protože modem by mohl číst odpovědi OK z předchozích příkazů.
Příkaz init vybírá inicializační řetězec, který bude předán modemu před začátkem vytáčení. Implicitním řetězcem pro modemy kompatibilní se standardem HAYES je "ATE0 Q0 V1 X1", který zapne zobrazování příkazů, dlouhé kódy výsledků a nastaví volání naslepo (bez detekce vytáčecího tónu).
Nakonec pošle příkaz dial modemu inicializační řetězec a vytočí číslo vzdáleného systému. Implicitním vytáčecím příkazem pro modemy kompatibilní se standardem HAYES je příkaz ATD.
Příkaz echo slouží jako ladící prostředek, protože použití příkazu echo on způsobí, že nástroj dip bude na konzole zobrazovat vše, co je posíláno na sériové zařízení. Tuto vlastnost lze opět zrušit příkazem echo off.
Nástroj dip také umožňuje dočasně opustit skriptový režim a vstoupit do terminálového režimu. V tomto režimu lze nástroj dip používat jako jakýkoliv jiný běžný terminálový program. Můžete v něm zapisovat na sériovou linku nebo z ní číst. Chcete-li tento režim opustit, stiskněte kombinaci kláves Ctrl + ].
Příkaz get používá nástroj dip k nastavování proměnných. Nejjednodušším způsobem je nastavit proměnnou jako konstantu, což je používáno ve Výše uvedeném příkladu. Můžete ale také požádat uživatele, aby hodnotu zadal. K tomu slouží klíčové slovo ask, které je nutno uvést na místě hodnoty proměnné:
DIP> get $local ask
Enter the value for $local: _
Třetí metoda spočívá v pokusu o získání této hodnoty ze vzdáleného hostitele. Na první pohled to vypadá zvláštně, ale v některých případech je tento způsob velmi užitečný: Některé servery SLIP vám nedovolí při spojení pomocí protokolu SLIP používat vlastní IP-adresu.
Místo toho vám při každém přihlášení přidělí nějakou adresu ze seznamu adres a zobrazí zprávu, která vás bude o přidělené adrese informovat. Pokud tato zpráva vypadá podobně jako "Your address: 193.174.7.202", umožní vám následující část kódu nástroje dip zvolit vlastní adresu:
... login chat ....
wait address: 10
get $locip remote
Tento příkaz umožňuje vypsat text na konzolu, ze které byl spuštěn nástroj dip. V rámci příkazu print lze použít libovolné proměnné definované v nástroji dip, například:
DIP> print Using port $port at speed $speed
Using port cua3 at speed 38400
Nástroj dip rozumí pouze předdefinované skupině proměnných. Název proměnné vždy začíná symbolem dolaru a musí být psán malými písmeny.
Proměnné $local a $locip obsahují název místního hostitele a IP-adresu. Po nastavení názvu hostitele uloží nástroj dip do proměnné $local kanonický název hostitele a zároveň přiřadí proměnné $locip odpovídající IP-adresu. Analogický proces probíhá, když nastavujete proměnnou $locip.
Proměnné $remote a $rmtip provádí totéž s názvem vzdáleného hostitele a jeho IP-adresou.
Proměnná $mtu obsahuje hodnotu MTU pro dané spojení.
Tyto proměnné jsou jedinými proměnnými, kterým mohou být přímo přidělovány hodnoty pomocí příkazu get. Dalších proměnné lze nastavovat pouze za pomoci odpovídajících příkazů, nicméně i tyto proměnné lze používat v rámci příkazu print; konrétně se jedná o proměnné $modem, $port a $speed.
Proměnná $errlvl umožňuje přistupovat k výsledku naposledy spuštěného příkazu. Návratová hodnota rovná nula značí úspěšnou operaci, zatímco nenulová hodnota naznačuje chybnou operaci.
Příkaz if představuje podmíněné větvení. Jeho syntaxe je následující:
if var op number goto label
Výraz musí být jednoduchým porovnáním jedné z proměnných $errlvl, $locip a $rmtip a celočíselné hodnoty; operátorem op může být jeden z následujících operátorů: ==, !=, <, >, <= a >=.
Příkaz goto umožní, aby provádění skriptu pokračovalo na řádce následující po daném návěstí. Návěýtí musí být uvedeno na začátku řádku a bezprostředně za ním musí následovat dvojtečka.
Tyto příkazy pomáhají implementovat do nástroje dip jednoduché skripty s rozhovorem. Příkaz send zapíše své argumenty na sériovou linku. Nepodporuje žádné proměnné, avšak rozumí všem kombinacím znaků s převráceným lomítkem, které pocházejí z jazyka C, jako je například \n a \b. Znak vlnovky (~) je používán jako zkratka pro návrat vozíku/nová řádka (CR/LF).
Argumentem příkazu wait je slovo a jeho funkce spočívá v monitorování všech vstupů po sériové lince, dokud se dané slovo neobjeví. Vlastní slovo nemůže obsahovat žádné mezery.
K příkazu wait můžete přidat i druhý nepovinný argument, který bude reprezentovat délku trvání příkazu; pokud nebude očekávané slovo obdrženo v daném časovém limitu, příkaz skončí a nastaví proměnnou $errlvl na hodnotu 1.
Příkaz sleep slouží k nastavení časové prodlevy, například aby nástroj dip trpělivě vyčkal na dokončení přihlašovací procedury. Tento interval je opět zadáván v sekundách.
Tyto příkazy se používají k přepnutí sériové linky do režimu SLIP a ke konfiguraci rozhraní. Příkaz mode je posledním příkazem spuitiným v nástroji dip předtím, než se nástroj dip přepne do režimu démona.
Příkaz mode přijímá jako argument název protokolu. Nástroj dip v současné době akceptuje jako korektní názvy protokolů SLIP a CSLIP. Aktuální verze nástroje dip bohužel neakceptuje adaptivní protokol SLIP.
Jakmile na sériové lince povolíte režim SLIP, spustí nástroj dip příkaz ifconfig, aby nastavil rozhraní jako spojení typu point-to-point, a dále zavolá příkaz route, který nastaví směrování ke vzdálenému hostiteli.
Pokud skript navíc spustí před příkazem mode i příkaz default, nastaví nástroj dip také implicitní směr pro spojení pomocí protokolu SLIP.
Nastavení klienta s protokolem SLIP bylo poměrně obtížné. Nastavení protějýku, konkrétně takové konfigurace vašeho hostitele, aby se choval jako server SLIP, je mnohem jednodušší.
Jedním ze způsobů, jak to provést, je použit nástroj dip v režimu server. Toho dosáhnete za pomoci nástroje diplogin. Jeho hlavním konfiguračním souborem je soubor /etc/diphosts, který sdružuje přihlašovací jména s adresou, která je danému hostiteli přidělena. Alternativně můžete používat i nástroj sliplogin, který je odvozen z balíku BSD a umožňuje mnohem pružnější konfigurační schéma, na jehož základě lze spouštět skripty daného rozhraní kdykoliv se hostitel připojí nebo odpojí. V současné době je tento nástroj ve fázi beta.
Oba programy vyžadují, abyste pro každého klienta SLIP nastavili jeden přihlašovací účet.
Předpokládejme, že poskytujete službu SLIP panu Arthuru Dentovi, který má adresu dent.beta.com. Účet s názvem dent vytvoříte tak, že do souboru passwd přidáte následující řádku:
dent:*:501:60:Arthur Dent‚s SLIP
account:/tmp:/usr/sbin/diplogin
Potom byste měli pomocí utility passwd nastavit heslo pro účet dent.
Když se nyní uživatel dent přihlásí, spustí se nástroj dip v režimu server. Aby nástroj dip zjistil, zda je tento uživatel oprávněn používat službu SLIP, vyhledá jeho jméno v souboru /etc/diphosts. Tento soubor popisuje přístupová práva a parametry spojení každého uživatele služby SLIP. Vzorová položka pro uživatele dent vypadá takto:
dent::dent.beta.com:Arthur Dent:SLIP,296
První pole oddělené dvojtečkou reprezentuje název účtu, pod kterým se musí uživatel přihlásit. Druhé pole může obsahovat dodatečné heslo (viz níže). Třetí pole obsahuje název hostitele nebo IP-adresu volajícího hostitele. Dále následuje informační pole, které nemá žádný speciální význam (prozatím). Poslední pole popisuje parametry spojení. Obsahuje seznam oddělený čárkou, který určuje používaný protokol (momentálně bui SLIP, nebo CSLIP), a za ním následuje hodnota MTU.
Když se uživatel dent přihlásí, nástroj diplogin si o něm vytáhne informace ze souboru diphosts, a pokud není druhé pole prázdné, vyzve ho k zadání "externího bezpečnostního heslaia. Řetězec zadaný uživatelem pak porovná s (nezaišfrovaným) heslem v souboru diphosts. Pokud nesouhlasí, bude pokus o přihlášení zamítnut.
V opačném případě začne nástroj diplogin s přepnutím sériové linky do režimu CSLIP nebo SLIP a nastaví také rozhraní a směrování. Toto spojení trvá až do té doby, kdy se uživatel odpojí a modem zavěsí linku. Poté nástroj diplogin přepne linku zpět do normálního režimu a skončí.
Nástroj diplogin vyžaduje speciální uživatelská práva. Pokud nástroji dip nepřidělíte práva superuživatel, měli byste nástroje diplogin a dip od sebe oddělit (například vytvořením samostatné kopie nástroje diplogin) a nepoužívat je při jednoduchém spojení společně. V takovém případě mohou být nástroji diplogin přidělena přístupová práva, která neovlivní práva nástroje dip.