Vysoce dostupný firewall s Keepalived

13. 11. 2007
Doba čtení: 4 minuty

Sdílet

V minulém článku byla představena motivace pro návrh vysoce dostupného firewallu na Linuxu. Zároveň byly předloženy dva problémy, se kterými bude potřeba se vypořádat. Nyní se tedy začneme zabývat jedním z možných řešení pro operační systém Linux. Dnes použijeme program Keepalived, který implementuje VRRP.

Více strojů jako jeden – rychlá odpověď

Pokročilého uživatele by mělo uspokojit, pokud prozradím, že pro řešení tohoto problému byl použit program keepalived. Toto je vše, co je nezbytně potřeba. Jak a co nakonfigurovat, je možné zjistit s pomocí Google.

Více strojů jako jeden – podrobněji

Tento problém lze vyřešit pomocí programu keepalived. Ten je open-source implementací protokolu VRRP, což je protokol definovaný v RFC 3768. Ačkoli je definice volně dostupná, protokol je patentován firmou Cisco.

VRRP pracuje tak, že definuje takzvaný virtuální router. Protokol byl navržen v souvislosti se zvýšením dostupnosti gatewayí, resp. routerů – odtud tedy označení. Tento virtuální router je dostupný pomocí virtuální IP adresy (VIP) a virtuální MAC adresy (VMAC). Virtualni router je identifikován číslem od 0 do 255 tak, aby bylo možné na jedné lokální síti definovat více virtuálních routerů.

Pomocí tohoto identifikátoru se do virtuálního routeru „vkládají“ fyzické stroje. Protokol VRRP se pak postará o to, aby si fyzické stroje předávaly VIP a VMAC a tím přebíraly funkcionalitu routeru. Zároveň se VRRP stará o detekci dostupnosti strojů ve virtuálním routeru – periodickým rozesíláním vrrp advertisement paketů.

Konfigurace

Keepalived se standardně konfiguruje pomocí souboru keepalived.conf, který je umístěn v /etc/keepalived/. Zajímavými položkami konfiguračního souboru jsou:

  1. definice instance VRRP,
  2. definice skupiny instancí,
  3. definice skriptů.

Dále popíšu ty části, které jsou zajímavé pro potřeby implementace vysoce dostupného firewallu. V hranatých závorkách budu uvádět jména atributů z konfiguračního souboru.

Definice instance [ vrrp_instance <name>] slouží pro konfiguraci jednoho virtuálního zařízení. Součástí konfigurace je definice VIP, která se má předávat. Ta je stejná na všech fyzických strojích v daném virtuálním routeru.

Dále definujeme, které fyzické zařízení [ interface] (například eth0) – a tím i fyzická ip adresa – na daném stroji bude zúčastněna v předávání virtuální adresy – tj. toho, na kterém zařízení fyzického stroje je možné očekávat VIP v případě, že je tento stroj ve stavu MASTER – pro virtuální router s daným id [ virtual_router_id].

Další položkou je definice stavu [ state] a definice priority [priority]. State může nabývat dvou hodnot – MASTER a BACKUP. Stroj, který je ve stavu MASTER, je pak držitelem virtuální adresy. Stav uvedený v konfiguračním souboru říká, v jakém stavu vzhledem k VRRP se má stroj po spuštění nacházet.

Toto nastavení je však (alespoň v keepalived) pouze informativní, protože každý stroj vkládaný do virtuálního routeru automaticky vyvolá proces volby MASTER, který je založen na prioritě. Status MASTER pak získá stroj s nejvyšší prioritou. Kdyby náhodou i priority byly stejné, použijí se v rozhodování IP adresy fyzických strojů. Tudíž je možné v konfiguraci každého fyzického stroje s klidným svědomím definovat stav MASTER a máme zaručeno, že se protokol postará o deterministickou volbu jednoho z členů virtuálního routeru, přes který následně poteče provoz.

Definice skupiny instancí umožňuje synchronizovat více instancí. Mějme například instance VI_1 a VI_2, které implementují virtuální adresy VIP1 a VIP2. Pokud jedna z těchto instancí zaznamená výpadek a tedy dojde na této instanci k přepnutí ze stavu MASTER do stavu BACKUP, pak nám sdružení do skupiny zaručí, že k přepnutí stavu dojde i na druhé instanci (obecně na všech). Toto je důležité právě při implementaci virtuálního routeru, který vždy má alespoň dvě rozhraní (vnitřní a vnější), které je potřeba přepnout současně, aby vnější i vnitřní virtuální adresy byly vždy na stejném fyzickém stroji.

Definice skriptů je v případě implementace vysoce dostupného firewallu klíčová. Keepalived umožňuje definovat skripty, které mají být spuštěny v okamžiku, kdy dojde k přepnutí mezi stavy, případně k nějaké chybě. Této vlastnosti bude využito k vydání příkazu pro synchronizaci conntrack tabulek.

bitcoin_skoleni

Závěrem

Na závěr je nutné poznamenat, že implementace VRRP v keepalived nedodržuje zcela standard. Konkrétně se jedná o to, že standard vyžaduje definici virtuální MAC adresy. Keepalived ale používá MAC adresu zařízení, se kterým je v daném okamžiku svázána VIP. To je možné díky tomu, že v obou případech je nutné po přenesení adresy na jiný fyzický stroj vyslat ARP Gratuitous, aby si switche aktualizovaly své tabulky a je tedy jedno, zda se používá VMAC nebo fyzická MAC.

Nyní je tedy zřejmé, jak zařídit, aby více fyzických strojů v IP síti mohlo vypadat jako jeden. To, co bylo popsáno, doposud zcela postačuje například pro implementaci vysoce dostupného routeru. Příště si řekneme, jak synchronizovat conntrack tabulky, což je poslední nezbytnou věcí, kterou zbývá vyřešit při implementaci vysoce dostupného firewallu.

Autor článku