Sedmivrstvý model
V době vznikání sítí se vytvořil tzv. sedmivrstvý OSI model a definovala se funkce každé vrstvy. Dnešní sítě, jak je známe, a které fungují díky TCP/IP, se „smrskly“ na pět vrstev, kde každá má svoji specifickou funkci. Situace, která kolem referenčního modelu OSI vládla, je dobře popsaná ve Wikipedii.
Do ruky se nám dostal čtyřvrstvý model a v Linuxu a Router OS s ním můžeme plně pracovat. Jednotlivé vrstvy, které se dnes používají, jsou:
1. Fyzická
2. Linková
3. Síťová
4. Transportní
5. Aplikační
Fyzická vrstva
Fyzická vrstva zajišťuje fyzické propojení dvou či více bodů. Pro představu to jsou naše síťové karty, případně WiFi karty a kabely. Fyzická vrstva si prošla mnoha změnami a i dnes jsou mnohé technologie z principu vzájemně nekompatibilní. Naštěstí můžeme díky vícevrstvému modelu komunikovat přes různé fyzické vrstvy.
Linková vrstva
Linková vrstva se stará o softwarové spojení „s druhou stranou“. Pokud máme dva počítače, které jsou propojené kabelem a po kabelech běhají nějaká data, musíme datům začít dávat řád. Tento řád má tři vrstvy, z nich linková zajišťuje propojení na lokálním segmentu sítě. V souvislosti s linkovou vrstvou se často mluví o Ethernetu.
To je protokol, představující linkovou vrstvu v našem pětivrstvém modelu. Je jednoduchý na implementaci, snaží se zmírnit kolize v přenosovém médiu a definuje pro nás používání tzv. MAC adres. Každé zařízení má svoji MAC adresu, která se používá pro komunikaci v lokálním segmentu sítě.
MAC adresa je 48 bitů dlouhé číslo jednoznačně identifikující každé síťové rozhraní neboli interface. Ethernet také definuje tzv. rámce, což jsou balíky dat obsahující další protokoly a samotná data. Rámec má svoji hlavičku, kde je mimo jiné zapsáno, jaká MAC adresa ho odeslala a jaké MAC adrese má být rámec doručen. Podle toho určují switche, do kterého portu mají rámec odeslat. Switche se dále o nic jiného nezajímají a díky tomu je jednoduché je vyrobit, provozovat a spravovat. Pokud jde o dnes již pomalu nesehnatelné HUBy, ty rozesílaly jednotlivé rámce do všech portů kromě toho, ze kterého přišly.
Síťová vrstva
Stejně jako linková vrstva, i ta síťová se stará o komunikaci s okolím. Rozdíl je v měřítku použití. Jako síťovou vrstvu používáme protokol IP (Internet Protocol). Pro nás jsou nejdůležitějšími hodnotami zdrojová a cílová IP adresa. Ty potřebujeme pro samotné routování. Hlavička IP protokolu obsahuje řadu dalších věcí, kde krom délky a tzv. flagů najdeme informace o fragmentaci. IP vrstva komunikuje pomocí tzv. datagramů neboli paketů.
Pokud paket cestuje napříč světem, může se stát, že v jednom místě jeden router musí paket rozdělit na dva či více. IP pakety mohou nabírat velikost až 65535 bajtů. Linkové rámce jsou ale často omezeny na přibližně 1500 bytů. To znamená, že pakety větší než tyto rámce se musí do jednotlivých rámců rozdělit nebo fragmentovat. Pokud tak router musí učinit, další router na cestě už posílá pakety rozdělené. Všechny pakety si nakonec složí sám příjemce.
Je nutné podotknout, že IP vrstva nezaručuje nic – ani úspěch doručení, ani to, že se paket třeba naroutuje někam, odkud se už nikdy nedostane. Může nastat i případ, kdy paket krouží po síti a nenachází cíle. Oběhne párkrát planetu, ale nikdo ho nedoručí tam, kam patří. V takové případě nastupuje další hodnota v hlavičce, které říkáme TTL. Po průchodu paketu routerem se TTL, které bývá nastaveno na různé hodnoty systém od systému, zmenší o jedničku. Pokud se na některém z routerů paket dostane s TTL na hodnotu nula, router ho zahodí.
Koho zajímá IP protokol více, může se ponořit do dokumentu RFC 791, které má pouhých 45 stran a vysvětluje o IP protokolu prakticky vše.
IPv4 vs. IPv6
V dobách, kdy sítě byly pouze doménou univerzit, se nepočítalo s takovým masovým rozšířením sítí po světě, které dnes známe pod jedním slovem Internet. Čtyři miliardy adres tenkrát stačilo a formát IP adres byl stavěný tak, aby se dobře pamatoval, četl i routoval. Tenkrát nebyl problém získat pro svůj projekt několik tisíc IP adres. Dnes, kdy je Internet v každé domácnosti, jsou IP adresy nedostatkovým zbožím. Berličky v podobě NATu a dělení sítí po jednotlivých bitech už přestávají stačit a dostává se na řadu IP verze 6, které řeší prakticky všechny dnešní požadavky včetně rozsahu IP adres. Stačilo adresu zvětšit pouze čtyřikrát.
IPv6 toho přináší mnohem více a zatímco IPv4 opravdu „jen odesílá data“, šestková verze řeší problém s mobilními zařízeními, autokonfiguraci sítě a v neposlední řadě také bezpečnost sítě. Adresy se na první pohled hůře pamatují.
Podle původní myšlenky Internetu má mít každý jeho uživatel jednu veřejnou IP adresu. Tím se zajistí rovnost uživatelů na síti. Každý může komunikovat s každým. V polovině devadesátých let přestala končit legrace a nastal poprvé problém s nedostatkem adres. Přišel NAT a ten až dodnes řeší všechny problémy. Takovéto řešení však není věčné a i když se na některých místech snaží neutralitu sítě dodržovat (například jsem našel projektor na ČVUT s veřejnou IP adresou), v mnoha oblastech je to nemožné. Díky IPv6 by jsme se mohli dočkat doby, kdy poslat fotografie z dovolené sousedovi, který má jiného poskytovatele připojení, nemusí být až takový problém a nebudeme muset platit za služby, které nám to umožní.
Mobilní zařízení se pohybují mimo domácí síť po různých dalších sítích. Díky IPv6 si bude toto zařízení moci držet svoji adresu, ať již bude kdekoli, a díky domácímu routeru bude s touto adresou dosažitelné prakticky všude.
Ač toho IPv6 přináší hodně a i rozsah adres je dostatečná výhoda oproti starému řešení, jeho rozšíření se ještě nějaký ten rok nedočkáme. IPv4 adresy nejsou nezbytností pro uživatele, což je největší překážka v rozšíření. Ač už patnáct let slýcháme, že IPv4 adresy za dva roky dojdou a nestalo se tak, jsme si jisti, že se to jednou stane. Existují sítě, kde se s IPv6 již počítá (CESNET) a je tam plně funkční. Bohužel ani subjekty připojené právě do CESNETu se o IPv6 nestarají. Rozšíření brání i obrovská hromada hardware do domácností, které se přes nové adresování nepřenese a jeho webové rozhraní je omezené pouze na IPv4.
Necháme se překvapit, jak tento boj dopadne a zatím můžeme uzavírat sázky na den, kdy adresy opravdu dojdou.
ICMP a ARP
Důležitými součástmi protokolů IPv4 a v6 je protokol ARP a ICMP. ARP je již s IPv6 minulostí, protože jeho funkci přebírá ICMP.
ARP protokol se nachází nastejné úrovni jako linková hlavička, na místě síťové vrstvy, a slouží k získávání MAC adres patřících IP adrese. V praxi to funguje tak, že když na nějaké zařízení chce odeslat paket pro konkrétní IP adresu, musí si k ní zjistit MAC adresu. Nejdříve se koukne do routovací tabulky, aby věděl, na kterém rozhraní se má snažit o získání informace. Poté rozešle zprávu do sítě ve znění „kdo má tuto IP adresu“. Pokud někdo odpoví, tak rovnou svou MAC adresou a komunikace může pokračovat. Pokud ne, komunikace tím končí, protože zařízení neví, kam s paketem dál.
ICMP je na tom podobně jako ARP a je nalepené na místě IP hlavičky. Slouží převážně k jednoduchému řízení toku IP paketů po síti, k ladění a hlavně k oznamování chyb. Řízení paketů je pouze velmi jednoduché a můžeme si ho všimnout, pokud například zadáme jako bránu počítač, který bránou není, ale je na stejné podsíti a informace o bráně má správné. Díky komunikaci zařízení přes protokol ICMP se jádro dozví o skutečné adrese brány. Ladění známe ve formě programu ping, kdy se odesílá tzv. ICMP echo a druhá strana vrací odpověď. Oznamování chyb oceníme například při nedosažitelnosti cíle, kdy k němu chybí routa a podobně. Pak víme, že něco není v pořádku a můžeme to dále řešit.
IP adresa
Adresa používaná v protokolu IPv4 je normální 32 bitů dlouhé číslo, z pohledu sítí rozdělené na dvě poloviny. Levá polovina označuje síť a pravá jednotlivé stroje resp. jejich rozhraní. Bity v obou polovinách mohou být v různém poměru. Dříve byly adresy rozdělené podle tříd, což velmi ztěžovalo jejich efektivní rozdělení. S docházejícími adresami se začaly adresy rozdělovat podle bitů. Počet bitů patřících síti je uveden za lomítkem při zápisu adresy nebo se dá také zapsat jako maska podsítě. Na pochopení je dobré vyzkoušet si program whatmask, který ukáže, kolik použitelných adres najdeme v jednotlivých sítích.
Nejdříve příklad:
cx@godie ~ $ whatmask 192.168.1.2/27
------------------------------------------------
TCP/IP NETWORK INFORMATION
------------------------------------------------
IP Entered = ..................: 192.168.1.2
CIDR = ........................: /27
Netmask = .....................: 255.255.255.224
Netmask (hex) = ...............: 0xffffffe0
Wildcard Bits = ...............: 0.0.0.31
------------------------------------------------
Network Address = .............: 192.168.1.0
Broadcast Address = ...........: 192.168.1.31
Usable IP Addresses = .........: 30
First Usable IP Address = .....: 192.168.1.1
Last Usable IP Address = ......: 192.168.1.30
V příkladu máme adresu 192.168.1.2 prvních 27 bitů označuje síť. To označuje rozsah třiceti dvou adres, z nichž 30 můžeme použít pro zařízení. První adresa je adresa sítě a žádnému zařízení se nepřiděluje. Poslední adresa je broadcast (pokud na tuto adresu pošleme paket, dojde do všech zařízení v lokálním segmentu sítě). Broadcast se také nepoužívá jako adresa pro zařízení. V příkladu je také napsána maska podsítě 255.255.255.224, která se vypočítá jako 255.255.255.255 mínus počet dostupných adres včetně broadcastu a adresy sítě.
Díky rozdělení sítí (resp. jejich segmentů) po jednotlivých bitech se může mnohem efektivněji rozdělovat potřebný rozsah adres, aniž by muselo existovat pravidlo pro každou adresu.
Pokud jsme dřív zažádali o adresy, tak jsme mohli požádat o jednu z tzv. tříd. Třídy se označovaly:
A 0-127 /8
B 128-192 /16
C 192-223 /24
D 224-239 multicast
E 240-255 rezerva
Například třída A obsahuje 2563 adres a dostává ji jen několik vyvolených. U třídy to je 2562 adres a třída C 256 adres. Dnes je rozdělování adresního prostoru podle tříd minulostí, takže nemá smysl se s ním dál zabývat.
K adresám bychom měli vědět také to, že existují rozsahy, které by se nikdy neměli objevit v Internetu, ale pouze v lokálních sítích. Takové adresy používáme na lokálních sítí za NATem. Pro lokální použití jsou určeny tyto rozsahy:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
Správný router by měl pakety s těmito adresami v Internetu zahodit, ať už se tam dostaly jakkoli.
Routovací tabulka
Na každém zařízení komunikující v IP síti se vyskytuje tzv. routovací tabulka. Na zařízeních obsahuje tato tabulka pouze lokální segment sítě a výchozí bránu, která se využije, pokud v tabulce není pro cíl paketu záznam.
Jak jsem zmínil, routovací tabulka obsahuje seznam sítí (zmíněné adresy sítě) a jejich masky podsítí nebo počet bitů označující síť. Díky těmto dvěma informacím pak zařízení ví, jestli daný paket s cílovou adresou do konkrétní sítě patří nebo ne. Pokud ano, nasměruje se na to správné zařízení, pokud ne, postupuje tabulkou dál. Záznamy se vyhodnocují od těch nejvíce konkrétních po ty nejméně. Na konci tabulky najdeme výchozí bránu, která se dá zapsat jako 0.0.0.0/0.
Každý router pak má záznam o každé podsíti, kterou má pod sebou. Když na něj přijde paket, který má jako cílovou adresu nějakou adresu z podsítí, které má pod sebou, pošle je tím správným směrem.
Spojení vrstev
Vysvětlili jsme zatím k čemu slouží dvě vrstvy, ale ještě nevíme, jak se k ním chovají routery případně switche. Pokud jde o switche, tak pokud nemají pokročilejší logiku, tak s paketem nic nedělají, přečtou si MAC adresu cíle a pošlou celý paket na ten správný port v nezměněném stavu. Switche mají přehled o každé MAC adrese v síti. Jednoduché SOHO switche nedisponují velkou pamětí a ta může často dojít. Častěji ovšem narazíme na některé domácí switche nebo WiFi routery se switchem, které umí na jeden port připojit pouze jedno zařízení a ne další switch. Mají v paměti pouze jedno místo na jeden cíl.
Routery už to mají složitější, musí každý paket rozebrat a podle toho ho zpracovat. Všechny vrstvy spojené do sebe cestují jako balík dat oblepený hlavičkami, podobně jako tomu je na obrázku.
Když se tento balík dává dohromady, vezmou se data z aplikační vrstvy, před ty se nalepí hlavička s informacemi transportní vrstvy, před ní síťové vrstvy a úplně na začátek se dají informace z linkové vrstvy. Takovýto balík bitů je schopný cestovat přes celý svět.
Když tento balík dorazí na router, tak ten z něj odlepí informace z linkové vrstvy, protože ty se pravděpodobně nahradí novými. Děje se tomu proto, že router je zařízení, které spojuje lokální segmenty sítě a v těchto segmentech neexistuje společné adresování.
Transportní vrstva
S transportní vrstvou se u routování moc nesetkáme, ale pro další články, které budou zahrnovat nastavení firewallu, se s ní aspoň částečně seznámíme.
Transportní vrstvu představují protokoly UDP a TCP, přičemž první zmiňovaný nezaručuje doručení dat a jejich správnost, druhý pro změnu ano, i za cenu větší režie. Oba protokoly slouží primárně k odlišení jednotlivých spojení na jedné IP adrese. Představme si, že máme web server, kam se připojuje 100 uživatelů. Každý z nich se připojí na naši IP adresu a chce odpověď. Jak oddělíme jednotlivá spojení od možnosti další komunikace? Použijeme tzv. porty. Na každé IP adrese může být teoreticky navěšeno 65535 odchozích spojení, které je možné oddělit.
Abychom se dostali pod pokličku celkovému vytvořenému spojení, řekneme si, jak se k němu dostaneme. Vezměme si za příklad již zmíněnou komunikaci s web serverem. Pokud se rozhodneme poslat požadavek na server, náš počítač se začne „pídit“ po IP adrese web serveru. Dejme tomu, že ji máme a nastává spojovací proces. Počítač pošle do sítě broadcast, kde se ptá pomocí protokolu ARP na MAC adresu, které patří IP adresa brány (pokud je webserver mimo náš segment sítě). Pokud se mu ji podaří zjistit, začne vytvářet dotaz. Zatím jsou nám data ke skutečnému požadavku k ničemu. Vytvoří TCP paket s cílovým portem číslo 80 a nějakým vybraným zdrojovým portem a nastaví mu flag SYN. Dále přilepí IP hlavičku se zdrojovou IP adresou (našeho počítače) a cílovou adresou webového serveru. Poté vezme svoji MAC adresu a MAC adresu brány a přilepí poslední hlavičku linkové vrstvy. Tento paket odešle do sítě, switch ho přehodí směrem k bráně, ta na paketu odlepí hlavičku linkové vrstvy, koukne do routovací tabulky, jestli v ní není něco o cílovém stroji a pokud ne, zeptá se opět na MAC adresu brány, přilepí novou linkovou hlavičku a odesílá paket dál. Takto paket projede blíže nespecifikovanou cestu a když se dostane do segmentu sítě, kde se nachází tento stroj, tak se místo na MAC adresu brány začne ptát router na adresu toho konkrétního stroje. Opět je linková hlavička odlepena a přidána nová, tentokrát s adresou konkrétního stroje. Když tam tento paket dorazí, stroj posílá paket zpět, kde hlavním rozdílem je flag v TCP paketu, který je tentokrát SYN. Hned za nim následuje paket ACK. Pokud oba dorazí, tak původní počítač posílá zpátky také ACK. Až v tuto chvíli může začít skutečná komunikace. Během tohoto tzv. čtyřcestného handshaku se vždy prohodí cílové IP adresy a porty. MAC adresy mohou být různé během celé komunikace, protože pakety nemusí vždy jet stejnou cestou.
Máme-li takto navázané spojení, počítač může vzít náš HTTP požadavek a poslat ho směrem na server, který na něj odpoví. Pokud už dále komunikovat nepotřebujeme, tak se posílá TCP paket s flagem FIN, který nepotřebuje potvrzení. Od strany, která FIN odeslala, už nepřijdou žádná data v rámci vytvořeného spojení. Pokud se FIN ztratí, platnost spojení časem vyprší.
U UDP se takto složitý proces spojení nekoná, protože je bezestavový. Data prostě odcházejí a není jisté, jestli přijdou, v jakém pořadí přijdou a nemůžeme oddělovat ani stavy spojení. Nerozlišuje se ani, jestli druhá strana naslouchá nebo ne, data se pouze odesílají a možná přijímají. UDP se hodí všude tam, kde drobné nedokonalosti v přenosu nevadí. Běžně streamování hudby nebo videa. Na UDP je postavený i přenos dat přes NFS, ale tam se o samotnou bezpečnost dat stará NFS samotné.
NAT
S transportní vrstvou je úzce spjata i populární technika NATování nebo jinak síťové maškarády. Pokud se kolem sítí pohybujeme častěji, tak se s NATem setkáme. Hodně čtenářů roota ho bude mít i doma. NAT na routeru přepisuje zdrojovou IP adresu za IP adresu routeru a změní zdrojový TCP/UDP port na jiný. Pokud na tento port přijde paket z druhé strany, resp. odpověď na nějaký požadavek, tak se hodnoty nastaví zpět a paket pokračuje svou cestu přímo k cíli kam patří.
Pokud na routeru nastavíme směrování nějakého portu na lokální IP adresu, provedeme tím něco podobného jako NAT. Ten ale funguje dynamicky a takové pravidlo vytvoří při každém otevřeném spojení ven. Na linuxovém NATu si můžeme zobrazit obsah NAT tabulky pomocí „conntrack -L“ a stejně tak můžeme tabulku vyprázdnit přes „conntrack -F“.
Aplikační vrstva
Poslední vrstvou, pod kterou se schovává nejvíce protokolů je vrstva aplikační. Nebudeme se jí věnovat do detailu, protože obsahuje opravdu velké množství protokolů a není v mých silách je vměstnat do jednoho článku. Vrátíme se k ní v budoucnu v článku o firewallech, kde bude důležitá při identifikaci provozu na síti.
Mělo by nám tedy stačit, že v aplikační vrstvě se schovávají protokoly jako DNS, HTTP, POP, IMAP, FTP, SSH atd.