\magnification=\magstep1 \input epsf.tex \input mjmac.tex \language=\czech \chyph \hsize=160truemm % A4 with 25mm margins \vsize=247truemm \parindent=2em \nopagenumbers \def\hdr#1{\medskip\leftline{\bf #1}\smallskip} \def\\{\hfil\break} \def\BIRD{{\sc Bird}} \def\inititemize{\vskip 1pt\begingroup \parskip=1pt plus 0.3pt minus 0.1pt \advance\leftskip by 3em \advance\rightskip by 3em \parindent=0pt } %%% Úvod a historie projektu \hdr{Na počátku bylo vejce aneb Úvodem} \noindent Internet i UNIX jsou na světě již pěkných pár pátků. Počítače pracující pod nepřeberným množstvím unixovských systémů od nepaměti fungují jako internetové poštovní servery, name-servery a menší routery. Skoro by se zdálo, že si tyto dva světy už nemají co nového říci. V~posledních letech ovšem výrazně vzrostl výkon běžných PC-ček a objevily se pro ně karty podporující nejrůznější síťové technologie, a~tak se tyto počítače staly vhodnými kandidáty i~pro funkci routerů. Na~mnoha místech tak starší PC-čko s~volně šiřitelným softwarem předstihlo svého staršího a dražšího komerčního sourozence. Ačkoliv podpora routingu, firewallingu a inteligentní queue management v~jádrech těchto~OS (a~zejména Linuxu) je již velice vyspělá, ještě nedávno byly notně zanedbávány protokoly pro dynamický routing, tradiční unixovskou koncepcí umístěné do~uživatelského prostoru v~podobě routovacích daemonů. Tento nedostatek se pokoušela mezi jinými napravit také skupina nadšenců na~pražské Matematicko-fyzikální fakultě UK, která se rozhodla jako svůj studijní projekt vytvořit nového routovacího daemona, který by se stal něčím víc než jen důstojným konkurentem komerčních routerů -- nejen kopíroval už známá řešení, ale také přispěl něčím novým; na~jedné straně být stabilním a efektivním programem pro praxi, na~straně druhé ovšem i~laboratoří pro snadné experimentování s~novými myšlenkami. A~tak se narodil projekt {\it BIRD Internet Routing Daemon} (zkráceně \BIRD\footnote{$^0$}{Projekt si samozřejmě vysloužil nejrůznější přezdívky -- od Ptáčete až po~Ptákovinu.}). Původní plány byly smělé a rozhodné: Vytvořit nejlepšího routovacího daemona na světě, který by fungoval na~všech platformách, vyžadoval minimum strojového času a paměti, podporoval všechny routovací protokoly atd., zkrátka sen, jaký má být. Přeskočme nyní dva roky vývoje\footnote{$^1$}{během nichž z~některých požadavků samozřejmě sešlo -- například logem projektu se nakonec nestal ptáček nesoucí v~zobáčku snítku byliny řečené routa \dots} a podívejme se, co z~toho vzešlo. %%% Svět routingu %% v~tištěné verzi přeskočíme %%% Co BIRD dokáže \hdr{Když ptáčka lapají, pěkně mu zpívají aneb Feature list} \noindent \BIRD\ dostal od svých sudiček do~vínku mnohé dary: \def\icirc{\raise0.2ex\hbox{$\circ$}} % Signs frequently used for \itemize \itemize\ibull \:Schopnost komunikovat protokoly IPv4 i IPv6. \:Podporu všech základních routovacích protokolů: \itemize\icirc \:RIPv2 (Routing Information Protocol, viz RFC 1723 a 2080)\\ Určen pro interní routing, dnes významu spíše historického.\\ Algoritmus: distance vector (Bellman-Ford).\\ Velmi pomalá konvergence, použitelý pouze pro maličké sítě. \:OSPFv2 (Open Shortest Path First, viz RFC 2328)\\ Určen pro interní routing, v~současné době asi nejběžnější.\\ Algoritmus: link state (Dijkstra).\\ Rychlá konvergence, ale velice komplikovaný.\\ Zatím podporujeme pouze pro IPv4. \:BGP4 (Border Gateway Protocol, viz RFC 1771 a 2283)\\ Standardní protokol pro externí routing mezi AS.\\ Rychlá konvergence, možnost administrativní filtrace.\\ Algoritmus: path vector (upravený Bellman-Ford). \endlist \:Propojování protokolů a výměnu dat mezi nimi. \:Schopnost uplatňovat routing policy -- určovat, které routovací informace budou od~kterých protokolů přijímány a do~kterých protokolů vysílány. \:Snadnou konfiguraci a údržbu, ale o~tom až později. \:Modulární architekturu umožňující snadné doplňování nových protokolů, filtrů i jednoduché portování na~další systémy. (Interface k~routovacím službám jádra je bohužel i mezi jednotlivými unixovskými systémy natolik různorodý, že dokonce i~Linux 2.0 a Linux 2.2 jsou naprogramovány jako dva odlišné porty.) \:A v~neposlední řadě kvalitní dokumentaci jak uživatelskou, tak programátorskou (to je vítaný důsledek bytí školním projektem). \endlist %%% A jak to všechno propojit \hdr{Svět z~ptačí perspektivy aneb Jak to všechno dát dohromady?} \noindent Hlavním problémem ovšem není ani tak všechny tyto vymoženosti naprogramovat a popropojovat, nýbrž udělat to tak, aby z~toho nevznikl neudržovatelný a neefektivní zmatek\footnote{$^2$}{Nádherným příkladem je Mendelův pes, jak ho kdysi nakreslil pan Kantorek.}. Z~toho se zrodil modulární pohled na~svět routingu a následně i celá modulární architektura programu: \bigskip \centerline{\epsfxsize=0.9\hsize\epsfbox{../slides/obr5.eps}} \medskip Základem pohledu na~Internet z~naší \uv{ptačí perspektivy} je routovací tabulka. Na~ní jsou připojeny jednotlivé routovací protokoly -- jak protokoly reálné, tak i několik virtuálních, jako je například protokol Kernel zajišťující synchronizaci tabulky s~tabulkou jádra nebo protokol Static generující podle své konfigurace statické směrování. Každý z~protokolů posílá do~tabulky položky pro všechny routy, které se na~základě svých informací o~topologii sítě dozvídá. Tabulka pro každou síť vybírá na základě preferencí jednotlivých protokolů a jejich metrik optimální směr a ten oznamuje zpět protokolům. V~cestě ovšem v~obou směrech stojí filtry, které mohou tok dat regulovat -- některé položky odmítat, jiné upravovat (například jim přenastavovat metriky či tagy; to se dokonce vztahuje i~na atributy doplňované cílovým protokolem, protože nejprve cílový protokol nastaví implicitní hodnoty svých atributů, pokud je již položka neobsahovala, a teprve pak dojde k~filtrování). Routovacích tabulek může dokonce existovat vícero a pomocí protokolu Pipe si mohou přeposílat vybrané položky. Tím můžeme zajistit například routing závislý na~zdrojové adrese či vstupním interfacu: u~Linuxu 2.2 či novějšího nakonfigurujeme jádru více routovacích tabulek a každou z~nich připojíme na~jednu tabulku naši. \hdr{Ptačí zpěv aneb User interface} %%% User interface: konfigurace, logging a filtry. Remote control. \noindent Síť se mění a s~ní se musí měnit i konfigurace síťových komponent. Ta se pozvolna stala tradičním kamenem úrazu většiny routerů. U~tohoto kamene se totiž scházejí dva odvěcí nepřátelé: snaha o~snadnost a flexibilitu konfigurace a snaha o~nepřetržitý provoz sítě. A~jednou sleví ten, podruhé onen -- autoři některých routerů vsadili na~sílu textových konfiguračních souborů za~cenu toho, že se po~každé změně konfigurace musí router restartovat a po~nějakou dobu neroutuje, jiní zase podřídili non-stop provozu vše ostatní a stvořili konfigurování nepřeberným množstvím online příkazů, pomocí nichž se některé věci provádějí snadno, jiné, na~které autoři speciální příkaz nevymysleli, už obtížněji a ještě jiné vyžadují do~výsledného stavu dospět postupným provedením mnoha změn, což má obvykle za~důsledek daleko delší výpadek než jaký by byl vznikl reloadem celého routeru. \BIRD\ se snaží dosáhnout obojího: používá textové konfigurační soubory, uživateli tak dává možnost vytvářet konfiguraci víceméně libovolným způsobem -- ať již ručním editováním, interaktivními programy či automatickým generováním pomocí scriptů. Po~změně konfigurace je ovšem schopen si novou verzi souboru přečíst, porovnat s~právě používanou konfigurací a změnám se za běhu přízpůsobit (pokud jsou změny příliš velké, může to způsobit restart některého z~protokolů, ale provoz těch, kterých se změna netýkala, to nijak neohrozí). Konfigurace každého protokolu (lépe řečeno každé jeho instance -- protokoly mohou být spuštěny několikrát na~různých rozhraních či nad různými tabulkami) vypadá přibližně takto: \verbatim{ protocol bgp TestBGP { # instanci si můžeme nazvat local as 65000; # náš AS neighbor 195.39.3.64 as 5588; # sousední AS export all; # posílat budeme všechno import filter { # na vstupu některé odmítneme if !(bgp_path ~ / ? 5588 ? /) then reject; if net ~ [ 10.0.0.0/8+, 192.168.0.0/16+ ] then reject; preference = 101; # zbylým nastavíme preferenci accept; # a přijmeme je }; }} \noindent Vždy popisuje protokol, jeho parametry, připojení k~tabulkám (v~našem případě používáme tabulku implicitní) a nastavení vstupních i~výstupních filtrů. Filtry jsou popisovány jednoduchým procedurálním programovacím jazykem, který má k~dispozici všechny informace o~právě zpracovávané položce, může se podle nich rozhodovat a libovolně je měnit. Díky tomu je možné jednoduše zadávat i velice složitá pravidla, definovat si podprogramy sdílené filtry patřícími k~více protokolům, i~počítat metriky pro jeden protokol na základě metrik protokolů ostatních. Vítaným pomocníkem při odhalování problémů v~sítích je rovněž volitelné logování důležitých událostí a trasování činnosti protokolů: zde si je možno pro každý protokol vyžádat prakticky cokoliv počínaje základními informacemi o~běhu protokolu (připojování a odpojování sousedů apod.), přes výměnu položek mezi protokolem, filtry a jeho tabulkou, a konče detailním výpisem všech přijatých i odeslaných paketů. Mimo to \BIRD\ disponuje \uv{dálkovým ovládáním} -- jednoduchým příkazovým rozhraním, přes které se mohou připojovat různí klienti a vydávat jak některé řídící příkazy (restarty protokolů, reload konfigurace, přepínání trasování, \dots), tak požadavky na~vypisování stavu routovacích tabulek a protokolů. U~těchto příkazů je možno využívat plné síly filtrovacího jazyka, takže chceme-li například znát všechny routy směrované pomocí BGP na jednoho konkrétního souseda, stačí položit dotaz typu \verbatim{ bird> show route where source=RTS_BGP && gw=62.168.0.1} \noindent a dozvíme se ihned vše, co jsme potřebovali. Ladění filtrů navíc usnadní i~to, že se můžeme zeptat na~obsah routovací tabulky z~pohledu některého z~běžících protokolů. %%% BIRD uvnitř %\hdr{Ptačí anatomie} %% existuje progdoc %%% Netradicni pouziti \hdr{Cesty tažných ptáků aneb Za hranicemi všedních dnů} \noindent Hotová modulární implementace routovacího daemona samozřejmě svádí i k~méně tradičnímu využití. Zde se fantazii meze nekladou, autory samé během vývoje napadly například tyto triky: \itemize\ibull \:{\I multirouter} -- \uv{schizofrenní} zařízení pracující na různých skupinách interfaců jako různé routery řídící se různými pravidly, ležící třeba i v~různých autonomních systémech. To je možno zařídit patřičným nastavením jádra a buďto více běžícími \BIRD{}y nebo dokonce jedním pracujícím s~několika různými routovacími tabulkami. Tak by mohl například celý pražský NIX běžet na jediném routeru (pravda, běžné PC by na to nestačílo), a přesto by si každý provider mohl sám určovat a konfigurovat svou vlastní routovací politiku. \:{\I šedá eminence} -- \BIRD\ by ani nemusel běžet přímo na~stroji, který pakety routuje, mohl by také hotové routovací tabulky diktovat nějakému dedikovanému routeru disponujícím výkonnějším hardwarem, a tak skloubit špičkovou propustnost \uv{velkého železa} s~flexibilitou routeru bežícího pod unixovským systémem. \:{\I inteligentní mirror} -- aplikace se nemusí zastavovat u~routingu jako takového, mnohdy je možno informace získané z~provozu routeru využívat k~dalším účelům, například k~inteligentnímu přesměrovávání klientů na~nejbližší mirror vašeho archivu. \endlist %%% A co dal? \hdr{Čas ptáčat aneb Co dál?} Přestože po~úspěšném obhájení projektu a prvních několika desítkách spokojených uživatelů (a samozřejmě i~pár opravených chybách) nyní vývoj spíše stagnuje, autoři již spřádají plány do~budoucnosti, které by měly \BIRD{}ovi přinést mimo jiné také routování multicastů, agregaci síťových prefixů, OSPFv3 pro IPv6, on-demand linky a porty na~další systémy. %%% Reference na nás a ostatní routery \hdr{Snůška odkazů na závěr} \noindent {\sc Bird Team} pod vedením RNDr. Libora Forsta ({\I forst@cuni.cz}) tvořili: $$\vbox{\halign{#\hfil & \quad \it # \hfil & \quad \it # \hfil\cr Ondřej Filip&feela@ipex.cz&http:/$\!$/feela.ipex.cz/\cr Martin Mareš&mj@ucw.cz&http:/$\!$/atrey.karlin.mff.cuni.cz/\char126mj/\cr Pavel Machek&pavel@ucw.cz&http:/$\!$/atrey.karlin.mff.cuni.cz/\char126pavel/\cr}}$$ Domácí stránku projektu najdete na {\it http:/$\!$/bird.network.cz/,} odtamtud již vedou odkazy na~aktuální verzi, online dokumentaci i mailing list uživatelů. Všechna zmiňovaná RFC i mnoho dalších naleznete na {\it http:/$\!$/www.rfc-editor.org/}, první myšlenky o~využívání ptactva v~Internetu sahají až k~RFC~1149. \BIRD\ není na~světě sám, má i~příbuzné; mezi nimi za zmínku stojí daemoni {\sc GateD} ({\I http:/$\!$/www.gated.org/}), \hbox{\sc Zebra} ({\I http:/$\!$/www.zebra.org/}) a {\sc Mrtd} ({\I http:/$\!$/www.mrtd.net/}). O~IPv6 se bohužel zatím jen píše, na~jeho celointernetové nasazení se stále čeká a mezitím přibývá address-translatorů a dalších zvěrstev. Snad jediná větší síť používající tento protokol je experimentální virtuální síť 6-bone (viz {\it http:/$\!$/www.6bone.net/} a odkazy odtamtud). Dotazy a připomínky posílejte buďto autorovi nebo celému {\sc Bird Team}u na~adresu {\I bird@bird.network.cz}. \bye