- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 08-09/98

Linux 2.1 a sítě

Martin Mareš, 10. září 1998

Úvod

Již přibližně dva roky probíhá práce na vývojové řadě linuxových kernelů 2.1 a v současné době směřuje k vyvrcholení v podobě stabilního release 2.2. Za tuto dlouhou dobu se změnily spousty věcí v prakticky všech koutech jádra, nevyjímaje ani síťové subsystémy, ba naopak značné procento změn bylo právě v nich.

Tento článek se snaží formou alespoň trochu přehlednou čtenáři osvětliti, co nového přináší Linux 2.1 (respektive co přinese Linux 2.2) ohledně sítí ve srovnání s předchozí stabilní verzí 2.0. Původně byl tento text přednesen v květnu 1998 jako referát v rámci Linuxového semináře MFF UK http://sunsite.mff.cuni.cz/linux/seminar/Linux.shtml. Zde se autor snaží o poněkud systematičtější a úplnější podání téhož tématu.

Při rozsahu síťové podpory v Linuxu a zejména pak při rozsahu diskutovaných novinek jsou pouze dvě možnosti, jak tento článek může dopadnout: buďto bude neúplný (prostě se o méně důležitých či méně zajímavých věcech nebude zmiňovat) a nebo bude sáhodlouhý, nudný a většina čtenářů jej před polovinou odloží jako vyčerpávající, a to nejen téma. Pokusil jsem se vybrat si variantu první jakožto menší z obou zel.

TCP/IP

V oblasti TCP/IP se toho změnilo snad nejvíce. Prakticky celý kód obhospodařující tuto sadu protokolů se dočkal přepsání od základu (někdy i několikanásobného), obvykle zásluhou největšího ze síťových mágů Alexeje Kuzněcova.

Jelikož klasické UNIXové (z BSD UNIXu pocházející) příkazy již dlouhou dobu nepostačují (nejen implementačně, ale zejména svou "dinosauří" koncepcí neberoucí příliš na vědomí dávno již běžné věci jako je např. classless routing ke konfiguraci všech parametrů linuxového TCP/IP, vznikla nová utilita krátkého a výstižného jména ip http://ftp.gts.cz/FTP/pub/MIRRORS/ftp.inr.ac.ru/ip-routing/ syntaxí v mnoha ohledech podobná příkazům routerů firmy Cisco http://www.cisco.com a pro používání velice šikovná. Leč bohužel zatím bez jediného řádku dokumentace, nepočítaje v to zabudovaný help popisující syntaxi příkazů.

Třídy adres (v dnešním světě mající význam čistě historický) již nejsou v kernelu podporovány, při zakládání routy či konfiguraci interfacu je již nutno zadat vedle adresy také netmask či délku prefixu.

Četné parametry protokolů je nyní možno nastavovat přes sysctl, případně pomocí interfacu v /proc/sys/net přímo ze shellu. Viz dokumentace od utility ip :-)

Socket Hashing

Před delší dobou se k uším Davida Millera doneslo, že FreeBSD má několikanásobně rychlejší přiřazování příchozích packetů ke spojením než měl tehdejší Linux. Po cca týdnu práce vznikl nový kód pro socket hashing, který tyto věci řeší několikanásobně rychleji než FreeBSD.

IP Aliasing

Zcela se změnila podpora aliasů zařízení (původní eth0:1 apod.). Dnes již původní aliasy neexistují, leč každá síťová karta může mít mimo primární IP adresy ještě libovolně mnoho adres sekundárních. Původní interface s dvojtečkami ve jménech zařízení byl zachován pro kompatibilitu, nicméně v detailech se mírně liší.

IP Routing

Linux již nemá jedinou routovací tabulku, ba naopak tabulek může existovat více a za pomoci konfigurovatelných pravidel je možno vybírat pro každý příchozí packet, podle které tabulky bude routován, a to na základě zdrojové a cílové adresy a dalších parametrů, jako je například TOS (Type Of Service) a interface, ze kterého packet přišel. Tento mechanismus umožňuje velice pěkným způsobem implementovat jak policy based routing, tak routing by TOS i spoustu jiných triků.

Rovněž při přiřazení IP adresy interfacu automaticky vznikají device routy a při odkonfigurování samy mizí. Toto se připravovalo již pro kernel 2.0, nicméně kvůli problémům s kompatibilitou to bylo odloženo o release později.

K dispozici je Equal Cost Multipath, to jest distribuce packetů mezi několik ekvivalentních položek v routovací tabulce.

TCP

TCP bylo rovněž prakticky od základu přepsáno, z většiny zásluhou Davida Millera. Nyní má o dost lepší logiku timeoutů a retransmitů a zejména podporuje několik nově standardizovaných rozšíření:

  • SACK (Selective Acknowledge) - výhodný pro linky mající vysokou chybovost.
  • Window Scaling - užitečný na spojích, které jsou rychlé, ale přitom mají značné zpoždění (typicky například satelitní kanály).
  • Timestamps - napomáhají lépe poznat charakter spoje a díky tomu též zvolit lepší strategii timeoutů.

Firewalling

Stejně jako verze 2.0, i 2.1 přináší zcela přepracovaný systém firewallingu. Do kernelu byla konečně zařazena podpora IP Firewalling Chains http://www.adelaide.net.au/~rustcorp/ipfwchains/ umožňující řetězení filtrů (což je jednak rychlejší, jednak snazší na údržbu). Tato změna opět není zpětně kompatibilní, firewall je nyní nutno konfigurovat novým programem ipfwchains. Podrobnosti viz článek v čísle 3/1998 Linuxových novin.

Masquerading

Přibyla podpora pro překlad adres v dalších protokolech, rovněž pak možnost ošetřovat překlad protokolů prostřednictvím démona běžícího mimo kernel (viz balík ipautofw ftp://ftp.netis.com/pub/members/rlynch/).

Masquerading se nyní konfiguruje pomocí programu ipmasqadm http://juanjox.home.ml.org/.

K dispozici je též Port Forwarding http://www.monmouth.demon.co.uk/ipsubs/portforwarding.html umožňující přesměrovávat vybraná TCP spojení na zadaný stroj a zadaný port (užitečné například tehdy, chcete-li mít WWW server za firewallem na počítači s interní adresou a forwardovat všechna spojení s portem 80 firewallu na tento počítač). Konfiguruje se programem ipportfw ftp://ftp.compsoc.net/users/steve/ipportfw/linux21/.

Network Address Translation (NAT)

V souvislosti s novým routovacím kódem je podporováno překládání IP adres, prozatím pouze případy s navzájem jednoznačným přiřazením. (Tedy můžete si kupříkladu nechat překládat část adres interní sítě na veřejně dostupné adresy bez rekonfigurace interních počítačů.)

Plánuje se sjednocení tohoto mechanismu s masqueradingem, což přinese možnost jak statického, tak dynamického překladu libovolného počtu adres na libovolný jiný počet.

Tunneling

Linux se též naučil lépe tunelovat (packety, nikoliv banky - zdá se, že studiem kvantové ekonomie se linuxoví hackeři dosud nezabývají). K dispozici je jak klasický protokol IP in IP (nyní ovšem výrazně lépe implementovaný), tak GRE (Generic Routing Encapsulation, umožňuje tunelování různých protokolů, multicasting, soft state management apod.) a SIT (Simple Internet Transition, přenos IPv6 přes IPv4).

Fast Switching

Tato značně experimentální feature umožňuje přímý přenos packetů mezi buffery jednotlivých síťových karet bez "přestupu" v hlavní paměti, což znatelně urychluje routing. Autor (již zmiňovaný Alexej Kuzněcov) tvrdí, že pak jeho vesměs normální PC má jen o 30% menší propustnost při forwardování než routery Cisco řady 7200. Bohužel zatím je tato vymoženost dostupná pouze se síťovými kartami vybavenými chipsetem Digital 21140 (DECChip Tulip) či 8390 (nutná speciální podpora v driveru).

IP Autoconfiguration

Automatická konfigurace IP prostřednictvím protokolů BOOTP či RARP již není spojena s NFS-rootem a lze ji používat i samostatně.

Netlink

Netlink je nový mechanismus pro komunikaci mezi uživatelskými programy (nejčastěji routovacími démony) a síťovou vrstvou. Umožňuje mimo jiné:

  • Přenos změn v routovací tabulce, takže již není nutné periodicky scanovat celou (možno i několikamegabytovou) tabulku.
  • Dozvídat se o událostech typu interface up, interface down apod.
  • Přenos packetů, které neprošly firewallem (např. pro detailní analýzu útoků).

IP version 6

Linux 2.1 podporuje nový protokol IPv6 http://playground.sun.com/pub/ipng/html/ipng-main.html, který by měl během pár let zvolna začít nahrazovat původní IPv4 a zbavit tak svět problémů spojených s růstem Internetu.

IPv6 v kernelu funguje bez větších problémů (i když tento protokol samozřejmě dosud není tak vyladěný jako IPv4 a je v neustálém vývoji), ovšem na slušnou podporu v aplikacích si budeme muset ještě nějakou dobu počkat.

Viz též Linux IPv6 FAQ/HOWTO. http://www.linuxhq.com/IPv6/index.html

Berkeley Packet Filter (BPF)

Přeci jen jsme se v něčem inspirovali systémem BSD: Generic Packet Filtering. Tato feature umožňuje uživatelským programům posílat kernelu packetové filtry v jednoduchém byte-kódu a tak si vybírat, které packety je zajímají a které ne. Nezbývá než doufat, že se tcpdump a podobné programy tuto vymoženost brzy naučí používat, a nebudou tak ztrácet drahocenný čas procesoru přenášením packetů, které samy po triviální analýze zahodí.

Drivery

Přibyla spousta nových driverů síťových karet a ještě větší množství jich bylo aktualizováno. Viz stránka o driverech http://cesdis.gsfc.nasa.gov/linux/drivers/ od Donalda Beckera.

Též se začínají objevovat drivery na některé synchronní sériové karty, zejména pak zásluhou Alana Coxe.

Soundmodem

Příznivci packet radia nyní mohou používat softwarové packet modemy využívající zvukovou kartu jako A/D a D/A převodník. Za tuto možnost Linux vděčí Thomasi Sailerovi. Zdrojové texty soundmodemů jsou velice zajímavým čtením... Na druhou stranu Linux dosud nepodporuje (a po delší diskusi na mailing-listu kernelových vývojářů to vypadá, že ani podporovat nebude) tak řečené WinModemy, což jsou "vylevněné" částečně softwarové modemy pro běžné telefonní linky. Hlavním důvodem je notorická neochota firem tyto modemy vyrábějící k jakékoliv spolupráci.

Syscall sendfile

Přibyla nová systémová služba umožňující kopírování dat mezi souborem a libovolným file-handlem. Nejedná se sice o čistě síťovou záležitost, nicméně právě u síťových aplikací to může být velice užitečné (např. FTP server posílající data přímo ze souboru do socketu bez kopírování přes adresní prostor FTP daemona).

Síťové filesystémy

NFS

Implementace NFS (Network File System firmy SUN) doznala značných změn. Nyní má podstatně lepší cacheování a též by měl být schopen fungovat přes TCP.

Na druhou stranu, NFS je sice podporováno v UNIXovém světě prakticky každým systémem, leč je to neobyčejně mizerně navržený protokol, který již dlouhá léta čeká na někoho, kdo bude mít dost odvahy na to, aby jej nahradil něčím lepším. Máte-li o práci na podobném projektu zájem, neváhejte a ozvěte se autorovi tohoto článku http://atrey.karlin.mff.cuni.cz/~mj/plist.html.

Kernel NFS Server (knfsd)

Olaf Kirch vytvořil NFS server běžící v kernelu. Na první pohled by se mohlo zdát, že to je krásný příklad něčeho, co se má řešit jako user-level daemon, ale bohužel, Olafovo řešení je podstatně rychlejší (ušetří se kopírování všech dat mezi kernelem a adresním prostorem příslušného démona). Na druhou stranu, možná by stálo za zamyšlení, jestli by se podobné rychlosti nedalo dosáhnout šikovným použitím (a případně rozšířením) mechanismu sendfile.

CODA

Linux nyní má i implementaci distribuovaného filesystému CODA. Bližší informace viz stránky projektu CODA http://www.coda.cs.cmu.edu/.

Automounter (autofs)

Konečně důstojná náhrada za starého auto-mount daemona (amd), to jest něco, co umožňuje spolehlivě automaticky mountovat disky při prvním pokusu o přístup do daného adresáře.

Svět Novellu

Stran podpory sítí světa novellského máme pouze dvě novinky: jednou je podpora protokolu SPX (Sequence Packet Exchange) a druhou pak všemožná vylepšení NCPFS.

Poměrně podrobné povídání o těchto věcech je v květnových Linuxových novinách.

Packet Socket

Původní metoda přímého přístupu k packetům (opět podivné dědictví z archaických UNIXů) byla nahrazena metodou rozumnou a konsistentní, konkrétně zavedením nového protokolu PF_PACKET, který umožňuje přímo vysílat i přijímat jak kompletní link-level packety, tak packety zbavené linkových hlaviček.

Důsledky: tcpdump již nemusí podporovat všechny existující linkové vrstvy - když link layer nepozná, prostě si nechá packety posílat "rozbalené" a obsahu porozumí. Konečně je možné čistě implementovat servery, jakož i klienty pro BOOTP a DHCP a neuchylovat se kvůli tomu k podivným trikům typu přiřazování nulové IP adresy interfacu, což stejně s kernelem 2.1 nefunguje.

Packet Scheduling

Významným přínosem je zavedení nastavitelných a vyměnitelných packet queue managerů pro jednotlivá síťová zařízení. Pro každý interface si nyní můžete vybrat, jak přesně bude spravována jeho odchozí fronta a jak se budou řešit případy, kdy místo na packety bude docházet. Tento mechanismus řeší hned několik problémů najednou:

  • QoS (Quality of Service) - spojení o zaručené propustnosti, prioritní toky, spolupráce s protokolem RSVP a jiné vymoženosti.
  • Load Balancing - distribuce zátěže mezi několik interfaců vedoucích stejným směrem, náhrada za původní equalizer device a rozumná alternativa k Equal-Cost Multipath. Řeší se velice jednoduše: interfacům, mezi něž chceme rozdělovat tok dat, nastavíme speciální queue mód a vytvoříme virtuální interface, který bude fungovat jako zdroj dat pro tuto frontu.
  • TOS - priorita packetů je automaticky zvolena na základě jejich Type Of Service.

K tomuto všemu je ještě nutné přidat algoritmus, který packetům přiděluje jejich priority. Můžete si vybrat z následujících možností:

  • klasifikace dle routovacích pravidel - každé z pravidel pro výběr routovací tabulky může rovněž volit prioritu.
  • klasifikace dle firewallu - firewallové tabulky mohou rovněž přidělovat prioritu packetů.
  • RSVP - klasifikace dle údajů zasílaných RSVP daemonem.
  • U32 - přímé matchování dat v hlavičkách packetů. Universální, ale pomalejší než ostatní možnosti.

Vše se konfiguruje novou utilitou tc, dokumentace jako obvykle zatím žádná.

Acorn Econet

Podporován jest i Econet, podivná to proprietární síť navržená a používaná firmou Acorn, a to jak po původních kartách od Acornu, tak po jiných sítích (dárkové balení v UDP).

WAN Router

Linux 2.1 rovněž obsahuje kostru kódu pro WAN routing - na ni se mohou "přivěšovat" modulární drivery pro Frame Relay a jiné WAN protokoly.

Viz stránka o X.25 a Frame-Relay síťování http://users.skynet.be/kribonne/linux-x.25/index_old.html.

X25 a LAPB

Ti nešťastníci, kteři potřebují používat síťě založené na protokolu X25 (opravdu je lituji, něco tak mizerně navrženého jsem snad v životě neviděl ... možná s výjimkou NFS :-)), naleznou jistou podporu tohoto archaismu, čítaje v to i LAPB (nižší vrstva určená pro spolehlivý přenos datagramů "na dostřel").

Network Block Device

Pavel Machek stvořil driver, který po TCP spojení emuluje blokové zařízení (zatím bez ioctl a podobných fines, nicméně vcelku použitelně). Viz domácí stránka projektu NBD http://atrey.karlin.mff.cuni.cz/~pavel/nbd/nbd.html.

Z oddělení špatných zpráv: Ani NBD nepomůže k bezbolestnému (čtěte: nepadajícímu) swapování po síti. K tomu jsou nutné netriviální změny v memory-managementu a ty se rozhodně hned tak nepodaří prosadit...

Pohled do budoucnosti

Času na vývoj bylo bohužel k dispozici pouze konečné množství, takže zdaleka ne všechno, co si kdo přál, bylo dokončeno. Na verzi 2.3 bylo například odloženo:

  • Přenos IP přes SCSI (není od věci mít dva počítače spojeny linkou rychlosti 80 MByte/s).
  • Přenos IP po Fibre-Channelu (dokonce 1 Gbit/s).
  • PLIP využívající rychlé obousměrné paralelní porty.
  • Předělání bridgingu (celý bridge group by se ke zbytku jádra měl chovat jako jediný interface).
  • Přímý přenos packetů přes DMA z uživatelského prostoru do síťových karet či zpět.
  • Integrace podpory ATM a HIPPI.

Závěrem

Tento výčet "síťových novinek" ukazuje, že jádra 2.1 toho stran síťování opravdu mohou nabídnout mnoho nového. Za zmínku ovšem stojí, že ani kernelům 2.0 se vylepšování nevyhnulo - i tam byly postupně (po důkladném prozkoušení ve 2.1) některé věci z 2.1 přeneseny: například autofs či socket hashing. *


- předchozí článek - následující článek - obsah - úvodní stránka -