Firewall na linuxe

Firewall je sieťové zariadenie a/alebo softvér, ktorého úlohou je oddeliť siete s rôznymi prístupovými právami (typicky napr. Internet a Intranet) a kontrolovať tok dát medzi týmito sieťami. Kontrola údajov prebieha na základe aplikovania pravidiel, ktoré určujú podmienky a akcie. Podmienky sa stanovujú pre údaje, ktoré možno získať z dátového toku (napr. zdrojová, cieľová adresa, zdrojový alebo cieľový port a rôzne iné). Úlohou firewallu je vyhodnotiť podmienky a ak je podmienka splnená, vykoná sa akcia. Dve základné akcie sú "povoliť dátový tok" a "zamietnuť dátový tok". Zamietnutie paketu môže mať dve formy: zahodenie(bez informácie pre odosielateľa) a odmietnutie (odosielateľovi pošle správu o chybe).

Firewall na linuxe

Paketový filter
Paketový filter umožňuje sledovať sieťovú prevádzku po tretiu (štvrtú) vrstvu modelu OSI (t.j. IP adresy a porty). Paketový filter nevidí súvislosti medzi paketmi (nerozoznáva, či sú súčasťou jedného toku, relácie) a každý analyzuje samostatne. Každý paket prechádzajúci firewallom prechádza postupnosťou pravidiel a na základe podmienok – zdrojovej a cieľovej IP adresy, zdrojového a cieľového portu sa vykoná akcia (napr. povolenie alebo zamietnutie).

Stavový paketový filter
Tento filter dokáže dávať do súvisu prechádzajúce pakety a tak si uchováva stav spojenia. Stav spojenia možno využiť v pravidlách a napríklad automaticky povoliť odpovede na všetky odoslané pakety, povoliť spojenia, ktoré súvisia s daným spojením počas jeho trvania atď. Toto sa s výhodou používa napr. na riešenie problému, kedy musia na serveri fungovať služby, ktoré pri komunikácii využívajú náhodne vybrané porty (napr. pri prenose súborov pomocou FTP), ktoré sú inak zakázané. Tento filter rozoznáva, či paket patrí do vytvoreného spojenia, alebo je začiatkom nového. Niektoré DoS útoky zahlcujú firewall paketmi nových spojení za účelom naplniť pamäť a znemožniť tak funkčnosť firewallu.

Network address translation  ( NAT )
Ďalšou vlastnosťou firewallu, ktorá sa často používa, i keď nejde o filtrovanie, je schopnosť prekladu adries (Network Address Translation - NAT). NAT umožňuje zmeniť zdrojové a cieľové adresy v paketoch, čím sa najčastejšie umožňuje komunikácia so sieťami s privátnymi adresami (napr. 10.0.0.0/8). NAT umožňuje „skryť“ celú privátnu LAN sieť za jednu alebo viac verejných IP adries.  Aj preklad adries prebieha pomocou pravidiel.

Kde vytvoriť firewall?
V prípade, že firewall má chrániť iba jeden počítač, je tento firewall veľmi špecifický a určený pre potreby jediného počítača. Nemusíme sa pritom zaoberať  routovaním paketov ani prekladom adries. Sú nakonfigurované na tom počítači, ktorý majú chrániť, tak aby zabezpečili jeho prevádzku.
Ak je firewall určený na ochranu siete, jeho tvorba a testovanie je komplikovanejšie. Aby firewall správne fungoval, musí byť umiestnený medzi sieťami, ktoré oddeľuje, napr. Internet a našej LAN siete. Bezpečnostným štandardom je oddelenie LAN siete na 2 samostatné podsiete :
  • DMZ – demilitarizovaná zóna – sú v nej umiestnené servery, ktoré poskytujú služby vonkajším klientom a klientom v našej LAN sieti.
  • Samotná LAN sieť pozostávajúca z pracovných staníc užívateľov.
Aj pri tejto topológii je dôležité, aby firewall prepájal všetky spomenuté siete. Pokiaľ je to možné odporúčam, aby na firewalli nebežali žiadne služby. Vyhneme sa tak možným útokom – ak by sa útočník dostal na firewall, mohol by zmeniť alebo úplne vymazať pravidlá filtrovania a získať tak prístup k celej našej sieti.

Základy tvorby firewallu na Linuxe
Firewall  "netfilter" používa na uloženie pravidiel tabuľky. Sú presne tri:
  • filter (filtrovacie pravidlá)
  • nat (pravidlá pre preklad adries - NAT)
  • mangle (pravidlá pre rozličné úpravy paketov)
V jednotlivých tabuľkách sú pravidlá ďalej zoradené do tzv. reťazí (chains). Paket prechádza postupne všetkými pravidlami reťaze až dovtedy, kým nejaké pravidlo nerozhodne o jeho osude.  Vstavané štandardné reťaze určujú, kedy sa pravidlá budú aplikovať (či to bude pri vstupe paketu do firewallu, pri  jeho výstupe z neho a pod.).

"netfilter" rozlišuje v tabuľke "filter" tri reťaze pravidiel podľa toho, odkiaľ pakety prichádzajú a kam smerujú:
  1. INPUT: reťaz pravidiel, ktoré sa aplikujú na všetky pakety, ktoré prichádzajú na tento počítač. Týmito pravidlami chránite samotný počítač, na ktorom beží firewall.
  2. OUTPUT: reťaz pravidiel, ktoré sa aplikujú na všetky pakety, ktoré vznikli na tomto počítači a odchádzajú z neho. Týmito pravidlami môžete obmedziť pakety, ktoré vznikajú a odchádzajú z počítača, na ktorom beží firewall.
  3. FORWARD: reťaz pravidiel, ktoré prechádzajú týmto počítačom a sú smerované ďalej (ak Váš počítač funguje ako brána medzi sieťami). Týmito pravidlami chránite vnútornú sieť a prípadne DMZ.
Za normálnych okolností sú všetky tri reťaze pravidiel prázdne, neexistujú teda nijaké obmedzenia pre pakety. POZOR! Pakety, ktoré prechádzajú reťazou FORWARD neprechádzajú aj reťazami INPUT a OUTPUT.

"netfilter" rozlišuje v tabuľke "nat" tri reťaze pravidiel:
  • PREROUTING: reťaz pravidiel, ktoré sa aplikujú na pakety v okamihu vstupu do počítača. Pomocou pravidiel v tejto reťazi môžete modifikovať cieľovú adresu paketu (Destination NAT - DNAT). Využíva sa pri sprístupnení serverov vo vnútornej sieti z vonkajšej siete.
  • OUTPUT: reťaz pravidiel, ktoré sa aplikujú na pakety vznikajúce a odchádzajúce z počítača, na ktorom beží firewall, tesne pred ich routovaním
  • POSTROUTING: reťaz pravidiel, ktoré sa aplikujú na pakety v okamihu, keď opúšťajú počítač. Pomocou pravidiel v tejto reťazi môžete modifikovať zdrojovú adresu paketu (Source NAT – SNAT). Využíva sa pri komunikácii počítačov z vnútornej siete(privátne IP adresy) s Internetom cez verejnú adresu počítača s firewallom.

Základom každého filtrovacieho pravidla je jedna alebo viacero podmienok, ktoré umožňujú vybrať paket. Ak paket vyhovie podmienkam, vykoná sa akcia, ktorá je súčasťou definície pravidla a v prechádzaní ďalších pravidiel v reťazi sa nepokračuje. Ak ich nesplní, pokračuje sa vo vyhodnocovaní ďalšieho pravidla v reťazi pravidiel. Ak paket nesplní ani jednu podmienku, dostane sa na koniec reťaze pravidiel a vykoná sa akcia, ktorá je špecifikovaná ako "štandardná politika" (default policy).

Základné akcie, ktoré je možné urobiť s paketom:
  • ACCEPT: paket bude akceptovaný
  • DROP: paket bude zahodený. Odosielateľ paketu sa o tom ani nedozvie.
  • meno_reťaze: paket sa bude ďalej spracúvať v reťazi pravidiel "meno_reťaze"
  • meno_rozšírenia: paket sa odovzdá na spracovanie nejakému rozšíreniu (modulu) firewallu, napr.:
  • LOG: zaloguje vlastnosti paketu do logu (nezamietne paket!)
    • REJECT: umožní odmietnuť paket a poslať odosielateľovi hlásenie o chybe (pomocou ICMP paketu)
    • SNAT: umožní modifikovať zdrojovú adresu odchádzajúceho paketu
    • DNAT: umožní modifikovať cieľovú adresu prichádzajúceho paketu

Nástroj na správu firewallu  “iptables“
Uvediem iba základné funkcionality a syntax, viac na manuálových stránkach po zadaní príkazu  “man iptables“.

Nastavenie základnej politiky – predvolené nastavenie je pre všetky reťaze ACCEPT. Štandardnú politiku môžete definovať len pre štandardné reťaze pravidiel ("INPUT", "FORWARD" a "OUTPUT") tabuľky "filter". Nastavenie vykonáte príkazom
iptables -P reťaz akcia     napr.:    iptables -P INPUT DROP
Toto nastavenie zahodí všetky prichádzajúce pakety.

Výpis pravidiel – pomocou prepínačov príkazu iptables:
-L  vypíše pravidlá
-n  nebude sa robiť preklad IP adries na mená serverov
-v  zobrazí viac informácií, napr. mená sieťových rozhraní
-t  určíme názov tabuľky, ktorej pravidlá chceme vypísať, ak nezadáte –t, vypíše iba obsah tabuľky  “filter“
iptables -nvL -t nat

Vymazanie filtrovacích pravidiel budete potrebovať v dvoch prípadoch: v prípade, že chcete mať pri vytváraní firewallu istotu, že sa Vaše pravidlá nepobijú s existujúcimi pravidlami, alebo keď potrebujete filtrovanie vypnúť. Na to slúži parameter "-F". POZOR! Ak chcete odstaviť firewall, vymazanie pravidiel Vám nepomôže, ak zároveň nenastavíte štandardnú politiku na "ACCEPT".

iptables –F INPUT

Pri definícii novej reťaze nesmie existovať reťaz so zadaným menom. Ak potrebujete zrušiť reťaz najprv vymazať filtrovacie pravidlá v rámci reťaze a potom použiť parameter "-X":

iptables –F fromin
iptables –X fromin

Okrem štandardných reťazí pravidiel môžete vytvoriť ľubovoľný počet vlastných. Vlastné reťaze sa používajú na získanie väčšieho prehľadu v štruktúre pravidiel firewallu alebo v prípade, že Vaše filtrovanie je skutočne zložité. Na vytvorenie novej reťaze použijete parameter "-N":

iptables –N fromin

Ak potrebujete pridať pravidlo na koniec reťaze pravidiel, použijete parameter "-A", ak potrebujete pridať pravidlo na začiatok reťaze pravidiel, použijete parameter "-I":

iptables –A pravidlo
iptables –I pravidlo

Syntax pravidla:

iptables [-A|-I] reťaz [!] podmienka1 [[!] podmienka2 ... [!] podmienkaN] -j akcia [parameter_rozšírenia1] ... [parameter_rozšíreniaN]
-p    -podmienka pre protokol – tcp, udp, icmp, all
-s    -podmienka pre zdrojovú adresu – IP adresa, alebo interval (IP adresa/maska)
-d    -podmienka pre cieľovú adresu – IP adresa, alebo interval (IP adresa/maska)
-i    -podmienka pre vstupné rozhranie počítača (-i  eth0)
-o    -podmienka pre výstupné rozhranie počítača (-o  eth0)
--source-port port[:port]    -podmienka pre zdrojový port – číslo portu(rozsah) alebo meno služby
--destination-port port[:port]    -podmienka pre cieľový port – číslo portu(rozsah) alebo meno služby

Pr.: iptables -A fromout -p tcp -d 192.168.221.148 --dport 80 -j ACCEPT

Parametre rozšírenia pre preklad adries – NAT:
Akcia "SNAT" slúži na úpravu zdrojovej adresy odchádzajúceho paketu. Takto je možné modifikovať najmä pakety, ktoré pochádzajú zo siete s privátnymi adresami (napr. 10.x.x.x) a preposielať ich do Internetu. "SNAT" môžete použiť len v tabuľke "nat" v reťazi "POSTROUTING".
--to-source ipaddr[-ipaddr][:port-port]        -určuje IP adresu a port, ktorá sa použije ako zdrojová adresa, resp. port pozmeneného paketu. Je možné definovať aj viacero adries a rozsah portov.  Aby ste mohli použiť rozsah portov, musíte najprv špecifikovať parameter "-p tcp" alebo "-p udp".
Pr.: iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 192.168.221.148
Akcia "DNAT" slúži na úpravu cieľovej adresy prichádzajúceho paketu. Takto je možné modifikovať najmä pakety, ktoré majú byť smerované do siete s privátnymi adresami (napr. 10.x.x.x).
"DNAT" môžete použiť len v tabuľke "nat" v reťaziach "PREROUTING" a "OUTPUT".

--to-destination ipaddr[-ipaddr][:port-port]    -určuje IP adresu a port, ktorá sa použije ako cieľová adresa, resp. port pozmeneného paketu. Je možné definovať aj viacero adries a rozsah portov.  Aby ste mohli použiť rozsah portov, musíte najprv špecifikovať parameter "-p tcp" alebo "-p udp".
Pr.: iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.3:22



Stavový firewall aktivujete pomocou parametra "-m state stav", kde "stav" je čiarkou oddelený zoznam stavov spojenia, ktorým má paket vyhovieť. Máte na výber:
  • INVALID: paket nesúvisí s nijakým existujúcim spojením
  • ESTABLISHED: paket súvisí so spojením, ktoré už bolo nadviazané
  • NEW: paket iniciuje spojenie
  • RELATED: paket iniciuje nové spojenie, ale súvisí s už existujúcim spojením. Príkladom je napr. FTP spojenie, kedy sa okrem riadiaceho kanála vytvára nové spojenie na inom porte.

Pr.: iptables -A fromout -m state --state RELATED,ESTABLISHED -j ACCEPT

Pri tvorbe firewallu ako prvé nastavíme bezpečnostnú politiku (čo nie je administrátorom dovolené je zakázané), vymažeme všetky existujúce pravidlá a reťaze, aby sa nám neprekrývali. V ďalšom kroku vytvoríme vlastné reťaze a naplníme ich pravidlami(nie je podmienkou mať vlastné reťaze), pravidlá pridáme do základných reťazí. V nasledujúcom kroku vytvoríme NAT tabuľku a nastavíme smerovanie. Po vykonaní môžeme vypísať informáciu o aplikovaní firewallu.
Firewall, ktorý má ochrániť sieť od nedovoleného prístupu má najmenej pár desiatok pravidiel, a samozrejme nie je v silách administrátora, aby ich aplikoval pri každom štarte počítača. Tento „problém“ sa rieši napísaním skriptu, ktorý sa automaticky spustí pri bootovaní.  Takýto skript zabezpečí aplikáciu pravidiel firewallu už pri štarte. Po spustení skriptu sa aplikujú bezpečnostné obmedzenia, nastaví sa smerovanie medzi sieťami, a takisto sa zabezpečí NAT, čím získajú zariadenia vo vnútornej sieti prístup k vonkajším sieťam a službám.
Pred aplikovaním pravidiel za plnej prevádzky je  potrebné otestovať funkčnosť ako firewallu, tak aj smerovania a prekladu adries, aby sme si nenarobili ešte viac starostí ako sme mali doteraz .

Príklad skriptu pre jednoduchý firewall:

#! /bin/sh
#nastavenie politiky
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#vymazanie pravidiel
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F
iptables -F fromin
iptables -X fromin
iptables -F fromout
iptables -X fromout

#pridanie vlastnych retazi
iptables -N fromin
iptables -N fromout

#pravidla pre vlastne
iptables -A fromin -p icmp -j ACCEPT
iptables -A fromin -p tcp -d 192.168.1.1 --dport 22 -j ACCEPT
iptables -A fromout -p icmp -j ACCEPT
iptables -A fromout -p tcp -d 192.168.221.148 --dport 80 -j ACCEPT
iptables -A fromout -m state --state RELATED,ESTABLISHED -j ACCEPT

#retaze vlozene do INPUT
iptables -A INPUT -s 192.168.1.0/24 -j fromin
iptables -A INPUT ! -s 192.168.1.0/24 -j fromout

#pravidla pre retaz FORWARD
iptables -A FORWARD -p icmp -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -o eth0 -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.0/24 --sport 80 -j ACCEPT
iptables -A FORWARD -p udp -d 192.168.1.0/24 --sport 80 -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.0/24 --sport 53 -j ACCEPT
iptables -A FORWARD -p udp -d 192.168.1.0/24 --sport 53 -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.3 --dport 22 -j ACCEPT

#nastavenie NAT + smerovanie
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.3:22
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 192.168.221.148

echo "firewall nastaveny"
Zakladateľ, správca, redaktor
Používam linux intenzívne od roku 2003. Momentálne na desktopoch mám UBUNTU a na serveroch Debian, Ubuntu..