summaryrefslogtreecommitdiff
path: root/doc/slt2001/slt.tex
blob: fb9485868cdeb29673dec72014c196b2d8d86d44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
\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