Hlavní navigace

Síťový stack v Linuxu a jeho využití

Linuxový síťový stack vysoce převyšuje základní požadavky pro připojení aplikací běžících v operačním systému k síti…
1. 11. 2016

Sdílet

Počítač s Linuxem může sloužit v rolích různých síťových prvků. Tato nasazení jsou opodstatněná v situacích, kdy možnosti softwarového síťového stacku a pokročilé funkce Linuxu převáží nad nutnostní vyrovnat se s výkonovými limity, které nelze s běžně dostupným hardwarem a Linuxem překonat.

Aplikace Linuxu v sítích

Linux v roli síťových prvků se používá odjakživa v situacích, kdy je zapotřebí například router pro nepříliš velkou kancelář. Vedle routování může takový router provádět i NAT, obsahovat jednoduchý firewall a k tomu na něm lze provozovat serverové služby pro vnitřní i vnější použití.

V posledních letech se však Linux prosazuje do domácích síťových zařízení a najdeme jej i v některých síťových prvcích, které jsou určené do datacenter. V některých případech se Linux sice používá jen jako operační systém, ve kterém běží proprietární control plane či jiný software. Najdeme ale i zařízení, která reálně využívají standardní Linuxový síťový stack.

Samostatnou kapitolou pak je využití Linuxu jako virtualizační platformy, jejíž nedílnou součástí je i virtualizace síťové konektivity. Právě díky virtualizaci a díky technologiím vysoké dostupnosti se Linuxoví administrátoři běžně setkávají s pokročilejšími nastaveními síťového stacku.

Pokročilá nastavení

Komplexita síťování v Linuxu z hlediska administrátora i z hlediska technických možností může spočívat ve využívání mnoha za sebe zřetězených vrstev, ve kterých je těžké se vyznat a které můžou přinášet nepředvídané interakce. Tyto interakce můžou vést ke snížení výkonu a nebo i nefunkčnosti některých částí řešení. V Linuxu je například snadné spustit BGP daemon, který se má spojit přes IP-in-IP tunel, který posílá enkapsulované packety přes bridge rozhraní postavený nad VLAN rozhraním, který stojí nad „fyzickým“ rozhraním uvnitř virtuálního stroje KVM, který na hostiteli ústí opět do bridge a z něj do jiného VLAN rozhraní a až pak do fyzické síťové karty. Problémů v takovém řešení, které mohou vést k nefunkčnosti BGP, může být celá řada: chyby v konfiguraci VLAN ID, chybně nastavené MTU resp. překročení MTU po několikanásobné enkapsulaci, TTL inherit na IP-in-IP tunelu a tak dále. Debugovat takové nastavení pak představuje řádově větší výzvu, než odstranění toho samého problému v jednoduchém nastavení.

Podobný příklad, kdy se komplexita nastavení rychle zvyšuje, je kombinace mechanismů pro řízení toku packetů na různých úrovních referenčního modelu. V Linuxu je možné řídit routing pomocí tabulky pravidel a jednotlivé packety routovat přes různé směrovací tabulky. Vyplňování těchto směrovacích tabulek může být práce pro směrovací protokoly běžící v userspace daemonech. A rozdělování packetů do různých směrovacích tabulek podle tabulky pravidel může záviset, mimo jiné, i na značkách z firewallu (fwmark). Tím lze dosáhnout značné komplexity rozhodovacích pravidel a přesáhnout možnosti jiných implementací policy-based routingu. Cenou za to je opět nízká přehlednost řešení.

Dalším aspektem je technická komplexita, kterou představují počty záznamů v různých tabulkách a datových strukturách jádra. Nejedná se zdaleka jen o směrovací tabulku, která naopak díky šikovné stromové implementaci zvládne obrovské množství rout. Problémem může být ale například velké množství pravidel firewallu, složitá a obsáhlá pravidla shaperu, velké množství pravidel pro policy based routing i množství různých směrovacích tabulek, mezi kterými se rozhoduje právě podle PBR pravidel.

Jiný příklad technické komplikace je udržování velkého množství dynamických záznamů o stavu spojení. To se týká především tabulky spojení connection trackingu a nebo v určitých případech i počtu navázáných TCP session na místní server. Experimenty ukázaly, že statisíce lokálně navázaných spojení a nebo statisíce záznamů v tabulce conntracku Linux zvládne na přiměřeně rychlém hardwaru s dostatkem paměti bez problémů, zatímco miliony záznamů už představují pro použité datové struktury problém. Nemusí jít ale ani tak o samotný počet záznamů, jako spíš o frekvenci změn v dané datové struktuře.

Vývoj a využívání síťových technologií v Linuxu

Současný Linux nabízí v jádře podporu mnoha různých L1/2 technologií a vedle nejpoužívanějšího Ethernetu, WiFi a PPP lze nalézt ovladače pro skutečné speciality. Vývoj softwaru probíhá aktivně na všech úrovních. V současnosti se začíná etablovat nový Linuxový firewall nftables, který má v budoucnu nahradit iptables, ip6tables, arptables a ebtables. Do Linuxu přibyl v nedávné minulosti i protokol L2TPv3 a podpora MPLS, což slibuje přiblížit Linux úrovni sofistikovaných komerčních routerů.

Na vyšších vrstvách je vývoj protokolů usnadněn snadným přenesením práce z jádra do userspace pomocí tun a tap interfaců, které používá například i populární OpenVPN. Linux je také platformou pro Open vSwitch, který významně překonává funkcionalitu Linuxového bridge a může Linux postavit funkcionalitou mezi sofistikované komerční switche. A na Linuxu probíhá i prototypování a vývoj nových protokolů pro mesh networking.

Vývoj Linuxového jádra i userspace utilit a řídících nástrojů pokračuje na jednu stranu velmi rychle, na mnoha místech a v rámci různých projektů s odlišným zaměřením. Na druhou stranu je základní funkcionalita síťového stacku z velké části téměř neměnná a její změny, pokud vůbec, tak nastávají velmi pomalu a klade se při nich důraz na kompatibilitu a dlouhodobou udržitelnost a průhlednost.

Pro nasazování a nebo vývoj pokročilých funkcí síťového stacku je zapotřebí mít nejen základní přehled o síťové teorii a protokolech ale i o implementačních principech v jádře i mimo něj. Jednou z možností jak takový přehled získat za pomocí řady praktických cvičení, kterým předchází výklad relevantní teorie, je kurz Akademie CZ.NIC nazvaný Pokročilé síťování v Linuxu.