Skip to main content

11.3 Optimalizácia firewall pravidiel

V praxi často riešime situáciu, keď potrebujeme pravidlo firewallu definovať pre viaceré adresy zariadení / serverov. Budeme písať rovnaké pravidlo zvlášť pre každý server? A čo ak pre servery nebude len jedno pravidlo, ale viaceré? Keď sa zmení server (či jeho IP adresa alebo nasadíme nový server), budeme hľadať adresu konkrétneho servera vo všetkých pravidlách?

Áno, servery je možné umiestniť do samostatnej siete (pozri kapitoly 7.7 Rozdeľovanie IPv4 siete na podsiete8.4 Rozdeľovanie IPv6 siete na podsiete), či im aspoň prideliť určitý rozsah adries, ktorý je možné vyjadriť maskou, čo by situáciu uľahčilo. No každý server má svoje špecifiká (napríklad rozdielne služby) a vytvoreniu špecifických pravidiel sa nevyhneme.

Odporúčania pre optimálne firewall pravidlá:

  • ako prvé dávame pravidlá, ktoré „vyriešia“ najviac paketov,
    • pri rozhodovaní pomôžu štatistiky (počítadlá);
  • typicky sú ako prvé úvodné pravidlá pre už nadviazané spojenia,
    • tie môžeme navyše označiť pre zrýchlené spracovanie;
  • pre riešenie viacerých adries využívame zoznamy adries;
  • pre riešenie viacerých rozhraní využívame zoznamy rozhraní;
  • spracovanie rozvetvíme do viacerých vlastných reťazcov.

Vyššie uvedené pravidlá optimalizácie sú samozrejme až druhoradé a prvoradá je logická funkčnosť firewallu. Optimalizácia nesmie nikdy byť na úkor funkčnosti!

Využívanie zoznamov umožňuje okrem pohodlnejšieho vykonávania zmien aj zredukovať počet pravidiel firewallu - a už vieme, že čím viac pravidiel, tým dlhšie bude trvať spracovanie, teda tým vyššia bude záťaž procesoru, a teda tým väčšie riziko, že smerovač „nebude stíhať“ a bude limitujúcim prvkom priepustnosti. Záleží však od počtu všetkých pravidiel? Zrejme nie, záleží len od počtu tých pravidiel, ktorými paket prechádza. Preto je potrebné optimalizovať firewall s cieľom minimalizovať tento počet.

Čím viac je pravidiel, cez ktoré musí paket prejsť, tým bude vyššia záťaž CPU.

Zoznamy adries

firewall-address-lists.webpUvádzanie konkrétnych adries by predstavovalo praktický problém, preto budeme používať zoznamy adries. Cez WinBox ich nájdeme v ponuke IP/IPv6 → Firewall na záložke Address Lists. Tu môžeme zoznamy adries vytvárať, pričom vytvorený zoznam ani nemusíme využiť v pravidlách firewallu (môžeme si ho len chystať alebo použiť inde, napríklad pre NAT, čo sa naučíme neskôr).

Vytvoríme si napríklad zoznam wan-smtp-server, či lan-web-server a do neho dáme všetky servery. Ak sa v budúcnosti niečo zmení, stačí zmenu vykonať v zozname adries. Je to podobné ako premenné, či konštanty v programovacom jazyku. Zoznam adries sa teda oplatí mať aj v prípade, že je v zozname (zatiaľ) len jediná adresa. Povedané inak: vo firewall pravidlách by sa prakticky nikdy nemala vyskytovať konkrétna adresa, ale len zoznamy.

Zaujímavosťou je, že do zoznamu adries nemusíme zadávať len IP adresu, ale môžeme aj doménové meno. Výhoda je, že smerovač si meno prevedie na adresu sám - spýta sa DNS servera a po uplynutí platnosti mena (TTL) ho vždy obnoví automaticky.

Pozor však na doménové mená, ktoré vracajú mnoho odpovedí, napríklad ntp.org, či facebook.com - MikroTik si uloží len tých pár, ktoré dostal v danom čase v odpovedi, no klient môže dostať niečo iné. Tento problém vyriešime čoskoro, keď klientovi vnútime používanie nášho DNS servera na MikroTik zariadení.

Do každého zoznamu môžeme pridávať aj viaceré adresy (po jednej).

firewall-address-list.webpKaždej adrese vypĺňame tieto údaje:

  • názov zoznamu (Name) by mal začať predponou označujúcou „stranu“ z pohľadu firewallu, napríklad zariadenia v LAN lan-server, lan-tlaciaren, v internete wan-admin, wan-smtp, VPN spojenia a individuálni klienti vpn-klient-technik, vpn-pobocka-sklad;
  • adresa (Address) môže obsahovať IP adresu, IP sieť (adresu so sieťovým prefixom) alebo doménové meno;
  • časový limit (Timeout) obmedzuje časovú platnosť, slúži na dočasné umiestnenie adresy do zoznamu - napríklad dočasné zablokovanie útočníka, či dočasný prístup pre admina.

firewall-filter-address-list.webpVytvorený zoznam adries sám o sebe nerobí vôbec nič, no vieme ho využiť napríklad vo firewall pravidlách na záložke General:

  • môžeme definovať zdrojový (Src. Address List) i cieľový zoznam (Dst. Address List);
  • obe môžeme negovať (! pred zoznamom);
  • je možné zadať i nové meno zoznamu, ktorý zatiaľ neexistuje - zoznam sa vytvorí a bude prázdny, čo nám umožňuje nachystať pravidlo skôr, ako priradíme konkrétne adresy.

Do zoznamu adries môžeme pridávať našich DHCP klientov aj automaticky - každému klientovi môžeme definovať zaradenie do zoznamu individuálne v ponuke DHCP Server → Leases alebo môžeme do zoznamu zaraďovať všetkých klientov určitého DHCP servera cez DHCP Server → DHCP. Akonáhle klient dostane adresu, je zaradený do zoznamu dovtedy, kým je držiteľom tejto adresy (teda kým neoznámi uvoľnenie pri vypínaní zariadenia alebo kým nevyprší platnosť adresy pri vytratení sa zariadenia zo siete).

Zoznamy rozhraní

Okrem zoznamu adries môžeme vytvoriť aj zoznamy rozhraní. Napríklad, ak máme tri LAN siete (lan1, lan2, lan3), nemusíme pravidlo prístupu do LAN písať tri razy, ale vytvoríme si zoznam „lan“, do neho dáme všetky tri rozhrania a vytvoríme jediné pravidlo. Ešte výraznejší rozdiel je, pokiaľ by sme chceli povoliť vzájomnú komunikáciu medzi týmito troma sieťami. Ak nevyužijeme zoznamy rozhraní, je to 6 pravidiel, so zoznamom rozhraní stačí jediné pravidlo:

  1. lan1 → lan2
  2. lan1 → lan3
  3. lan2 → lan1
  4. lan2 → lan3
  5. lan3 → lan1
  6. lan3 → lan2
  1. list-lan → list-lan
bez zoznamu rozhraní so zoznamom rozhraní


interface-lists.webpZoznamy rozhraní sa však netýkajú len firewallu, preto ich nájdeme v sekcii rozhraní - konkrétne cez WinBox v ponuke InterfacesInterface List. Tu musíme najskôr vytvoriť zoznam tlačidlom Lists a potom do každého pridávať sieťové rozhrania.

V systéme sú už predvolené rozhrania, napríklad dynamic (obsahuje len dynamické rozhrania, napríklad po pripojení VPN klientov), static (rozhrania, ktoré nie sú dynamické). Pri ich využití vo firewalli si môžeme vytvoriť napríklad zoznamy lan, či wan (ak máme viacej internetových pripojení), čo nám uľahčí konfiguráciu. Lepšie využitie však nájdeme neskôr pri VPN klientoch, ktorých rozhrania môžeme tiež pridávať do samostatného zoznamu.

Podobne ako pri zozname adries, i zoznam rozhraní môžeme využiť v pravidlách firewallu na záložke General, môžeme zvlášť voliť vstupný i výstupný zoznam a tiež ich môžeme negovať.

firewall-filter-interface-list.webp

Vlastné reťazce pravidiel

Z hľadiska funkčnosti nie je problém riešiť firewall jednotlivými pravidlami priamo v reťazcoch inputforward, no čím viac pravidiel máme, tým väčší význam má optimalizácia - spracovanie paketu rozdelíme do samostatných reťazcov na základe podmienok. Napríklad, pokiaľ sa jedná o paket smerujúci do LAN, presmerujeme ho na samostatný reťazec, ktorý rieši vstup do LAN - aj ak bude v nej mnoho pravidiel, nebudú ňou prechádzať pakety smerujúce z LAN do internetu a podobne, teda efektívne znížime počet spracovávaných pravidiel. Samotné rozvetvenie realizujeme akciou jump - jedná sa o skok do vlastného reťazca (jeho názov môžeme zadať priamo do pravidla):

firewall-filter-action-jump.webp

Všetky vlastné reťazce je vhodné rozumne pomenovať, začať by mohli pôvodným názvom reťazca (input / output / forward). Napríklad smerovanie do LAN by sa mohlo volať forward-to-lan, vstup z internetu input-internet, smerovanie z LAN do internetu forward-lan-to-internet a podobne. Na koniec každého reťazca je vhodné dať implicitné pravidlo (všetko ostatné povolí alebo zakáže).

firewall-filter.webp

V špecifických prípadoch môžeme na konci vlastného reťazca uviesť akciu return, ktorá nevyriešený paket vrátiť späť na ďalšie pravidlo v pôvodnom reťazci. Používa sa napríklad v reťazci na pokročilé riešenie detekcie útoku - ak nezisí žiadne anomálie, vráti sa na riadne spracovanie.

Zrýchlenie spojení cez Fast Track

Po úspešnom vybudovaní a otestovaní firewallu je vhodné výrazne znížiť záťaž CPU využitím funkcie Fast Track pre urýchlenie spracovania spojení. Spojenia, ktoré sú urýchlené, už neprechádzajú firewallom, nie sú spracovávané v evidencii spojení (connection tracking) a ani niektorými inými pokročilými funkciami. Preto je potrebné urýchľovať až tie spojenia, ktoré už prešli prešetrením cez firewall pravidlá. Dodatočne ich už nemožno zakázať / prerušiť.

Pakety zrýchlených spojení sa už neobjavia ani v štatistikách jednotlivých pravidiel! Uvidíme ich však vo fiktívnom dynamickom pravidle č. 0, ktoré sa automaticky objaví, akonáhle použijeme Fast Track. Toto pravidlo spoznáme podľa komentára „special dummy rule to show fasttrack counters“ a slúži len pre zobrazenie štatistiky.

Urýchlenie spojenia dosiahneme akciou fasttrack connection v pravidle, ktorého úlohou je povoliť komunikáciu. Z praktických dôvodov je potrebné za toto pravidlo vždy pridať jeho kópiu s akciou accept z dvoch dôvodov:

  1. nie všetky pakety je možné urýchliť (podrobnosti sú opísané v dokumentácii k FastTrack);
  2. ak paket vyvolá akciu fasttrack connection, spojenie sa označí ako zrýchlené a ďalšie pakety už nepôjdu do firewallu, no tento samotný paket ešte zrýchlený nie je.

Pokiaľ chceme mať čo najjednoduchšie, ale funkčné riešenie, akciu fasttrack connection môžeme dať ako prvé v reťazci forward, a to pre už nadviazané spojenia a spojenia s nimi súvisiace, teda v sade 3 základných pravidiel bude v pozícii 1. pravidla:

/ip firewall filter
add action=fasttrack-connection chain=forward comment="FORWARD - povol uz nadviazane spojenia" connection-state=established,related
add action=accept chain=forward connection-state=established,related
add action=drop chain=forward connection-state=invalid
add action=accept chain=forward comment="povol vsetko ostatne"

/ipv6 firewall filter
add action=fasttrack-connection chain=forward comment="FORWARD - povol uz nadviazane spojenia" connection-state=established,related
add action=accept chain=forward connection-state=established,related
add action=drop chain=forward connection-state=invalid
add action=accept chain=forward comment="povol vsetko ostatne"