Posledná zmena: 7/9/2021
netfilter
"
iptables
"
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.
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é.
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é).
Š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
").
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.
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.
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.
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é".
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áž.
netfilter
"
Na vytvorenie firewallu typu "netfilter
" na Linuxe potrebujete:
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
"iptables
" (vytvára rozhranie na prácu s firewallom, pozrite
si aj "man iptables
")
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.).
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
".
"netfilter
" rozlišuje v tabuľke "filter" tri reťaze pravidiel podľa toho,
odkiaľ pakety prichádzajú a kam smerujú:
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!
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).
TODO
iptables
"
Nasleduje popis parametrov programu "iptables
", ktorý slúži na správu
paketového filtra.
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".
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
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".
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".
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.
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.
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.
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
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
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).
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
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
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
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
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.
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
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
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
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
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.
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
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
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
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
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
TODO
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
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
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ť:
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
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:
/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.update-rc.d vix-firewall-iptables start 40 S . stop 89
0 6 .
(pozri súbor "/usr/share/doc/iptables/README.Debian.gz
")