mirror of
				https://gitlab.labs.nic.cz/labs/bird.git
				synced 2024-05-11 16:54:54 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			276 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			276 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
\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
 |