11. Firewall

Posledná zmena: 7/9/2021

11.1 Čo je firewall

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á adresu, 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". Po vykonaní takejto akcie firewall prestane paket spracovávať. Existujú však aj iné akcie, ktoré neurčujú osud paketu a slúžia napr. na logovanie hlavičiek paketu, zmenu hlavičiek paketu a podobne.

Ď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). Aj preklad adries prebieha pomocou pravidiel.

Podľa toho, na ktorej vrstve firewall analyzuje sieťovú prevádzku, rozlišujeme v zásade dva firewally: Aplikačný proxy server a Paketový filter.

11.1.1 Aplikačný proxy server

O aplikačnom proxy serveri sme hovorili už v kapitole Proxy server. Ide o filtrovanie na aplikačnej vrstve referenčného modelu OSI, t.j. aplikačný proxy server dokáže presne analyzovať celú sieťovú prevádzku a význam paketov na najvyššej vrstve. Tak môže chrániť napr. pred vírusmi alebo rôznym škodlivým obsahom a umožňovať prístup na základe autentifikácie používateľa.

Nevýhodou aplikačného proxy servera je spomalenie sieťovej prevádzky, pretože kvôli analýze údajov musí skladať všetky pakety až po aplikačnú vrstvu. Ďalšou nevýhodou je, že aplikačné proxy servery nie sú univerzálne a väčšinou treba používať špecifický proxy server pre každý typ komunikácie. Typické príklady sú napr. HTTP proxy servery, FTP proxy servery a iné.

11.1.2 Paketový filter

Paketový filter umožňuje sledovať sieťovú prevádzku po tretiu (štvrtú) vrstvu modelu OSI (t.j. IP adresy a porty). Je oveľa rýchlejší ako proxy, ale jeho správa je komplikovanejšia a nemá toľko možností, ako aplikačné proxy servery, pretože sa napríklad nedostane k menu používateľa, ktorému patria pakety.

Nevýhodou paketového filtra je aj to, že niekedy musia na serveri fungovať služby, ktoré pri komunikácii využívajú náhodne vybrané porty (napr. pri prenose súborov pomocou FTP). Paketový filter nevidí súvislosti medzi paketmi a každý analyzuje samostatne. Vtedy treba buď povoliť celý rozsah portov (príliš benevolentné), alebo ho zakázať a takéto služby nepoužívať (niekedy nerealizovateľné).

11.1.3 Stavový paketový filter

Špeciálnym prípadom paketového filtra je stavový paketový filter. Ten dokáže dávať do súvisu prechádzajúce pakety a tak si uchováva stav spojenia.

Jedno nadviazané spojenie a všetky pakety, ktoré k nemu patria, sa nazýva relácia alebo session.

Stav spojenia možno využiť v pravidlách a tak 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 už spomenutého problému s FTP.

Softvérový firewall je implementovaný priamo v jadre Linuxu. Vo verziách jadra 2.0.x sa na správu firewallu používal nástroj "ipfwadm", vo verziách 2.2.x to bol "ipchains" a vo vývojovom rade 2.4.x je to nástroj "iptables", ktorý okrem správy filtrovacích pravidiel umožňuje aj spravovať NAT. Samotný firewall sa nazýva "netfilter" (Stránka projektu: [http://www.netfilter.org/]).

Pretože "netfilter" je z technologického hľadiska najdokonalejší a pretože by ste mali používať jadrá verzie 2.4.x, budeme sa zaoberať iba týmto firewallom. ("Netfilter" v 2.4.x umožňuje použiť aj nástroje pre správu starších firewallov, preto sa možno v budúcnosti budem venovať aj staršiemu systému, ktorý sa ovládal pomocou programu "ipchains").

11.2 Kde vytvoriť firewall

Podľa chráneného subjektu môžeme firewally rozdeliť na dva druhy: firewally na ochranu (jedného) počítača (tzv. "host-based firewall") a firewally na ochranu celej siete.

11.2.1 Firewally na ochranu (jedného) počítača

Firewally určené na ochranu jediného počítača sú jednoduché: ich úlohou je chrániť jeden jediný počítač (väčšinou s jedinou sieťovou kartou), nepotrebujú sa zaoberať routovaním paketov ani prekladom adries. Sú nakonfigurované na tom počítači, ktorý majú chrániť, a tak môžu ich pravidlá byť veľmi špecifické a umožňovať len tú sieťovú prevádzku, ktorá je potrebná na zabezpečenie služby na danom počítači.

Takéto firewally sa často používajú na doplnkovú ochranu servera, ktorý je umiestnený za nejakým už existujúcim firewallom, napríklad (ale nie výlučne) vo webhostingovom centre.

11.2.2 Firewally na ochranu siete

Vo väčšine prípadov je úlohou firewallu oddeliť dve alebo viacero sietí s rôznymi prístupovými právami alebo obsahom. Naďalej sa budem držať príkladu, v ktorom firewall oddeľuje Internet a Intranet. Z toho celkom logicky vyplýva, že cez firewall musia "tiecť" všetky informácie prúdiace medzi sieťami - v opačnom prípade ich firewall nemôže kontrolovať. Firewall funguje pre siete ako brána (v skutočnosti vykonáva aj routovanie paketov, takže táto analógia vlastne vôbec nie je od veci).

Poznámka: Firewall, ktorý má chrániť sieť, musí byť umiestnený medzi sieťami, medzi ktorými má kontrolovať prevádzku.

11.2.3 Politika firewallu

V kapitole o bezpečnosti sme si hovorili o tom, aké dôležité je stanoviť si dobrú bezpečnostnú politiku. V prípade firewallu je dôležité najmä rozhodnutie, čo bude firewall robiť s paketmi, ktorých osud explicitne neurčíte.

Poznámka: Z vlastnej skúsenosti odporúčam postup, pri ktorom "čo nie je explicitne povolené, je zakázané".

11.2.4 Firewall+server versus samostatný firewall

Existujú v podstate dve riešenia, ako implementovať firewall do existujúcej siete. Prvé riešenie predpokladá, že firewall bude na serveri, ktorý bude poskytovať určité služby pre niektorú z oboch (alebo obe) sietí. Bude teda bránou, firewallom a serverom súčasne. Toto riešenie je "lacnejšie", pretože nepotrebujete samostatný počítač na firewall, ale nie je veľmi bezpečné. V prípade, že na firewalli bežia nejaké služby, možno ich za určitých okolností zneužiť (nech už sú ochránené akýmkoľvek spôsobom), získať práva administrátora a upraviť firewallové pravidlá (alebo ich napríklad celkom vymazať).

Naproti tomu, ak sa firewall umiestni na úplne samostatný počítač, na ktorom nebežia nijaké služby, je riešenie oveľa bezpečnejšie. V takomto prípade je vhodné, ak sa na firewall administrátor prihlasuje iba z konzoly, aby nemuseli na počítači bežať ani služby ako SSH. Všetky služby, ktoré majú byť dostupné z Internetu, bežia fyzicky na inom počítači a firewall zabezpečí správne smerovanie paketov či už pomocou normálnej routovacej tabuľky alebo pomocou NAT (Network Address Translation).

Najbezpečnejšie riešenie je také, pri ktorom firewall prepája nie dve, ale tri siete (Internet, Intranet a DMZ - Demilitarizovanú zónu). DMZ je sieť, ktorá sa používa na servery so službami prístupnými z Internetu. Firewall umožňuje chrániť Intranet (do neho sa dostanú maximálne odpovede na spojenia iniciované z Intranetu), verejné služby sú v oddelenom segmente siete a firewall nad všetkými paketmi drží stráž.

11.3 Firewall "netfilter"

Na vytvorenie firewallu typu "netfilter" na Linuxe potrebujete:

  1. podporu routovania v jadre: Networking options -> TCP/IP networking -> IP: advanced router
  2. pri štarte systému treba routovanie paketov povoliť príkazom echo "1" > /proc/sys/net/ipv4/ip_forward (väčšinou to za Vás obstará nejaký skript Vašej distribúcie Linuxu, Vy musíte len v konfiguračnom skripte uviesť, že chcete forwardovať pakety. V Mandrake je na to v súbore "/etc/sysconfig/network" direktíva "FORWARD_IPV4=true"
  3. podporu firewallu v jadre: Networking options -> IP Netfilter Configuration -> vyberte všetky potrebné možnosti, základom sú:
  4. nástroj "iptables" (vytvára rozhranie na prácu s firewallom, pozrite si aj "man iptables")
  5. veľa času na návrh, implementáciu a otestovanie firewallu. To súvisí aj s vytvorením bezpečnostnej politiky.

Ak si pri kompilovaní jadra nie ste celkom istí, čo budete potrebovať, môžete zakompilovať všetko (alebo všetko okrem "experimentálnych" komponentov). Ak vytvárate modulárne jadro a komponenty "netfiltra" skompilujete ako moduly, zavedú sa do pamäte iba ak to bude potrebné. Ak budete mať monolitické jadro, jeho veľkosť sa mierne zväčší. Keďže však predpokladám, že na firewalli nepotrebujete podporu zvukovej karty, 3D grafického akcelerátora atď., nebude jadro zasa až také veľké.

Pred vysvetľovaním filtrovacích pravidiel v "netfiltri" si musíme najprv vysvetliť niektoré pojmy. "netfilter" používa na uloženie pravidiel tabuľky. Sú presne tri:

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, jeho výstupe z neho a pod.).

11.3.1 Definície pravidiel

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. 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).

S paketom sa môžu vykonať nasledujúce akcie:

Rozšírených akcií je viac, ale pri tvorbe prvého firewallu ich asi potrebovať nebudete. Časom ich sem možno doplním, nič Vám však nebráni preštudovať si manuál "man iptables".

11.3.2 Tabuľka "filter" (filtrovacie pravidlá)

"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.

Poznámka: pakety, ktoré prechádzajú reťazou "FORWARD" neprechádzajú zároveň reťazami "INPUT" a "OUTPUT", hoci v starších firewalloch to tak bolo!

11.3.3 Tabuľka "nat" (pravidlá prekladu adries)

Tabuľka "nat" slúži na preklad adries v paketoch. "netfilter" rozlišuje v tabuľke "nat" tri reťaze pravidiel:

NAT sa používa najčastejšie vtedy, ak máte vnútornú sieť, v ktorej používate privátne rozsahy IP adries (neroutovateľné na Internete) a potrebujete zabezpečiť komunikáciu medzi vnútornou sieťou a Internetom.

Ak máte vo vnútornej sieti pracovné stanice a chcete zabezpečiť, aby mohli komunikovať s Internetom (vysielať požiadavky a prijímať odpovede), potrebujete zmeniť zdrojovú adresu každého paketu z vnútornej siete na nejakú verejnú IP adresu. Najčastejšie sa použije verejná adresa počítača, na ktorom robíte NAT. Tento preklad adries sa nazýva SNAT a väčšinou ho robíte v pomere 1:N. Pomocou sledovania komunikácie sa zabezpečí spätný preklad zdrojových adries paketov, ktoré predstavujú odpovede, aby sa dostali do vnútornej siete k správnemu príjemcovi.

Pri SNAT sa Internet domnieva, že komunikuje s počítačom, na ktorom je NAT a o existencii vnútornej siete a preklade adries nemá ani potuchy.

Ak máte vo vnútornej sieti servery a chcete zabezpečiť, aby Internet mohol komunikovať s týmito servermi (vysielať požiadavky a prijímať odpovede), potrebujete na počítači s NAT publikovať verejné IP adresy, ktoré budete používať na preklad (netreba pridávať sieťové karty, stačí vytvoriť virtuálne sieťové rozhrania). Počítače na Internete budú komunikovať s týmito verejnými adresami, pričom NAT zabezpečí preklad cieľovej adresy tak, aby sa paket dostal do vnútornej siete. Tento preklad sa nazýva DNAT a väčšinou ho robíte v pomere 1:1. Pomocou sledovania komunikácie sa zabezpečí spätný preklad zdrojových adries paketov, ktoré predstavujú odpovede, aby sa dostali naspäť do Internetu.

Pri DNAT sa Internet domnieva, že komunikuje s počítačom, na ktorom je NAT (tento počítač používa okrem svojej verejnej IP adresy aj ďalšie verejné adresy) a o existencii vnútornej siete a preklade adries nemá ani potuchy.

Pozor! Pri DNAT môžete otvoriť svoju vnútornú sieť smerom do Internetu a preto sa bezpečnosť Vašej siete znižuje! Ak sa niekomu podarí kompromitovať server vo Vašej sieti, môže z neho zaútočiť na ostatné počítače v rámci nej! Ak už používate DNAT, mali by ste mať servery umiestnené v osobitnej časti siete na samostatnom segmente (DMZ).

11.3.4 Tabuľka "mangle" (pravidlá na úpravu paketu)

TODO

11.3.5 Nástroj na správu firewallu "iptables"

Nasleduje popis parametrov programu "iptables", ktorý slúži na správu paketového filtra.

11.3.5.1 Nastavenie štandardnej politiky

Pokiaľ nie je povedané inak, sú v rámci štandardnej politiky nastavené akcie všetkých reťazí na "ACCEPT".

Nastavenie štandardnej politiky vykonáte príkazom iptables s parametrom "-P" (Policy):


  iptables -P reťaz akcia
  

čiže napr.


  iptables -P INPUT DROP

Tento príkaz štandardnú politiku pre reťaz INPUT na DROP. Pakety smerujúce na počítač s firewallom sa štandardne budú zahadzovať.

Pre firewall by ste mali používať kombináciu:


  iptables -P INPUT DROP
  iptables -P FORWARD DROP
  iptables -P OUTPUT ACCEPT

resp. (ešte paranoidnejšie nastavenie)


  iptables -P INPUT DROP
  iptables -P FORWARD DROP
  iptables -P OUTPUT DROP

Takéto nastavenie štandardnej politiky zaručuje jednu zo základných vlastností bezpečnostnej politiky - čo nie je explicitne povolené, bude zakázané.

Poznámka: štandardnú politiku môžete definovať len pre štandardné reťaze pravidiel ("INPUT", "FORWARD" a "OUTPUT") tabuľky "filter".

11.3.5.2 Zobrazenie filtrovacích pravidiel v reťazi

Na zobrazenie filtrovacích pravidiel slúži parameter "-L" (List). Okrem pravidiel zadanej reťaze sa vypíšu aj štandardné politiky.

Okrem parametra "-L" sa Vám určite hodí parameter "-n" (nebude sa robiť preklad IP adries na mená serverov) a "-v" (zobrazí viac informácií, napríklad mená sieťových rozhraní). Parameter "-t tabuľka" umožňuje určiť tabuľku, ktorej reťaze sa majú vypísať ("filter", "nat" alebo "mangle" - ak nezadáte parameter "-t", vypisuje sa obsah tabuľky "filter")

Ak nezadáte meno reťaze, vypíšu sa pravidlá všetkých definovaných reťazí.


  iptables -nvL
  iptables -nvL reťaz
  iptables -nvL -t nat

napr.


  iptables -nvL INPUT
    

Príklad (v ktorom neboli definované nijaké filtrovacie pravidlá):


  iptables -nL


Chain INPUT (policy ACCEPT)
target     prot opt source               destination
                                                                                
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
                                                                                
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

 iptables -nvL
  

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
                                                                                
                                                                                
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
                                                                                
                                                                                
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 

11.3.5.3 Vymazanie filtrovacích pravidiel

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" (Flush):

iptables -F reťaz

napr.


iptables -F INPUT

Poznámka: ak chcete odstaviť firewall, vymazanie pravidiel Vám nepomôže, ak zároveň nenastavíte štandardnú politiku na "ACCEPT".

11.3.5.4 Zrušenie reťaze

Pri definícii novej reťaze nesmie existovať reťaz so zadaným menom. V takom prípade alebo ak potrebujete zrušiť reťaz (nie vymazať pravidlá, ale kompletne zrušiť existenciu reťaze) z iného dôvodu, treba najprv vymazať filtrovacie pravidlá v rámci reťaze a potom použiť parameter "-X":


  iptables -F reťaz
  iptables -X reťaz

napr.


  iptables -F fromin
  iptables -X fromin

Poznámka: nemôžete zrušiť štandardné reťaze, ako sú napr. "INPUT", "OUTPUT" a "FORWARD" v tabuľke "filter".

11.3.5.5 Vytvorenie novej reťaze pravidiel

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é (napríklad chcete urobiť vetvenie pravidiel firewallu podobne ako v programovacom jazyku príkazom "if..then..else"), pretože Vami vytvorené reťaze môžete v pravidlách používať ako akcie. Na vytvorenie novej reťaze použijete parameter "-N" (New):


  iptables -N meno_reťaze

napr.


  iptables -N fromin

Poznámka: ak si budete vytvárať vlastné reťaze, najprv ich naplňte pravidlami a až keď sú hotové, vytvorte pravidlá, ktoré Vám do nich budú posielať pakety. Vyhnete sa tak problémom s čiastočne inicializovaným firewallom.

11.3.5.6 Pridanie filtrovacieho pravidla na koniec reťaze

Ak potrebujete pridať pravidlo na koniec reťaze pravidiel, použijete parameter "-A" (Add):


  iptables -A reťaz pravidlo

kde "reťaz" určuje meno reťaze, na ktorej koniec sa pravidlo pridá a "pravidlo" špecifikuje podmienky a akciu.

11.3.5.7 Pridanie filtrovacieho pravidla na začiatok reťaze

Ak potrebujete pridať pravidlo na začiatok reťaze pravidiel, použijete parameter "-I" (Insert):


  iptables -I reťaz pravidlo

kde "reťaz" určuje meno reťaze, na ktorej začiatok sa pravidlo pridá a "pravidlo" špecifikuje podmienky a akciu.

Pridávanie na začiatok reťaze oceníte najmä pri modifikácii existujúceho firewallu "za jazdy", keď budete chcieť zaručiť, že sa pravidlo aplikuje ešte pred všetkými ostatnými pravidlami. Keby ste pravidlo pridali na koniec reťaze, mohlo by sa Vám stať, že by sa k nemu pakety ani nedostali a boli by zamietnuté už v niektorom z predchádzajúcich pravidiel.

11.3.5.8 Vymazanie špecifického filtrovacieho pravidla

Menej používaná je možnosť vymazania filtrovacieho pravidla z reťaze. Pravidlá sú identifikované pomocou poradového čísla, takže si ich budete musieť najprv vypísať (prvé pravidlo má číslo 1). Na vymazanie pravidla použijete parameter "-D" (Delete):


  iptables -D reťaz číslo_pravidla

kde "reťaz" určuje meno reťaze, a "číslo_pravidla" poradové číslo pravidla (čísluje sa od 1).

Príklad 1: (vytvoríme jediné pravidlo a vymažeme ho)


  iptables -F INPUT
  iptables -A INPUT -p icmp -j DROP
  iptables -D INPUT 1

Okrem toho môžete vymazať pravidlo tak, že uvediete jeho kompletné znenie:


  iptables -D reťaz pravidlo

Príklad 2: (vytvoríme jediné pravidlo a vymažeme ho)


  iptables -F INPUT
  iptables -A INPUT -p icmp -j DROP
  iptables -D INPUT -p icmp -j DROP

11.3.5.9 Nahradenie špecifického filtrovacieho pravidla

Niekedy sa môže hodiť možnosť nahradiť jedno pravidlo v reťazi iným (ja sám som túto možnosť ešte nepotreboval, ale kto vie, možno ju oceníte). Použijete parameter "-R" (Replace):


    iptables -R reťaz číslo_pravidla pravidlo

kde "reťaz" určuje meno reťaze, "číslo_pravidla" poradové číslo pravidla, ktoré sa má nahradiť a "pravidlo" špecifikuje nové pravidlo.

Príklad: (vytvoríme jediné pravidlo a nahradíme ho iným)


  iptables -F INPUT
  iptables -A INPUT -p icmp -j DROP
  iptables -R INPUT 1 -p udp -j DROP

11.3.5.10 Syntax filtrovacieho pravidla

V predchádzajúcich ukážkach sme použili niekoľko jednoduchých pravidiel, ale zatiaľ sme si nepovedali, ako sa tvoria (potrebovali sme ich iba kvôli syntaxi príkazov v príkladoch). Bol to zámer, pretože ako uvidíte, možností je veľmi veľa a bez toho, aby ste poznali základné parametre "iptables" by Vám to samo osebe na nič nebolo.

Zanecháme teraz svet teórie a ukážeme si, ako môžeme definovať platné filtrovacie pravidlo.


iptables [-A|-I] reťaz [!] podmienka1 [[!] podmienka2 ... [!] podmienkaN] -j akcia [parameter_rozšírenia1] ... [parameter_rozšíreniaN]
  

kde "podmienky" umožňujú presne určiť pakety (môže ich byť niekoľko, ak začína podmienka znakom "!", platí jej negácia), ktoré Vás zaujímajú a "akcia" (kliknite pre definíciu "akcie") určuje, čo sa stane s paketom, ak vyhovie podmienkam. Niektoré akcie umožňujú (vyžadujú) zadať aj ďalšie "parametre" - pozor, zadávajú sa za špecifikáciou akcie!

Ako sme spomenuli vyššie, najčastejšie akcie sú "ACCEPT" (povoliť paket) a "DROP" (zahodiť paket).

11.3.5.11 Pravidlo pre protokol

Pomocou parametra "-p protokol" môžete určiť podmienku na protokol paketu. Protokol môžete definovať ako "tcp", "udp", "icmp" alebo "all" alebo ako číslo protokolu z "/etc/protocols".

Ak parameter špecifikujete ako "-p ! protokol", vyhovejú podmienke všetky pakety, ktoré používajú iný ako Vami špecifikovaný protokol.

Ak parameter "-p" nie je uvedený, alebo ak je jeho hodnota "all", na protokole paketu nezáleží.

Príklad (všetky TCP pakety prichádzajúce na tento počítač budú zahodené):


  iptables -A INPUT -p tcp -j DROP
  

11.3.5.12 Pravidlo pre zdrojovú adresu paketu

Pomocou parametra "-s adresa/maska" môžete určiť podmienku na zdrojovú adresu paketu. Maska sa uvádza v tvare "/255.255.255.0" alebo "/24", môžete ju samozrejme vynechať, ak ju nepotrebujete.

Ak parameter špecifikujete ako "-s ! adresa/maska", vyhovejú podmienke všetky pakety, ktoré nepochádzajú z danej zdrojovej adresy.

Ak parameter "-s" nie je uvedený, na zdrojovej adrese paketu nezáleží.

Príklad 1 (všetky pakety prichádzajúce na tento počítač z adresy 10.6.6.6 budú zahodené):


  iptables -A INPUT -s 10.6.6.6 -j DROP
  

Príklad 2 (všetky UDP pakety prichádzajúce na tento počítač zo siete 10.6.6.0/255.255.255.0 budú zahodené):


  iptables -A INPUT -p udp -s 10.6.6.0/255.255.255.0 -j DROP
  

Príklad 3 (všetky UDP pakety, ktoré neprichádzajú z 10.0.0.1 budú zahodené. Sledujeme pakety, ktoré sú smerované cez tento počítač):


  iptables -A FORWARD -p udp -s ! 10.0.0.1 -j DROP
  

11.3.5.13 Pravidlo pre cieľovú adresu paketu

Pomocou parametra "-d adresa/maska" môžete určiť podmienku na cieľovú adresu paketu. Maska sa uvádza v tvare "/255.255.255.0" alebo "/24", môžete ju samozrejme vynechať, ak ju nepotrebujete.

Ak parameter špecifikujete ako "-d ! adresa/maska", vyhovejú podmienke všetky pakety, ktoré nesmerujú na danú cieľovú adresu.

Ak parameter "-d" nie je uvedený, na cieľovej adrese paketu nezáleží.

Príklad 1 (všetky UDP pakety, ktoré neprichádzajú na adresu 10.0.0.1 budú zahodené. Sledujeme pakety, ktoré sú smerované cez tento počítač):


  iptables -A FORWARD -p udp -d ! 10.0.0.1 -j DROP
  

Príklad 2 (všetky pakety zo siete 192.168.0.0/16 smerujúce na 10.0.0.1 cez tento počítač budú zahodené.):


  iptables -A FORWARD -s 192.168.0.0/16 -d 10.0.0.1 -j DROP
  

11.3.5.14 Pravidlo pre vstupné sieťové rozhranie

Pomocou parametra "-i meno" môžete určiť podmienku na meno sieťového rozhrania, ktorým sa paket dostal do počítača (pre reťaze "INPUT" a "FORWARD"). Ak "meno" končí znakom "+", za meno rozhrania sa považujú všetky, ktoré začínajú zadaným textom.

Ak parameter špecifikujete ako "-i ! meno", vyhovejú podmienke všetky pakety, ktoré boli prijaté na inom ako určenom rozhraní.

Ak parameter "-i" nie je uvedený, vyhovie podmienke paket s ľubovoľným vstupným sieťovým rozhraním.

Príklad (všetky pakety, ktoré prichádzajú na tento počítač z rozhrania "lo" (loopback) budú prijaté. Zmysel príkladu je v tom, že pakety prijaté z loopbacku neopúšťajú počítač a tak týmto pravidlom povolíme komunikáciu programov na samotnom počítači, ktoré k svojej činnosti potrebuju loopback):


  iptables -A INPUT -i lo -j ACCEPT
  
  

11.3.5.15 Pravidlo pre výstupné sieťové rozhranie

Pomocou parametra "-o meno" môžete určiť podmienku na meno sieťového rozhrania, ktorým paket opustí počítač (pre reťaze "OUTPUT" a "FORWARD"). Ak "meno" končí znakom "+", za meno rozhrania sa považujú všetky, ktoré začínajú zadaným textom.

Ak parameter špecifikujete ako "-o ! meno", vyhovejú podmienke všetky pakety, ktoré opúšťajú počítač pomocou iného ako určeného rozhrania.

Ak parameter "-o" nie je uvedený, vyhovie podmienke paket s ľubovoľným výstupným sieťovým rozhraním.

11.3.5.16 Pravidlo pre zdrojový port (tcp, udp)

Pomocou parametra "--source-port port[:port]" môžete určiť podmienku na zdrojový port alebo rozsah portov. Okrem čísla portu môžete určiť aj jeho meno (zo súboru "/etc/services"). Rozsah portov sa špecifikuje takto:

Ak parameter špecifikujete ako "--source-port ! port[:port]", podmienka sa neguje.

Poznámka: parameter "--sport" je alias pre "--source-port".

Poznámka: aby ste mohli použiť tento parameter, musíte najprv špecifikovať parameter "-p tcp" alebo "-p udp".

Príklad: (všetky TCP pakety z inej siete ako 10.0.0.0/8 smerujúce do siete 10.0.0.0/8 so zdrojovým portom 1111 budú zamietnuté):


  iptables -A INPUT -p tcp -s ! 10.0.0.0/8 -d 10.0.0.0/8 --source-port 1111 -j DROP

11.3.5.17 Pravidlo pre cieľový port (tcp, udp)

Pomocou parametra "--destination-port port[:port]" môžete určiť podmienku na cieľový port alebo rozsah portov. Okrem čísla portu môžete určiť aj jeho meno (zo súboru "/etc/services"). Rozsah portov sa špecifikuje takto:

Ak parameter špecifikujete ako "--destination-port ! port[:port]", podmienka sa neguje.

Poznámka: parameter "--dport" je alias pre "--destination-port".

Poznámka: aby ste mohli použiť tento parameter, musíte najprv špecifikovať parameter "-p tcp" alebo "-p udp".

Príklad (všetky TCP pakety, ktoré neprichádzajú zo siete 10.0.0.0/8 na port "pop3" budú zahodené):


  iptables -A INPUT -p tcp -s ! 10.0.0.0/8 --dport pop3 -j DROP

10.3.5.18 Pravidlo pre príznaky TCP spojenia (tcp)

Pomocou parametra "--tcp-flags maska požadované" môžete určiť podmienku na paket so zadanými príznakmi (atribútmi) TCP. Hodnota "maska" je čiarkou oddelený zoznam príznakov, ktoré sa majú skontrolovať a hodnota "požadované" je čiarkou oddelený zoznam príznakov, ktoré musia byť v pakete nastavené. Môžete použiť príznaky: SYN, ACK, FIN, RST, URG, PSH, ALL, NONE.

Ak parameter špecifikujete ako "--tcp-flags ! maska požadované", význam parametra sa neguje.

Poznámka: aby ste mohli použiť tento parameter, musíte najprv špecifikovať parameter "-p tcp".

Príklad 1 (všetky TCP pakety, ktoré sú smerované cez tento počítať a ktoré majú nastavený príznak "SYN" budú zahodené):


  iptables -A FORWARD -p tcp --tcp-flags SYN SYN -j DROP

Príklad 2 (všetky TCP pakety, ktoré sú smerované cez tento počítač a ktoré majú nastavený príznak "SYN" a vynulované príznaky "ACK", "FIN" a "RST" budú zahodené):


  iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP

11.3.5.19 Pravidlo pre príznak "SYN" (tcp)

Parameter "--syn" je zjednodušenou formou predchádzajúceho parametra a umožňuje zadať podmienku na pakety, ktoré majú nastavený TCP príznak "SYN" (a príznaky "ACK" a "FIN" sú vynulované). Takéto pakety sa používajú na iniciovanie spojenia a môžete tak filtrovať pakety, ktoré sa snažia vytvoriť spojenie na Váš server a pritom prepúšťať pakety, ktoré sú odpoveďami na už vytvorené spojenia.

Ak použijete parameter ako "! --syn", význam podmienky sa neguje.

Poznámka: aby ste mohli použiť tento parameter, musíte najprv špecifikovať parameter "-p tcp".

Poznámka: lepšiu kontrolu nad spojením dosiahnete použitím stavového firewallu (pozri parameter "-m state").

Príklad (dve pravidlá. Prvé povolí prichádzajúce pakety zo siete 10.0.0.0/8 na adresu 10.0.0.1 (predpokladá sa, že je to vnútorná adresa firewallu) na cieľový port "ssh". Druhé pravidlo zahodí všetky pakety, ktoré sa pokúšajú vytvoriť spojenie na počítač, na ktorom beží firewall):


  iptables -A INPUT -p tcp -s 10.0.0.0/8 -d 10.0.0.1 --dport ssh -j ACCEPT
  iptables -A INPUT -p tcp --syn -j DROP

11.3.5.20 Špecifikácia akcie

Pomocou parametra "-j akcia" môžete určiť osud paketu, ktorý vyhovie stanoveným podmienkam. Ak chcete filtrovať pakety, je tento parameter povinný (bez neho podmienka skutočne nemá zmysel).

Hodnotou parametra je jedna z hodnôt: "ACCEPT", "DROP", "QUEUE", "RETURN" alebo hodnota platná pre rozšírenie ("LOG", "REJECT", "SNAT", "MASQUERADE", "DNAT", "REDIRECT" a iné), alebo meno reťaze, ktorá bude ďalej spracovávať paket.

11.3.5.20.1 Parametre pre rozšírenie "LOG"

Akcia "LOG" umožňuje logovať hlavičky paketov vyhovujúcich podmienkam do kernelového logovacieho súboru. Zapamätajte si, že akcia "LOG" paket nezamietne (ani nepovolí), takže aby ste s paketom niečo urobili, musíte vytvoriť ďalšie pravidlo s rovnakou podmienkou, ale so zodpovedajúcou akciou!

"LOG" podporuje tieto parametre:

Príklad (kombinácia pravidiel. Prvé pravidlo povolí UDP pakety z adresy 192.168.0.1 smerujúce do siete 10.0.0.0/8. Tretie pravidlo zakáže všetky (ostatné) UDP pakety smerujúce do siete 10.0.0.0/8. Všimnite si, ako záleží na poradí! Ak vymeníte poradie pravidiel, UDP pakety z adresy 192.168.0.1 sa nikdy do siete 10.0.0.0/8 nedostanú! Druhé pravidlo loguje všetky pakety, ktoré neprejdú tretím pravidlom):


  iptables -A FORWARD -p udp -s 192.168.0.1 -d 10.0.0.0/8 -j ACCEPT
  iptables -A FORWARD -p udp -d 10.0.0.0/8 -j LOG --log-prefix test
  iptables -A FORWARD -p udp -d 10.0.0.0/8 -j DROP

11.3.5.20.2 Parametre pre rozšírenia "REJECT"

Akcia "REJECT" slúži na "priateľské" odmietnutie paketu. Odosielateľ sa dozvie, že jeho paket nebol doručený (na rozdiel od "DROP", kedy je paket zahodený). Odosielateľ paketu dostáva chybovú správu vo forme ICMP správy.

"REJECT" podporuje tieto parametre:

Príklad (kombinácia pravidiel. Prvé pravidlo povolí UDP pakety z adresy 192.168.0.1 smerujúce do siete 10.0.0.0/8. Tretie pravidlo zakáže všetky (ostatné) UDP pakety smerujúce do siete 10.0.0.0/8, pričom upozorní odosielateľa paketu, že jeho paket nebol prijatý. Všimnite si, ako záleží na poradí! Ak vymeníte poradie pravidiel, UDP pakety z adresy 192.168.0.1 sa nikdy do siete 10.0.0.0/8 nedostanú! Druhé pravidlo loguje všetky pakety, ktoré neprejdú tretím pravidlom):


  iptables -A FORWARD -p udp -s 192.168.0.1 -d 10.0.0.0/8 -j ACCEPT
  iptables -A FORWARD -p udp -d 10.0.0.0/8 -j LOG --log-prefix test
  iptables -A FORWARD -p udp -d 10.0.0.0/8 -j REJECT

11.3.5.20.3 Parametre pre rozšírenie "SNAT"

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".

"SNAT" má parameter:

Poznámka: aby ste mohli použiť rozsah portov, musíte najprv špecifikovať parameter "-p tcp" alebo "-p udp".

Príklad (preklad adries pre pakety z vnútornej siete 10.0.0.0/8 odchádzajúce cez rozhranie eth0 - zdrojová adresa paketu sa nastaví na 192.168.0.1)


iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j SNAT --to-source 192.168.0.1
11.3.5.20.4 Parametre pre rozšírenie "MASQUERADE"

Akcia "MASQUERADE" 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.

"MASQUERADE" môžete použiť len v tabuľke "nat" v reťazi "POSTROUTING". Funkcia je veľmi podobná "SNAT" s tým rozdielom, že neurčujete zdrojovú adresu, ktorá sa použije pre odchádzajúce pakety - automaticky sa použije adresa sieťového rozhrania, cez ktoré paket opustí firewall.

"MASQUERADE" by ste mali používať iba v prípade, že máte dynamické pripojenie k Internetu (dial-up), inak použite "SNAT".

"MASQUERADE" má parameter:

Príklad (preklad adries pre pakety z vnútornej siete 10.0.0.0/8 odchádzajúce cez rozhranie eth0)


iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
11.3.5.20.5 Parametre pre rozšírenie "DNAT"

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".

"DNAT" má parameter:

Poznámka: aby ste mohli použiť rozsah portov, musíte najprv špecifikovať parameter "-p tcp" alebo "-p udp".

Príklad (preklad adries pre pakety z inej ako vnútornej siete 10.0.0.0/8 s cieľovým portom 80 (www) - cieľová adresa paketu sa nastaví na 192.168.0.1)


iptables -t nat -A PREROUTING -p tcp -s ! 10.0.0.0/8 --dport 80 -j DNAT --to-destination 192.168.0.1
11.3.5.20.6 Parametre pre rozšírenie "REDIRECT"

TODO

11.3.5.21 Stavový firewall

Pomocou tohto modulu môžete rozlišovať pakety podľa stavu spojenia. Toto sa najčastejšie používa na filtrovanie paketov, ktoré patria k už existujúcim spojeniam.

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:

Príklad (pakety patriace k už vytvoreným spojeniam budú v reťaziach "fromin" a "fromout" akceptované)


  iptables -A fromin -m state --state ESTABLISHED -j ACCEPT
  iptables -A fromout -m state --state ESTABLISHED -j ACCEPT

11.4 Konkrétny príklad malého firewallu s komentovanými pravidlami

V nasledujúcom malom príklade firewallu budeme predpokladať nasledovné:

Vytvoríme štandardné politiky pre všetky štandardné reťaze:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

Vytvoríme si dve nové reťaze, aby sme do nich mohli rozhadzovať pakety podľa toho, či prichádzajú z vnútornej siete ("fromin") alebo z vonkajšej siete ("fromout"):

iptables -N fromin
iptables -N fromout

Vytvoríme pravidlá pre pakety prichádzajúce z vnútornej siete na vnútorné rozhranie firewallu, ktorý funguje aj ako server:

Najprv povolíme všetky pakety, ktoré patria k už vytvoreným spojeniam:

iptables -A fromin -m state --state ESTABLISHED -j ACCEPT

Pridáme pravidlo, ktoré povolí pripojenie na TCP port smtp na vnútornom rozhraní:

iptables -A fromin -p tcp -d 10.0.0.1 --dport smtp -j ACCEPT

Pridáme pravidlo, ktoré povolí pripojenie na TCP port dns na vnútornom rozhraní:

iptables -A fromin -p tcp -d 10.0.0.1 --dport dns -j ACCEPT

Pridáme pravidlo, ktoré povolí pakety prichádzajúce na UDP port dns na vnútornom rozhraní:

iptables -A fromin -p udp -d 10.0.0.1 --dport dns -j ACCEPT

Pridáme pravidlo, ktoré povolí pripojenie na TCP port ssh na vnútornom rozhraní:

iptables -A fromin -p tcp -d 10.0.0.1 --dport ssh -j ACCEPT

Pridáme pravidlo, ktoré povolí pripojenie na TCP port 80 (www) na vnútornom rozhraní:

iptables -A fromin -p tcp -d 10.0.0.1 --dport 80 -j ACCEPT

Pridáme pravidlo, ktoré povolí pripojenie na TCP port 3128 (proxy server Squid) na vnútornom rozhraní:

iptables -A fromin -p tcp -d 10.0.0.1 --dport 3128 -j ACCEPT

Pridáme pravidlo, ktoré povolí pakety ICMP smerujúce na vnútorné rozhranie:

iptables -A fromin -p icmp -d 10.0.0.1 -j ACCEPT

Nasleduje pravidlo, ktoré povolí všetky pakety patriace k už existujúcim spojeniam; tentokrát však pre vonkajšie rozhranie.:

iptables -A fromout -m state --state ESTABLISHED -j ACCEPT

Pridáme pravidlo, ktoré povolí pripojenie na TCP port smtp na vonkajšom rozhraní:

    iptables -A fromout -p tcp -d 192.168.0.1 --dport smtp -j ACCEPT

Pridáme dvojicu pravidiel, ktorá povolí pripojenie na TCP a UDP port dns na vonkajšom rozhraní:

iptables -A fromout -p tcp -d 192.168.0.1 --dport dns -j ACCEPT
iptables -A fromout -p udp -d 192.168.0.1 --dport dns -j ACCEPT

Pridáme pravidlo, ktoré povolí pripojenie na TCP port 80 (www) na vonkajšom rozhraní:

iptables -A fromout -p tcp -d 192.168.0.1 --dport 80 -j ACCEPT

Pridáme pravidlo, ktoré povolí pakety ICMP smerujúce na vonkajšie rozhranie:

iptables -A fromout -p icmp -d 192.168.0.1 -j ACCEPT

Teraz kľúčová časť pravidiel: rozdelíme sieťovú prevádzku do reťazí "fromin" a "fromout" podľa toho, z ktorých adries pochádzajú pakety (z vnútorných: "fromin", z vonkajších: "fromout"). Na čo iné by sme také poetické mená použili... :)

iptables -A INPUT -s 10.0.0.0/255.255.255.0 -i eth0 -j fromin
iptables -A INPUT -s ! 10.0.0.0/255.255.255.0 -i eth1 -j fromout

Teraz umožníme paketom z vnútornej siete dostať sa na vonkajšiu sieť, a teda aplikácie vo vnútornej sieti budú môcť komunikovať s Internetom na ľubovoľných portoch. Opakom takéhoto riešena by mohlo byť použitie aplikačného proxy servera, ktorý by umožňoval aplikáciám prístup na Internet len cez svoje prostriedky, a len k vybraným portom.

iptables -A FORWARD -s 10.0.0.0/255.255.255.0 -o eth1 -j ACCEPT

Povolíme odpovede na pakety, ktoré pochádzajú z našej siete.

iptables -A FORWARD -s ! 10.0.0.0/255.255.255.0 -o eth0 -p tcp -m state --state ESTABLISHED -j ACCEPT

A teraz preklad adries z vnútornej siete smerom von: pakety sa budú tváriť, ako keby odchádzali priamo z vonkajšieho sieťového rozhrania 192.168.0.1:

iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth1 -j SNAT --to-source 192.168.0.1

11.5 Konkrétny príklad firewallu s komentovanými pravidlami

Teraz si ukážeme jeden kompletný príklad s filtrovacími pravidlami. Ide o časť skriptu, ktorý používam ako firewall na živom systéme už niekoľko mesiacov. Na tomto mieste nájdete aj prípadné novšie, možno aj vyskúšané verzie :)

Aké vlastnosti bude tento firewall mať:

  1. firewall je umiestnený medzi dvomi sieťami (Internet a intranet)
  2. firewall poskytuje služby do Internetu aj do intranetu
  3. definícia poskytovaných služieb (porty) umožňuje rýchlu zmenu bez nutnosti prepisovania celého skriptu či akýchkoľvek pravidiel (stačí vypnúť a znovu nahrať pravidlá, t.j. spustiť skript)
  4. počítače z vnútornej siete sa môžu pripájať na vnútornú aj vonkajšiu IP adresu firewallu (toto je v reálnom živote vhodné zakázať)
  5. komunikácia z firewallu do oboch sietí nie je obmedzená
  6. komunikácia z vnútornej siete do Internetu nie je obmedzená: aplikácie bežiace na počítačoch vo vnútornej sieti majú plný prístup k Internetu
  7. komunikácia z Internetu do vnútornej siete je obmedzená: cez firewall prejdú iba odpovede na spojenia zvnútra, t.j. nemožno vytvoriť spojenie z Internetu na počítač vo vnútornej sieti
  8. firewall umožňuje zapnúť preklad zdrojovej adresy (Source NAT - SNAT). Tak môžu s Internetom komunikovať aj počítače s adresami z privátnych adresných rozsahov. Počítače z vnútornej siete sa maskujú vonkajšou IP adresou firewallu

Nasledujúce riadky sú napísané v skriptovacom jazyku shellu "bash". Ak Vám to nič nehovorí, sústreďte sa vždy len na moje komentáre a na riadky, ktoré obsahujú príkaz "iptables".

Najprv si nastavíme premenné, ktoré budeme používať v celom shellovskom kóde a ktoré umožňujú jednoducho zmeniť adresy servera a sietí. Názvy premenných sú síce anglické, ale tak veľavravné, že Vás nebudem unavovať ich vysvetlením:

  INTERNAL_INTERFACE=eth0
  INTERNAL_IP=10.0.0.1
  INTERNAL_NETWORK=10.0.0.0
  INTERNAL_MASK=255.255.255.0

  EXTERNAL_INTERFACE=eth1
  EXTERNAL_IP=192.168.0.1

Nasledujúca premenná umožňuje zapnúť preklad adries (masquerading alebo tiež maskovanie zdrojovej adresy (Source NAT - SNAT)). Masquerading spôsobí, že počítače z vnútornej siete sa pri prístupe na vonkajšiu sieť budú maskovať za vonkajšiu IP adresu firewallu.

  USE_SNAT=no

Nasleduje určenie služieb, ktoré chcete poskytovať vonkajšej a vnútornej sieti. Služby definujeme ako čísla portov (môžete využiť aj rozsahy) a to osobitne pre TCP a pre UDP.

  # define array of port numbers, port names (/etc/services)
  # or low:high port ranges

  # services ENABLED from local network
  INTERNAL_SERVICE_TCP=(ssh ftp ftp-data smtp domain finger http pop3 ident 137:139 imap https imaps pop3s 3128);
  INTERNAL_SERVICE_UDP=(domain 137:139 talk ntalk);

  # services ENABLED from external network
  EXTERNAL_SERVICE_TCP=(ssh smtp domain http ident https imaps pop3s);
  EXTERNAL_SERVICE_UDP=(domain);

  ###########################################################################
  #    END OF USER SETTINGS I.                                              #
  ###########################################################################

Zapneme v kerneli podporou anti-spoofingu (ochrana proti IP podvodu, pri ktorom sa útočník z vonkajšej siete snaží používať IP adresy z vnútornej siete, aby prenikol dnu):

  ###########################################################################
  #    FIREWALL INITIALIZATION                                              #
  ###########################################################################

  echo "Setting ip-spoof kernel protection"
  for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done

Teraz nastavíme štandardné politiky:

  iptables -P INPUT DROP;
  iptables -P OUTPUT ACCEPT;
  iptables -P FORWARD DROP;

Vymažeme všetky pravidlá a zrušíme všetky používateľské reťaze:

  iptables -F;
  iptables -F -t nat;
  iptables -X;
  iptables -X -t nat;

Vytvoríme dve používateľské reťaze pravidiel. "fromin" pre pakety prichádzajúce z vnútornej siete a "fromout" pre pakety prichádzajúce z vonkajšej siete:

  iptables -N fromin;
  iptables -N fromout;

Teraz dočasne vypneme smerovanie paketov cez firewall (aby sa nesmerovali v čase, keď filtrovacie pravidlá nie sú nastavené):

  # stop IP forwarding before rules are applied
  echo 0 > /proc/sys/net/ipv4/ip_forward 

  echo "DEFAULT POLICIES:"
  echo "  INPUT -> DROP";
  echo " OUTPUT -> ACCEPT";
  echo "FORWARD ->DROP";

  ###########################################################################
  #    END OF FIREWALL INITIALIZATION                                       #
  ###########################################################################
  
  ###########################################################################
  #    *** FORWARD RULES ***                                                #
  ###########################################################################

Teraz definujeme pravidlá pre reťaz FORWARD. Povolíme pakety, ktoré pochádzajú z vnútornej siete (majú IP adresu z vnútornej siete) a odchádzajú do vonkajšej siete. Táto podmienka zabráni tomu, aby sa aplikovali pravidlá pre pakety, ktoré neopustia vnútornú sieť.

  # FROM local net FORWARDING TO external interface
  iptables -A FORWARD -s $INTERNAL_NETWORK/$INTERNAL_MASK -o $EXTERNAL_INTERFACE -j ACCEPT;

Ak ste zapli podporu masqueradingu, teraz sa povolí pre pakety, ktoré pochádzajú z vnútornej siete a odchádzajú do vonkajšej siete.

  # SNAT internal network, if requested
  [ "$USE_SNAT" == "yes" ] && echo "# SNAT for outgoing connections" && \
  iptables -t nat -A POSTROUTING -s $INTERNAL_NETWORK/$INTERNAL_MASK -o $EXTERNAL_INTERFACE -j SNAT --to-source $EXTERNAL_IP;

V tejto časti skriptu môžete definovať špeciálne pravidlá, ak ich potrebujete, pre reťaz "FORWARD". Sú to menovite pravidlá pre pakety, ktoré sa majú dostať z vonkajšej siete do vnútornej. Jeden z "inteligentných" príkladov môže byť podpora priamych spojení v ICQ (využívajú sa porty 4000 až 4100). Odporúčam Vám radšej túto možnosť nevyužiť, otvárate si tak dvierka do vnútornej siete. Navyše, ak používate vo vnútornej sieti privátne adresy, nebude táto možnosť fungovať bez ďalšieho prekladu adries (DNAT).

  ###########################################################################
  #    USER SETTINGS II.                                                    #
  ###########################################################################
  
  # example: allow ICQ direct communication ports (4000:4100)
  # iptables -A FORWARD -p tcp -s 0/0 -d $INTERNAL_NETWORK/$INTERNAL_MASK --dport 4000:4100 -j ACCEPT";

  ###########################################################################
  #    END OF USER SETTINGS II.                                             #
  ###########################################################################

Nasleduje stavová časť firewallu pre reťaz "FORWARD". Umožníme vstup TCP paketov, ktoré pochádzajú z vonkajšej siete, opúšťajú firewall na vnútornom sieťovom rozhraní a patria k už existujúcim spojeniam. Tieto pakety sú odpoveďami na spojenia iniciované z vnútornej siete.

  # FROM external net FORWARDING TO internal interface ESTABLISHED CONNECTIONS ONLY!!
  iptables -A FORWARD -s ! $INTERNAL_NETWORK/$INTERNAL_MASK -o $INTERNAL_INTERFACE -p tcp -m state --state ESTABLISHED -j ACCEPT;

V tomto okamihu prestávame pracovať s reťazou "FORWARD". Štandardná politika zabezpečí, že všetky pakety, ktoré sa dostali až sem, budú zahodené.

  # everything else is DROPPED by default policy

  ###########################################################################
  #    *** END OF FORWARD RULES ***                                         #
  ###########################################################################

  ###########################################################################
  #    *** OUTPUT RULES ***                                                 #
  ###########################################################################

Táto časť umožňuje obmedziť odchádzajúce pakety. V budúcnosti plánujem otestovať tento kód, ktorý by mal zamedziť paketom zo siete Microsoft Windows, aby opúšťali vnútornú sieť.

  # STOP Windows Network transmissions to Internet
  # FIXME: this has to be tested before it can be commented out
  # iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp --dport 137:139 -j DROP;
  # iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp --dport 137:139 -j DROP;

  ###########################################################################
  #    *** END OF OUTPUT RULES ***                                          #
  ###########################################################################

V tomto okamihu prestávame pracovať s reťazou "OUTPUT". Štandardná politika zabezpečí, že všetky pakety, ktoré sa dostali až sem, budú povolené.

  ###########################################################################
  #    *** INPUT RULES ***                                                  #
  ###########################################################################

Nasledujú pravidlá pre reťaz "INPUT". Najprv povolíme spojenia v rámci samotného počítača, ktoré používajú loopback.

  # allow all FROM localhost
  iptables -A INPUT -i lo -j ACCEPT

Nasleduje stavová časť firewallu pre reťaz "INPUT". Povolíme všetky pakety, ktoré smerujú na vonkajšiu resp. vnútornú adresu firewallu a patria k existujúcim spojeniam.

  # ACCEPT TCP replies + RELATED connections
  iptables -A fromout -d $EXTERNAL_IP -m state --state ESTABLISHED,RELATED -j ACCEPT ;
  iptables -A fromin  -d $EXTERNAL_IP -m state --state ESTABLISHED,RELATED -j ACCEPT ;
  iptables -A fromin  -d $INTERNAL_IP -m state --state ESTABLISHED,RELATED -j ACCEPT ;

Povolíme PING na vonkajšie rozhranie firewallu z vonkajšej siete.

  # ACCEPT icmp from EXTERNAL network
  iptables -A fromout -d $EXTERNAL_IP -p icmp -j ACCEPT ; 

Povolíme PING na obe rozhrania firewallu z vnútornej siete. Teoreticky by Vaše aplikácie mali z vnútornej siete používať len vnútorné rozhranie - ale ktovie...

  # ACCEPT icmp from INTERNAL network
  iptables -A fromin -d $INTERNAL_IP -p icmp -j ACCEPT ; 
  iptables -A fromin -d $EXTERNAL_IP -p icmp -j ACCEPT ; 

  ############################################################################

Teraz v cykle povolíme pripojenie na všetky TCP porty na vonkajšom rozhraní firewallu, ktoré predstavujú služby poskytované vonkajšej sieti.

  echo -n "# ACCEPTing external TCP services... ";

  let a=0;
  for port in ${EXTERNAL_SERVICE_TCP[@]} ; do
      iptables -A fromout -p tcp -d $EXTERNAL_IP --dport $port -j ACCEPT ;
      let a=$a+1;
  done;
  echo "($a)";
  
  ############################################################################

Teraz v cykle povolíme pripojenie na všetky UDP porty na vonkajšom rozhraní firewallu, ktoré predstavujú služby poskytované vonkajšej sieti.

  
  echo -n "# ACCEPTing external UDP services... ";
  let a=0;
  for port in ${EXTERNAL_SERVICE_UDP[@]} ; do
      iptables -A fromout -p udp -d $EXTERNAL_IP --dport $port -j ACCEPT ;
      let a=$a+1;
  done;
  echo "($a)";
  
  ############################################################################

Teraz v cykle povolíme pripojenie na všetky TCP porty na vonkajšom i vnútornom rozhraní firewallu, ktoré predstavujú služby poskytované vnútornej sieti. Opäť, aplikácie vo vnútornej sieti by nemali používať vonkajšiu adresu servera.


  echo -n "# ACCEPTing internal TCP services... ";
  let a=0;
  for port in ${INTERNAL_SERVICE_TCP[@]} ; do
      iptables -A fromin -p tcp -d $INTERNAL_IP --dport $port -j ACCEPT ;
      iptables -A fromin -p tcp -d $EXTERNAL_IP --dport $port -j ACCEPT ;
      let a=$a+1;
  done;
  echo "($a)";

  ############################################################################

Teraz v cykle povolíme pripojenie na všetky UDP porty na vonkajšom i vnútornom rozhraní firewallu, ktoré predstavujú služby poskytované vnútornej sieti.

  
  echo -n "# ACCEPTing internal UDP services... ";
  let a=0;
  for port in ${INTERNAL_SERVICE_UDP[@]} ; do
      iptables -A fromin -p udp -d $INTERNAL_IP --dport $port -j ACCEPT ;
      iptables -A fromin -p udp -d $EXTERNAL_IP --dport $port -j ACCEPT ;
      let a=$a+1;
  done;
  echo "($a)";
  

Teraz prepošleme všetky pakety z vnútornej siete (zdrojová adresa z vnútornej siete, prijaté na vnútornom rozhraní a na vnútornej IP adrese firewallu) do reťaze "fromin".

  # FROM local net THROUGH local interface TO local IP of server
  iptables -A INPUT -s $INTERNAL_NETWORK/$INTERNAL_MASK -i $INTERNAL_INTERFACE -d $INTERNAL_IP -j fromin;

Ďalej prepošleme všetky pakety z vnútornej siete (zdrojová adresa z vnútornej siete, prijaté na vnútornom rozhraní a na vonkajšej IP adrese firewallu) do reťaze "fromin".

  # FROM local net THROUGH local interface TO external IP of server
  iptables -A INPUT -s $INTERNAL_NETWORK/$INTERNAL_MASK -i $INTERNAL_INTERFACE -d $EXTERNAL_IP -j fromin;

Teraz pozor! Pakety, ktoré majú zdrojovú adresu z vnútornej siete, ale boli prijaté na inom ako vnútornom sieťovom rozhraní, sú falošné! Zalogujeme ich a štandardná politika ich na konci reťaze zahodí.

  # !!! FROM internal net RECEIVED THROUGH OTHER THAN LOCAL interface ...
  # this is IP SPOOFING!
  
  # FIXME: this is already protected by anti-spoofing
  iptables -A INPUT -s $INTERNAL_NETWORK/$INTERNAL_MASK -i ! $INTERNAL_INTERFACE -j LOG;

Ďalej prepošleme všetky pakety z vonkajšej siete (zdrojová adresa z inej ako vnútornej siete, prijaté na vonkajšom rozhraní a na vonkajšej IP adrese firewallu) do reťaze "fromout".

  # FROM out net THROUGH external interface TO external IP of server
  iptables -A INPUT -s ! $INTERNAL_NETWORK/$INTERNAL_MASK -i $EXTERNAL_INTERFACE -d $EXTERNAL_IP -j fromout;

Opäť pozor! Pakety, ktoré majú zdrojovú adresu inú ako z vnútornej siete, prijaté na vonkajšom rozhraní, ale smerujúce na vnútornú IP adresu firewallu, tu tiež nemajú čo hľadať. Zalogujeme ich a štandardná politika ich na konci reťaze zahodí.

  # !!! FROM external net THROUGH external interface TO internal! IP of server
  # !!! Z VONKAJSEJ siete PRIJATE CEZ vonkajsi interface NA vnutornu IP
  # FIXME: this is already protected by anti-spoofing
  iptables -A INPUT -s ! $INTERNAL_NETWORK/$INTERNAL_MASK -i $EXTERNAL_INTERFACE -d $INTERNAL_IP -j LOG;

A napokon: pakety so zdrojovou adresou z vonkajšej siete prijaté na vnútornom rozhraní znamenajú chybu v konfigurácii niektorého počítača vo vnútornej sieti (nesprávne nastavená IP adresa). Zalogujeme informáciu a štandardná politika na konci reťaze paket zahodí.

  # !!! FROM external net RECEIVED THROUGH internal! interface
  # this is bad IP ADDRESS or some other error in LOCAL network
  iptables -A INPUT -s ! $INTERNAL_NETWORK/$INTERNAL_MASK -i $INTERNAL_INTERFACE -j LOG;

  ###########################################################################
  #    *** END OF INPUT RULES ***                                           #
  ###########################################################################

Sme na konci - môžeme zapnúť smerovanie paketov cez firewall.

  echo 1 > /proc/sys/net/ipv4/ip_forward

A celkom na koniec, ako by sme takýto firewall odstavili? Nuž, takto:

  iptables -F
  iptables -F -t nat;

  iptables -F
  iptables -F fromout

  iptables -X;
  iptables -X -t nat;

  iptables -P INPUT ACCEPT
  iptables -P OUTPUT ACCEPT
  iptables -P FORWARD ACCEPT
  
  for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done

11.6 Práca s firewallom na Debiane

Keď si ručne alebo nejakým dočasným skriptom nastavíte potrebné pravidlá firewallu, je potrebné zabezpečiť automatické spustenie firewallu pri štarte operačného systému. Na Debiane Sarge je podporovaný tento spôsob:

  1. Pri štarte systému používajte vlastný skript, napr. "/etc/init.d/vix-firewall-iptables" namiesto "/etc/init.d/iptables". Ukážku takéhoto skriptu si preberáme v tejto kapitole. Predtým spomínaný spôsob pomocou skriptu "/etc/init.d/iptables" už nefunguje.
  2. Zo svojho (môjho) skriptu urobte štartovací skript príkazom: update-rc.d vix-firewall-iptables start 40 S . stop 89 0 6 . (pozri súbor "/usr/share/doc/iptables/README.Debian.gz")