Iptables: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Mkaosaar (talk | contribs)
No edit summary
Okarjane (talk | contribs)
Undo revision 64858 by Okarjane (Talk)
 
(41 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Koostanud: '''Mikk Käosaar''' A41, ''Detsember 2011''<br>
Viimati muudetud: ''20.12.2011''
== Sissejuhatus ==
== Sissejuhatus ==
   
   
Käesolev artikli eesmärgiks on tutvustada tulemüüri rakendust iptables, selle ajalugu ning peamisi toimimise mehhanisme. Lisaks on välja toodud olulisemad aspektid rakenduse kasutamise eesmärkidest, paigaldamisest, konfigureerimisest ja haldamisest. Artikkel on mõeldud abimaterjalina ja tutvustusena linuxi alaste baasteadmistega kasutajatele.
Käesolev artikli eesmärgiks on tutvustada tulemüüri rakendust iptables, selle ülesehitust ning peamisi toimimise mehhanisme. Lisaks on välja toodud olulisemad aspektid rakenduse kasutamise eesmärkidest, paigaldamisest, konfigureerimisest ja haldamisest. Artikkel on mõeldud abimaterjalina ja tutvustusena linuxi alaste baasteadmistega kasutajatele.




Line 15: Line 18:
== Mis on Iptables? ==
== Mis on Iptables? ==


Iptables on linuxi tarkvararakendus, mis võimaldab kasutajatel ja süsteemi administraatoritel seadistada ning hallata kerneli tulemüüri mingis konkreetses linuxi süsteemis. Iptables võimaldab kasutajatel luua n.ö kontrollahelaid ehk reeglite jadasid mille alusel reguleeritakse võrgupakettide liikumist erinevatel võrguliidestel ja üldist ligipääsu süsteemile. Erinevate protokollide jaoks on kasutusel erinevad kerneli moodulid ning Iptables programmid. Käesolev juhend keskendub programmile Iptables (kasutab kerneli moodulit nimega ip_tables) mis keskendub põhiliselt IPv4 protokollile. Lisaks on olemas moodulid ja programmid IPv6 ja ARP protkollidele ning ethernet pakettidele. Üldjoontes on Iptables'i näol tegemist pigem konfiguratsiooni tööriistaga või Netfilter'i kasutajaliidesega, kui eraldiseisva tulemüüri rakendusega.
Iptables on linuxi tarkvararakendus, mis võimaldab kasutajatel ja süsteemiadministraatoritel seadistada ning hallata tulemüüri mingis konkreetses linuxi süsteemis. Iptables'i peamiseks eesmärgiks on tagada andmeside ning arvutisüsteemide turvalisus erinevatel linuxi kernelit kasutavatel seadmetel. Iptables'i peamised kasutusalad on võrguliikluse filtreerimine vastavalt kasutaja või süsteemiadministraatori poolt määratud reeglitele ning tihti Network Address Translation (NAT) teostamine. Iptables võimaldab kasutajatel luua tabeleid mis sisaldavad n.ö kontrollahelaid ehk reeglite jadasid mille alusel reguleeritakse võrgupakettide liikumist võrguliidestel ja pakettide üldist ligipääsu süsteemile. Erinevate protokollide jaoks on kasutusel erinevad kerneli moodulid ning Iptables versioonid. Käesolev juhend keskendub programmile Iptables mis keskendub põhiliselt IPv4 protokollile. Iptables kasutab oma töös kerneli moodulit nimega ip_tables. Lisaks eelnimetatule olemas moodulid ka IPv6 ja ARP protkollidele ning ethernet raamidele. Üldjoontes on Iptables'i näol tegemist pigem konfiguratsiooni tööriistaga või kerneli tulemüürimooduli Netfilter'i kasutajaliidesega, kui eraldiseisva tulemüürirakendusega.




== Iptables ajalugu ==
== Iptables algus ==


Iptables'i arendus sai alguse paralleelselt Netfilter raamistikuga 1998 aastal. Kasutajateni jõudisis Iptables'i esimene versioon koos linuxi kerneli versiooniga 2.4 aastal 2001. Iptablesi eelkäijateks loetakse rakendusi ipchains ja ipfwadm, millest viimane põhineb omakorda BSD ipfw rakendusel. Vaatamata kestvale arendusprotsessile, pole aja jooksul toimunud suuremaid versiooni muudatusi ning artikli kirjutamise hetkel on jõutud versioonini 1.4.12.1. Aastal 2009 alustati tööd ka Iptables'i järglaseks tituleeritud "nftables" projektiga. Käesoleval hetkel on antud projektist väljastatud vaid alfaversioon ning aktiivne arendusprotsess on peatunud.  
Iptables'i arendus sai alguse paralleelselt Netfilter raamistikuga 1998 aastal. Kasutajateni jõudisis Iptables'i esimene versioon koos linuxi kerneli versiooniga 2.4 aastal 2001. Iptablesi eelkäijateks loetakse rakendusi ipchains ja ipfwadm, millest viimane põhineb omakorda BSD ipfw rakendusel. Vaatamata kestvale arendusprotsessile, pole aja jooksul toimunud suuremaid versiooni muudatusi ning artikli kirjutamise hetkeks on viimane ametlikult väljastatud versioon 1.4.12.1. Aastal 2009 alustati tööd ka Iptables'i järglaseks tituleeritud "nftables" projektiga. Sellest pidi kujunema asendustööriist Iptablesile ning oli mõeldud ühendama praegu eraldiseisvaid protokollide haldusvahendeid. Käesoleval hetkel on antud projektist väljastatud vaid alfaversioon ning aktiivne arendusprotsess on peatunud.  


== Ülesehitus ja tööpõhimõte ==
== Ülesehitus ja tööpõhimõte ==
''Märkus: Selguse huvides on järgnevat käsitletud ühe linux-süsteemi piires.''


=== Netfilter ===
=== Netfilter ===


Nagu enamik võrguliikluse filtreerimisega seotud rakendusi, põhineb Iptables oma tegevuses pakettide analüüsile. Iga süsteemi läbiv pakett viiakse läbi "käsuahela" ehk reeglite jada, mille alusel määratakse paketi edasine saatus. Iptables'i funktsionaalsus põhineb linuxi kernelis paikneval Netfilter'i raamistikul, linuxi kerneli osal, mis võimaldab võrguliikluse jälgimist ja manipuleerimist. Seetõttu on oluline lisaks Iptablesile tutvustada veidi ka Netfilter'i tööpõhimõtteid. Netfilter jaotab oma funktsionaalsuse mitmesse ossa. Kasutajataseme programmid, nagu Iptables, saavutavad oma vajaliku funktsionaalsuse pöördudes Netfilter'i erinevate moodulite (osade) poole. Iga moodul tagab erineva funktsionaalsuse ning on teiste moodulite suhtes kindlalt järjestatud, s.t iga mooduli poole pöördumine toimub kindlas järjekorras. Netfilteri mooduleid võib käsitleda ka kui tabeleid mis koosnevad reeglite jadadest. Nagu eelpool mainitud nimetatakse selliseid reeglite jadasid ka ahelateks. Seega iga tabel (moodul) võib koosneda paljudest käskudest mis moodustavad ahela. Selliste ahelate ülesanneteks ongi harilikult võrguliikluse filtreerimine ning pakettide haldamine, näiteks Network Adress Translation'i (NAT) võimaldamine. Ahelaid nimetatakse üldjuhul filtreeritavate pakettide päritolu järgi. Näiteks välisvõrgust sissetulev pakett satuks "INPUT" ahelasse ning välisvõrku suunatud pakett peab läbima "OUTPUT" ahela. Üheks olulisemaks uuenduseks võrreldes oma eelkäijatega on Netfilteri võimekus jälgida ja hallata ühenduste olekut (connection tracking). See võimaldab Netfilteril jagada pakette erinevate olekute alusel, mille abil on võimalik iga pakett suunata õigesse ahelasse. Erinevad olekud võivad olla järgnevad  
<p>Nagu enamik võrguliikluse filtreerimisega seotud rakendusi, põhineb Iptablesi töö andmeside pakettide analüüsil. Iga süsteemi läbiv pakett viiakse läbi kontrollahela(te), mille alusel määratakse paketi edasine saatus vaadeldavas süsteemis. Iptables'i funktsionaalsus põhineb linuxi kernelis paikneval Netfilter'i raamistikul, mis võimaldab võrguliikluse jälgimist ja manipuleerimist. Seetõttu on oluline lisaks Iptablesile tutvustada pisut ka Netfilter'i tööpõhimõtteid. </p>
*NEW: viitab uue ühenduse loomisele
<p>Netfilter jaotab oma funktsionaalsuse mitmesse ossa. Kasutajataseme programmid, nagu Iptables, saavutavad oma vajaliku funktsionaalsuse pöördudes Netfilter'i erinevate moodulite (osade) poole. Iga moodul tagab erineva funktsionaalsuse ning on teiste moodulite suhtes kindlalt järjestatud, s.t iga mooduli poole pöördumine toimub kindlas järjekorras. Netfilteri mooduleid võib käsitleda ka kui tabeleid mis koosnevad reeglite jadadest. Nagu eelpool mainitud nimetatakse selliseid reeglite jadasid ka ahelateks. Seega iga tabel (moodul) võib koosneda paljudest käskudest mis moodustavad ahela. Selliste ahelate ülesanneteks ongi harilikult võrguliikluse filtreerimine ning pakettide haldamine, seal hulgas ka näiteks NAT'i võimaldamine.</p>
*ESTABLISHED: analüüsitav pakett kuulub mõne juba eksisteeriva ühenduse alla
<p>Ahelaid liigitatakse ning nimetatakse üldjuhul filtreeritavate pakettide päritolu järgi. Näiteks välisvõrgust saabuv pakett satuks "INPUT" ahelasse ning välisvõrku suunatud pakett peab läbima "OUTPUT" ahela. Üheks olulisemaks uuenduseks võrreldes oma eelkäijatega ipcahins ja ipfwadm on Netfilter'il võimekus jälgida ja hallata ühenduste olekut (connection tracking). See võimaldab Netfilteril jaotada pakette erinevate, ühenduse, olekute alusel. Viimase abil omakorda on aga võimalik iga pakett suunata koheselt õigesse filtreerimis või NAT ahelasse. Erinevad olekud võivad olla järgnevad  
*RELATED: viitab oodatud käitumisele - näiteks analüüsitav pakett on osa uue ühenduse alustamisest ja seetõttu selle saabumine "ette aimatav". Teine võimalus on näiteks juba olemas oleva ühendusega seotud ühenduse loomine. Ehk mingi juba ühendust omav programm algatab paralleelselt eksisteerivaga uue ühenduse.  
 
*NEW: tehakse algust uue ühenduse loomisega
*ESTABLISHED: analüüsitav pakett kuulub mõne juba eksisteeriva ühenduse juurde
*RELATED: viitab oodatud, ennustatud käitumisele - näiteks analüüsitav pakett on osa uue ühenduse alustamisest ja seetõttu selle saabumine "ette aimatav". Teine võimalus on näiteks juba olemas oleva ühendusega seotud ühenduse loomine. Teisiti öeldes - mingi, juba ühendust omav programm algatab paralleelselt eksisteeriva ühendusega uue ühenduse, mis on seostatud vanaga. Näiteks FTP parooli sisestamisel algatatakse FTP kliendi poolt mitu erinevat ühendust, mis on omavahel seotud, kuna kuuluvad kõik samale FTP rakendusele.
*INVALID: viitab paketile, mille päritolu ei suudeta tuvastada ehk mis ei kuulu ühegi olemasoleva ühendusse alla ega alusta uut ühendust.
*INVALID: viitab paketile, mille päritolu ei suudeta tuvastada ehk mis ei kuulu ühegi olemasoleva ühendusse alla ega alusta uut ühendust.
*UNTRACKED: eriolek, administraatorile kes soovib mingi paketi ignoreermist ühenduse kontrollimisel
*UNTRACKED: eriolek, administraatorile kes soovib mingi paketi ignoreermist ühenduse kontrollimisel</p>


=== Iptables ===
=== Iptables ===


Tulenevalt Netfilteri ülesehitusest põhineb ka Iptablesi töö erinevate käsuahelate ja tabelite haldamisel. Iptablesi puhul koosnevad tabelid reeglitest ning otsustest. Iga tabel kirjeldab milliseid tunnuseid pakettides otsida ning kui võrre on tuvastatud, siis millist tegevust antud paketi puhul läbi viia. Paketi võrdlemise käigus käiakse tabel ja selles sisalduv ahel läbi käskhaaval. Oluline on teada, et "käske läbitakse järjekorras seni kuni leitakse esimene vaste."
<p>Tulenevalt Netfilteri ülesehitusest põhineb ka Iptablesi töö erinevate käsuahelate ja tabelite haldamisel. Iptablesi puhul koosnevad tabelid reeglitest ning otsustest. Iga tabel kirjeldab milliseid tunnuseid pakettides otsida ning kui võrre on tuvastatud, siis millist tegevust antud paketi puhul rakendada. Paketi võrdlemise käigus käiakse tabel ja selles sisalduv ahel läbi käskhaaval. Oluline on teada, et ''<b>käske läbitakse järjekorras seni kuni leitakse esimene vaste</b>''. See tähendab, et pärast esmase vaste leidmist ahelat enam edasi ei uurita. Seega kui ahelas on mitu sarnase võrdlustunnusega kuid erineva otsusega reeglit, sooritatakse filtreerimine vastavalt selle reegli alusel, mis oli ahelas eespool.
See tähendab, et pärast esmase vaste leidmist ahelat enam edasi ei uurita. Seega kui ahelas on mitu sarnase võrdlustunnusega kuid erineva otsusega reeglit, sooritatakse filtreerimine vastavalt selle reegli alusel, mis oli ahelas eespool. Näiteks kui administraator soovib lubada kõiki TCP pakette mis saabuvad INPUT ahelasse pordilt 80 ning samas ahelas keelata pordile 80 saabuvad TCP paketid, mis suunduvad porti 8000, siis lubatakse siiski kõigi TCP pakettide liiklus kuna vastav reegel eelnes teisele. Sellisest käitumisest pääsemiseks peab asetama üldisemad reeglid ahela lõpu poole ning rohkem spetsiifilised ahela algusesse. Sel viisil uuritakse täpsemalt kirjeldatud reegleid varem ning alles siis, kui ükski varasematest reeglitest pole vajaliku vastet paketile toonud, rakendatakse üldisemalt piiritletud reegleid. Loomulikult saab määrata ka ahela üldotsuse, mida rakendatakse juhul kui ükski reegel terves ahelas pole võrreldava tunnusega vastet toonud. Lisaks harilikele otsustele on võimalik kasutada ka ahela suunamist ehk "goto" funktsiooni.
 
Selle abil on võimalik teatava üldisema mustri avastamisel suunata pakett ühest ahelast teise. Sellist hierarhiat võib luua täpselt nii sügavaks kui peaks vajalikuks osutuma. Kui pakett jõuab suunatud ahela lõppu, kuid pole selles ühtegi vastet tuvastanud suunatakse see automaatselt tagasi n.ö "vanem-ahelasse" ehk sinna kust konkreetne ahel välja kutsuti. Vanemahelasse saab tagasi pöörduda ka kasutades käsku "RETURN" märkides selle mõne sobiva reegli otsusena.
Näiteks kujutame ette olukorda kui süsteemiadministraator soovib lubada kõiki TCP pakette mis saabuvad INPUT ahelasse pordilt 80 ning samas ahelas keelata pordile 80 saabuvad TCP paketid, mis on suunatud porti 8000. Antud juhul lubatakse siiski kõigi TCP pakettide liiklus kuna üldisem reegel, mis kattus paketi andmetega, eelnes spetsiifilisemale reeglile.
Sarnane ülesehitus kehtib ka NATi kasutamise puhul. Üldjuhul koosneb Iptables vähemalt ühest tabelist nimega "Filter", mis sisaldab endas algseades kolme põhilist filtreerimise ahelat: INPUT, OUTPUT ja FORWARD. Igaühel neist ahelatest on eelnevalt määratud ka vaikimisi otsus juhuks kui antud ahelas peaksid kasutaja poolt defineeritud reeglid puuduma. Vaikimisi on Iptables'is defineeritud 5 alljärgnevat ahelatüüpi:
Sellisest käitumisest pääsemiseks peab asetama üldisemad reeglid ahela lõpu poole ning rohkem täpsemad reeglid asetama ahela algusesse. Sel viisil uuritakse täpsemalt kirjeldatud reegleid varem ning alles siis, kui ükski varasematest reeglitest pole vajaliku vastet paketile toonud, rakendatakse üldisemalt piiritletud reegleid.  
*PREROUTING: Paketid läbivad selle ahela enne filtreerimistabelite poole pöördumist. Antud võimalust kasutatakse näiteks NATi rakendamiseks enne filtreerimist või mõne muud muudatuse tegemiseks enne paketi suunamist läbi filtreerimisahela.
Alati on võimalik, et ükski ahela reeglitest ei taga täieliku või sobivat vastet paketile. Sel puhul on võimalik määrata ka ahela üldotsus, mida rakendatakse alles tingimusel kui ükski reegel terves ahelas pole võrreldava tunnusega vastet taganud.</p>
*INPUT: Paketid selles ahelas on saabunud välisvõrgust ning ahela läbimisel saavad ligipääsu kaitstavale (tulemüüritavale) süsteemile või visatakse minema.
<p>Lisaks harilikele otsustele on võimalik kasutada ka ahela suunamist ehk "goto" funktsiooni. Viimase abil on võimalik teatava üldisema mustri avastamisel suunata pakett ühest ahelast teise, et uues ahelas kontrolli jätkata. Sellist hierarhiat võib luua täpselt nii sügavaks kui peaks vajalikuks osutuma. Kui pakett jõuab suunatud ahela lõppu, kuid pole selles ühtegi vastet tuvastanud suunatakse see automaatselt tagasi n.ö "vanem-ahelasse" ehk sinna kust konkreetne ahel välja kutsuti. Vanemahelasse saab tagasi pöörduda ka kasutades käsku "RETURN" märkides selle mõne sobiva reegli otsuseks. Sarnane ülesehitus kehtib ka NATi kasutamise puhul. Üldjuhul koosneb Iptables vähemalt ühest tabelist nimega "Filter", mis sisaldab endas algseades kolme põhilist filtreerimise ahelat: INPUT, OUTPUT ja FORWARD. Igaühel neist ahelatest on eelnevalt määratud ka vaikimisi otsus juhuks kui antud ahelas peaksid kasutaja poolt defineeritud reeglid puuduma. Vaikimisi on Iptables'is defineeritud 5 alljärgnevat ahelatüüpi
*FORWARD: Ükski pakett selles ahelas pole mõeldud kaitstavasse süsteemi. Kõik paketid FORWARD ahelas kuuluvad edastamisele vastavalt ahela filtritele.
 
*PREROUTING: Paketid läbivad selle ahela enne filtreerimistabelite poole pöördumist. Antud ahelat on võimalik kasutatada näiteks NATi rakendamiseks enne filtreerimist või teiste oluliste muudatuse tegemiseks enne paketi suunamist filtreerimisahelasse.
*INPUT: Paketid selles ahelas on saabunud välisvõrgust ning ahela läbimisel saavad kas ligipääsu kaitstavale (tulemüüritavale) süsteemile või visatakse minema.
*FORWARD: Ükski pakett selles ahelas pole mõeldud kaitstavasse süsteemi. Kõik paketid FORWARD ahelas kuuluvad edastamisele vastavalt ahelates defineeritud reeglitele.
*OUTPUT: Ahelat läbivad paketid mis pärinevad kaitstavast süsteemist ja on suunatud välisvõrku.
*OUTPUT: Ahelat läbivad paketid mis pärinevad kaitstavast süsteemist ja on suunatud välisvõrku.
*POSTROUTING: Sarnane PREROUTING ahelale. Kasutatakse erinevateks NAT toiminguteks ning paketis vajalike muudatuste läbi viimiseks enne riistvarale üle andmist.
*POSTROUTING: Sarnane PREROUTING ahelale. Kasutatakse erinevateks NAT toiminguteks ning pakettide töötlemiseks enne riistvarale üle andmist.</p>
 
<p>Lisaks neile kirjeldatud ahelatele võib süsteemi administraator luua just nii palju ahelaid kui parasjagu tarvis. Iga Iptablesi tabel võib koosneda ühest või mitmest ahelast ning iga ahel võib asuda omaette tabelis. Iptables võimaldab kasutada nelja Netfilter'i poolt eeldefineeritud tabelit


Lisaks neile kirjeldatud ahelatele võib süsteemi administraator luua nii palju ahelaid kui parasjagu tarvis. Iga Iptablesi tabel võib koosneda ühest või mitmest ahelast ning iga ahel võib asuda omaette tabelis. Iptables võimaldab kasutada nelja Netfilter'i poolt eeldefineeritud tabelit:
*FILTER: Sisaldab peamisi pakettide filtreerimise reegleid ning ahelaid. Võib olla rohkem kui üks.  
*FILTER: Sisaldab peamisi pakettide filtreerimise reegleid ning ahelaid. Võib olla rohkem kui üks.  
*NAT: Sisaldab PRE- ja POSTROUTING ning OUTPUT ahelaid. Kasutatakse NATi konfigureerimiseks.
*NAT: Sisaldab PRE- ja POSTROUTING ning OUTPUT ahelaid. Kasutatakse NATi realiseerimiseks.
*MANGLE: Kasutatakse spetsiifiliste reeglite kogumiseks. Kutsutakse välja enne või pärast filtreerimistoiminguid.
*MANGLE: Kasutatakse spetsiifiliste (vahel ajutiste) reeglite kogumiseks. Kutsutakse välja enne või pärast filtreerimistoiminguid.
*RAW: Kui vastav moodul on Netfilter'is avatud siis kutsutakse välja enne kõiki teisi tabeleid. Sisaldab PREROUTING ja OUTPUT ahelaid. Võimaldab filtreerida pakette enne kui need edasi mälunõudlikemasse osadesse suunatakse. (Tõenäoline kasutusjuht võiks olla süsteemi välise ründe korral, kus oleks vaja suur hulk pakette minema visata enne kui need süsteemi mälu koormama hakkavad)  
*RAW: Kui vastav moodul on Netfilter'is lubatud siis kutsutakse see välja enne kõiki teisi tabeleid. Sisaldab PREROUTING ja OUTPUT ahelaid. Võimaldab filtreerida pakette enne kui need edasi mälunõudlikemasse osadesse suunatakse. (Tõenäoline kasutusjuht võiks olla süsteemi välise ründe korral, kus esineb vajadus kiirelt suur hulk pakette kõrvale visata enne kui need pääsevad süsteemi mälu koormama)  
Sarnaselt ahelatele võib administraator luua ka enda defineeritud tabeleid.
Iptables filtreerimise mehhanism on üles ehitatud selliselt, et iga pakett peaks läbima ainult 1he talle kehtiva filtreerimise ahela. Samas iga pakett peab läbima vähemalt ühe ahela. Konkreetne ahel määratakse peamiselt eelpool mainitud paketi päritolu alusel. Samuti on tänu Netfilterile võimalik pakette filtreerida ka ühenduse olekute alusel ning töödelda neid enne täpsemasse ahelasse suunamist. Need omadused vähendavad märgatavalt reeglite läbitöötamiseks vajaliku aega ja protsessori töö mahtu.


Installeermis ja konfigureerimisjuhend
Sarnaselt ahelatele võib administraator luua ka enda defineeritud tabeleid. Iptables filtreerimise mehhanism on üles ehitatud selliselt, et iga pakett peaks läbima ainult 1he talle kehtiva filtreerimisahela. Samas, iga pakett peab läbima vähemalt ühe ahela. Konkreetne ahel määratakse peamiselt eelpool mainitud paketi päritolu alusel. Samuti on tänu Netfilterile võimalik pakette filtreerida ka ühenduse olekute alusel ning töödelda neid enne konkreetsemasse ahelasse suunamist. Need omadused vähendavad märgatavalt reeglite läbitöötamiseks vajaliku aega ja protsessori töö mahtu.</p>
*Kuidas paigaldada (millised käsud)
*Kus asuvad olulisemad konfiguratsioonifailid (kuhu soovitan luua)
*Mis on põhikäsud konfigureermisel
*Millised on põhiparameetrid, mida nad tähendavad, mida teevad
*Mõned konfiguratsiooni näited (1 - 2) (viide tulemüüride labori juhendile)
*Kuidas kontrollida versiooni


== Iptables paigaldamine ==
== Iptables paigaldamine ==


Iptables on leitav enamike levinud distributsioonide pakivaramutest ning Netfilter'i koduleheküljelt. Nagu alguses viidatud siis kõik käsud tuleb läbi viia root õigustes.  
<p>Iptables on leitav enamike levinud distributsioonide pakivaramutest ning Netfilter'i koduleheküljelt. Nagu alguses viidatud siis <i>kõik käsud tuleb läbi viia root õigustes.</i></p>
Enne kui asuda installeerimise juurde tuleks kontrollida, kas Iptables juba paigaldatud ei ole. Seda saab teha käsuga
Enne kui installeerimise juurde asuda on soovituslik kontrollida, kas ja milline Iptables versioon on hetkel paigaldatud. Seejärel tuleb see vajadusel kas uuendada või installeerida. Antud tegevusi saab läbi viia käskudega:
 
-Kontrollimiseks
<pre>apt-cache policy iptables</pre>
 
-Uuendamiseks
<pre>apt-get update && apt-get upgrade</pre>
 
-Paigaldamiseks
<pre>apt-get install iptables</pre>
 
Viimane käsk paigaldab Iptablesi vaikimisi kataloogi, milleks on <code>/usr/sbin/iptables</code> või mõningates süsteemides ka <code>/sbin/iptables</code>.
Selleks, et näha esialgset vaikimisi konfiguratsiooni tuleb kasutada käsku
 
<pre>iptables -L</pre>
 
Teine võimalus konfiguratsiooni nägemiseks on koheselt salvestada ka konfiguratsioonifail. Vaikimisi paigladamisel konfiguratsiooni faili ei tekitata, vaid kasutatakse Netfilter'i kerneli mooduli "filter" tabelit 3 tühja ahelaga. Konfiguratsiooni faili salvesatamiseks tuleb kasutada käsku <code>iptables-save</code> ning väljastada tulemus oma vabalt valitud faili. Üldise selguse mõttes on soovitatav kasutada /etc/ kataloogi. Näites on loodud ja kasutatud kataloogi <code>/etc/iptables</code> ning faili nimeks määratud <code>iptables.conf</code>
 
<pre>iptables-save > /etc/iptables/iptables.conf</pre>
 
Loodud faili võib uurida ning muuta vabalt valitud tekstiredaktoriga.
 
== Iptables'i seadistamine ==
 
=== Parameetrid ===
 
Uurides eelmises punktis loodud konfiguratsioonifaili on näha, et vaikimisi on kõik ühendused lubatud. Sellisel kujul pole Iptables'ist otsest kasu.
Selleks, et luua tabelisse esimesed pakette filtreerivad reeglid tuleb eelnevalt tunda mõningaid olulisemaid iptables'i parameetreid ja konfigureerimise käsu ülesehitust.
Iptables’i reeglite määramiseks kasutatakse käsku iptables. Järgnevalt on toodud näide esimese reegli lisamisest loodud konfiguratsioonifaili.
<pre>iptables -I INPUT -i eth0 -j ACCEPT -v</pre>
Antud käsk lisab INPUT ahelasse kirje mis lubab kõik ühendused liidesel eth0. Siit on näha aga peamised iptables konfiguratsioonilause elemendid: ''tegevus tabeliga'', ''ahela nimetus''(milles reegel asub), ''reegli elemendid'', ''otsus'' ning ''lisaparameetrid''.
*Tabeliga tegevused – parameetrid, mis määravad millist tegevust tuleb minigi konkreetse käsu puhul sooritada. Järgnevalt on toodud välja põhilised tegevused.
'''-A''' (append) Lisa uus reegel määratud ahela lõppu.
'''-D''' (delete) Kustuta määratud reegel. Reegli saab määrata nii rea numbriga antud ahelas või reegli kuju (reeglis määratud parameetrite) järgi. Samuti on võimalik kasutada mõlemat määramisviisi korraga.
'''-N''' (new) Loo uus ahel
'''-I''' (insert) Lisa uus reegel määratud ahela algusesse või konkreetsele reale, andes ette vastava rea numbri.
'''-R''' (replace) Muuda olemasolevat reeglit, määrates ära muudetava reegli reanumbri.
'''-L''' (list) Näitab olemasolevate reeglite nimekirja määratud tabelis või ahelas
'''-S''' (list) Näitab olemasolevaid reegleid määratud tabelis, ahelas või kõigis tabeleis, ahelais. (Sarnane -L parameetrile, veidi lakoonilisem, näitab ainult reegleid)
'''-F''' (flush) Kustutab reeglid määratud ahelas või kõigis ahelais
'''-X''' (delete-chain) Kustutab loodud ahelaid
'''-P''' (policy) Määrab ära kogu ahela üldise otsuse, mis täidetakse, kui ükski reegel ahelas ei ole paketile vastet toonud
 
*Ahela nimetus
Võib olla milline tahes kasutaja enda loodud ahelatest, tabelitest või üks 4st süsteemsest tabelist (filter, nat, mangle, raw)
 
*Reegli elemendid ja otsus
Koosneb filtreerimise või suunamise otsusest ning erinevatest reegli parameetritest.  
Reegli põhilisemad parameetrid on:
'''-p''' (protocol) Määrab, millise protokolli alusel pakette filtreeritakse
'''-s''' (source) Määrab paketi päritolu aadressi
'''-d''' (destination) Määrab paketi sihtpunkti aadressi.
'''-i''' (in-interface) Liides, mille kaudu pakett saabus
'''-o''' (out-interface) Liides, mille kaudu pakett on määratud välja minema
'''-j''' (jump) Määrab ära ahela või reegli millele antud kohast edasi "hüpatakse". Samuti on võimalik määrata ühte fikseeritud väärtustest, mis otsustab paketi saatuse koheselt.
Parameetriga -j on võimalik esile kutsuda ka filtreerimise lisamooduleid väga täpsete võrdlustasemete loomiseks.
Kui reegel, millele hüpati ei sobi paketiga antakse kontroll tagasi sellesse ahelasse, kust reegel välja kutsuti.
'''-g''' (goto) Erineb -j parameetrist selle poolest, et pärast kutsumist jätkab reeglite läbimist selles ahelas mis välja kutsuti.
 
*Otsus - võib olla ükskõik milline etteantud väärtustest
 
ACCEPT - Lubab paketi läbi
DROP - Ei luba paketti, "viskab" selle minema
QUEUE - Suunab paketti "töötluse järjekorda" teistele rakendustele edastamiseks.
Uus ahel - Reegli otsuseks võib olla uude ahelasse suunamine, mis muutab vastava ahela vanem-ahelaks suunatavale ahelale.
RETURN - Lõpetab ahela (milles vastav reegel asub) läbi vaatamise ning jätkab kontrolli vanem-ahelas (selles kust käesolev ahel välja kutsuti). Kui vanem-ahel puudub, siis otsustab paketi saatuse ahela "policy".
 
*Lisaparameetrid - Kasutatakse käsu iptables täiendava funktsionaalsuse esile kutsumiseks.
 
-v (verbose) - väljastab detailset infot töödeldava reegli kohta. Kui -v parameeter on lisatud reegli loomise, muutmise, asendamise või kustutamise käsule, väljastatakse ekraanile kogu käsust tulenev info.
-numeric - Iptables proovib vaikimisi lahendada kõik aadressid nimedeks. -numeric näitab aadresse numbrilisel kujul, ega ürita neid siduda hostname'idega.
--line-numbers - näitab reeglite reanumbreid, näiteks kasutades käsku iptables -L --line-numbers
 
=== Konfigureerimine ===
 
Nüüd, olles tutvunud käsu iptables ülesehituse ning olulisemate parameetritega, saame luua esimesed põhilisemad filtreerimise reeglid. Nagu eelnevalt märgitud, siis vaikimisi ei rakenda iptables pakettide liikumisele olulisi piiranguid. Ükski ahel ei sisalda reegleid ning kõigi ahelate policy on vaikimisi seatud läbi laskma kogu liiklust ehk määratud otsusega ACCEPT. Järgnevalt viime ahelatesse sisse mõned muudatused mis muudavad tulemüüri käitumise rohkem kontrollitumaks. Allolevate näidete ulatuses muudame kõigi kolme olemasoleva ahela vaikimisi otuse (policy) vastupidiseks ehk asendisse DROP ning lisame INPUT ja OUTPUT ahelatesse mõned reeglid veebiliikluse ning pingimise (ICMP protokolli) lubamiseks. Antud ahelatesse on hea praktika lisada reegleid paari kaupa - s.t reegeli peaks looma nii sisse tulevate kui väljaminevate pakettide jaoks. See ei ole kindlasti kohustuslik praktika ning sõltub täiesti soovitavast tulemusest, kuid aitab täpsemalt hallata või jälgida (näiteks logida) pakettide liikumist. Selleks, et muuta tulemüür effektiivseks ja turvaliseks tuleb see seadistada küllalt detailselt. Nii on iga reegli lisamisel oluline jägida, et pakettidele seatakse täpselt sellised piirangud mis tagavad süsteemi toimimise, kuid ei võimalda liigset ligipääsu.
Enne kui hakata midagi aga muutma on hea mõte salvestada konfiguratsioonifail. See märkus ei kehti neile kes seda varasema sammu juures juba tegid. Kasulik on salvestada fail(i) iga kord kui on sisse viidud kontrollitud ning töötav muudatus. Nii saab hõlpsasti töötava oleku taastada, kui selleks peaks vajadus tekkima. Seega:
 
<pre > iptables-save > /etc/iptables/iptables.conf </pre>
 
Taastada konfiguratsioonifailist saab käsuga
 
<pre> iptables-restore < /etc/iptables/iptables.conf </pre>
 
Esimese sammuna on küllalt mõistlik lubada liiklus loopback liidesel (üldjuhul <code>lo</code>), kuna see on vajalik mitmete rakenduste tööks. Moodustame vajaliku käsu ning lubame loopback'i liikluse:
 
<pre> iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT </pre>
 
Esimene käskudest lubab kõikide pakettide liikluse sissepoole liidsel <code>lo</code>. Teine lubab sama väljapoole. Tulenevalt <code>lo</code> iseärasustest, reaalselt ükski pakett veel süsteemist ei lahku.
 
Pingimine võimaldab kontrollida seadme ühenduvust välisvõrguga. Selleks on vajalik ICMP protokolli liiklus, mille avame käskudega:
 
<pre> iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT </pre>
 
Antud käsud annavad võimaluse välja saata ICMP protokolli OUTPUT ahelas ning saada vastuse INPUT ahelas. Seega võimaldavad need käsud nüüdsest pingida teisi võrgus asuvaid seadmeid. Oluline on siikohal märkida, et pingida saab hetkel ainult ip aadresside alusel, kuna hetkel pole lubatud veel nimelahenduse jaoks vajalik UDP protokoll.
 
Kuna ka välismaailm tahab seadme olemasolust tõenäoliselt aimu saada on tihti vajalik ka vastupidise pingimise lubamine, ehk väljastpoolt saabuvate päringute lubamine:
 
<pre> iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT </pre>
 
Nende käskude täitmisel on võimalik ka konfigureeritavat seadet väljaspoolt pingida. Sarnaselt eelpool mainitule, saab ka siin pingida vaid ip aadressi.
Eelnenud käskudes olid mõningad parameetrid, millest antud artiklis lähemalt juttu ei tule. Nende kohta saab täpsemalt lugeda lõpus välja toodud viidete alt.
 
Olles esmaste muudatustega ühele poole saanud, tuleb iptables nüüd seadistada lubama http veebiliiklust. Selleks on vajalik lubada TCP protokolli liiklus pordil 80.
 
<pre> iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT </pre>
 
Muutes pordi numbrit on võimalik sama kiiresti lubada ka turvaline https ühendus
 
<pre> iptables -A INPUT -p tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT </pre>
 
Siiski ei tööta turvaline ühendus enne, kui on lubatud DNS. Seega viimase sammuna oleks äärmiselt asjakohane lisada õigused ka UDP protokolli jaoks, mis võimaldab puuduoleva DNS nimelahenduse.
 
<pre> iptables -A INPUT -p udp -j ACCEPT
iptables -A OUTPUT -p udp -j ACCEPT </pre>
 
Viimaste käskudega on iptablesis olemas esmased põhilised reeglid (filtrid), mis võimaldavad võrgupakettide liikluse olulist piiramist, kuid ka sobivate pakettide lubamist.
Juhul kui mingil hetkel peaks tekkima vajadus mõnda olemasolevat reeglit muuta või täiendada saab seda teha kasutades iptables parameetrit -R
 
<pre> iptables -R INPUT 4 -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT </pre>
 
Antud käsk muudab INPUT ahelas real 4 asuvat reeglit ning täiendab seda lisades paketi lubamise vajalikuks vasteks ühenduse oleku tunnused NEW ja ESTABLISHED.
 
Sarnaselt reegli muutmisele võib vajalikuks osutuda ka reegli kustutamine. Lihtsaim viis selle saavutamiseks on kasutades rea numbrit.
 
<pre> iptables -D INPUT 5 </pre>
 
Käsu täitmisel kustutatakse INPUT ahelast real 5 asetsev UDP protokolli lubav käsk. Selle käsu testimisel peab vatava reegli taastama iseseisvalt.
 
Pikemate ahelate puhul saab rea numbri teada käsuga:
 
<pre> iptables -L --line-numbers </pre>
 
 
----
 
Nüüd oleks paras hetk läbi viia ka uus iptables-save korraldus, salvestamaks tehtud muudatused konfiguratsioonifaili. Tuleb mainida, et antud muudatused kehtivad kuni järgmise alglaadimiseni, mille korral tuleb need taastada iptables-restore käsuga eelnevalt loodud konfiguratsioonifailist. Selleks, et fail laetaks mällu iga kord automaatselt tuleb lisada kirje <code>/etc/network/interfaces</code> faili. Kasutades suvalist tekstiredaktorit, tuleb faili lõppu lisada rida:
 
<pre> pre-up iptables-restore < /etc/iptables/iptables.conf </pre>
 
Sisse kantud rida rakendatakse enne kui ükski liides aktiivseks tehakse, mistõttu hakkavad ka filtreerimise reeglid kehtima enne kui paketid liidestel liikumist alustavad. Nii on tagatud kaitse võimalike rünnakute eest, kus muul juhul võidaks filtrite puudumist ära kasutada.
 
Iptables'i konfiguratsiooni tühistamiseks tuleb kõigi ahelate policy'd seada ACCEPT olekusse ning kasutada kolme järgnevat, eelnevalt loetletud, parameetrit
 
<pre> iptables -F </pre>
 
Tühjendab kõik või määratud ahela(d) olemasolevatest reeglitest.
 
<pre> iptables -Z </pre>
 
Nullib ära kõigi või määratud ahela(te) paketi loendurid.
 
<pre> iptables -X </pre>
 
Võimaldab kustutada kasutaja loodud ahelaid, kuid ainult juhul kui need ei sisalda reegleid. Nime määramata jätmisel üritab kustutada kõiki kasutaja loodud ahelaid.
 
Siinkohal on esmane konfigureerimine lõppenud. Välja toodud käsud on kindlasti vaid sissejuhatus täpsemasse ning eesmärgipärasesse reeglite loomesse. Toodud käske saab kindlasti täiendada ning lisada erinevaid parameetreid pakettide täpsemaks analüüsiks, nagu näidatud ka reegli muutmise puhul. Konkreetsemaid näiteid ning parameetrite kirjeldused on jällegi leitavad kasutades alltoodud viiteid.
 
== Kokkuvõte ==
 
Iptables on linuxi tulemüürirakendus, mis võimaldab konfigreerida linuxi kerneli moodulit nimega Netfilter. Tulemüüri konfigureerimine käib tabelite abil, mis koondavad endasse pakettide filtreerimiseks ning suunamiseks vajalikud reeglid. Reeglid on jaotatud ahelatesse. Iga pakett läbib oma teekonnal süsteemi või sellest välja vähemalt ühe ahela. Iptablesi konfigureerimine toimub käsurea abil.


<source lang="bash">apt-cache policy iptables</source>
== Dokumentatsioon ==


Juhul kui oled veendunud, et Iptables pole süsteemi paigaldatud, saab selle paigaldada käsuga
Iptables on küllalt hästi dokumenteeritud oma manuaalis, mis on leitav nii käsurealt ''man iptables'', kui ka mitmel pool internetis. Lisaks manuaalile tuleb installatsiooniga kaasa ka html kujul kasutusjuhis mis on leitav kataloogis <code>/usr/share/doc/iptables/html</code> ning veebis aadressil http://netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html#toc7


<source lang="bash">apt-get install iptables</source>
== Kasutatud materjalid ==


Antud käsk paigaldab Iptablesi vaikimisi kataloogi, milleks on <code>/usr/sbin/iptables</code> või mõningates süsteemides ka <code>/sbin/iptables</code>
http://en.wikipedia.org/wiki/Iptables - Küllalt detailne ülevaade iptablsesi toimimise mehhanismidest.<br>
http://en.wikipedia.org/wiki/Netfilter - Kaasosa Iptables wiki artiklile. Tutvustab lähemalt Netfilteri ajalugu ja tööpõhimõtteid.<br>
http://linux.die.net/man/8/iptables - Iptables'i manuaal veebis. Sama sisu mis man iptables.<br>
http://www.thegeekstuff.com/2011/06/iptables-rules-examples/ - Olulisemad konfiguratsiooni näited ja parameetrid. Antud artikli näited põhinevad sellel allikal.<br>
http://ubuntuforums.org/showthread.php?t=159661 - Ubuntu foorumid. Ülevaade iptables parameetritest koos näidisreeglitega. Olemas juhised skriptide loomiseks.<br>
http://wiki.itcollege.ee/index.php/Tulem%C3%BC%C3%BCri_labor - EIK IT Infrastruktuuri teenused aine raames vajaliku konfiguratsiooni teostamise juhend.<br>
http://www.thegeekstuff.com/2011/01/iptables-fundamentals/ - Lühitutvustus iptables'ist ja ülesehitusest.<br>
http://office_sep_344747_sep_themes.freecode.com/projects/iptables/releases?page=1 - Iptablesi versioonide ajalugu.<br>


Näited
[[Category:IT infrastruktuuri teenused]]
Nagu eelnevalt mainitud, kasutab Iptables filtreerimise toimingute saavutamiseks pakettide ja reeglite võrdlemist. Iptables võimaldab pakette filtreerida protokollide, aadresside, liideste ja mitmete teiste tunnuste alusel.
Erinevat match võimalused
tabeli loomise näide?
hüppamine (goto) ja vanemahelasse pöördumine

Latest revision as of 14:56, 8 January 2014

Koostanud: Mikk Käosaar A41, Detsember 2011
Viimati muudetud: 20.12.2011

Sissejuhatus

Käesolev artikli eesmärgiks on tutvustada tulemüüri rakendust iptables, selle ülesehitust ning peamisi toimimise mehhanisme. Lisaks on välja toodud olulisemad aspektid rakenduse kasutamise eesmärkidest, paigaldamisest, konfigureerimisest ja haldamisest. Artikkel on mõeldud abimaterjalina ja tutvustusena linuxi alaste baasteadmistega kasutajatele.


Eeldused

Artikli koostamisel on näidete testimiseks kasutatud Ubuntu Serverit: Release 11.04, Kernel Linux 2.6.38-12-generic. Näited eeldavad standardset linuxi installatsiooni. Modifitseeritud süsteemidest ja teistest linuxi distributsioonidest tulenevad erisused tuleb lahendada juhendi kasutajal iseseisvalt. Näited võivad kuid ei pruugi toimida linuxi kernelitel alates versioonist 2.4, mis toetavad Netfilter'i mooduleid, ning distributsioonidega mis toetavad rakendust iptables. Käskude sisestamisel on vajalikud juurkasutaja (root) õigused. Juhendi kasutaja peab omama vajalike eelteadmisi ethernet võrkudest ning baasteadmisi linuxi käsurea kasutamisest.


Mis on Iptables?

Iptables on linuxi tarkvararakendus, mis võimaldab kasutajatel ja süsteemiadministraatoritel seadistada ning hallata tulemüüri mingis konkreetses linuxi süsteemis. Iptables'i peamiseks eesmärgiks on tagada andmeside ning arvutisüsteemide turvalisus erinevatel linuxi kernelit kasutavatel seadmetel. Iptables'i peamised kasutusalad on võrguliikluse filtreerimine vastavalt kasutaja või süsteemiadministraatori poolt määratud reeglitele ning tihti Network Address Translation (NAT) teostamine. Iptables võimaldab kasutajatel luua tabeleid mis sisaldavad n.ö kontrollahelaid ehk reeglite jadasid mille alusel reguleeritakse võrgupakettide liikumist võrguliidestel ja pakettide üldist ligipääsu süsteemile. Erinevate protokollide jaoks on kasutusel erinevad kerneli moodulid ning Iptables versioonid. Käesolev juhend keskendub programmile Iptables mis keskendub põhiliselt IPv4 protokollile. Iptables kasutab oma töös kerneli moodulit nimega ip_tables. Lisaks eelnimetatule olemas moodulid ka IPv6 ja ARP protkollidele ning ethernet raamidele. Üldjoontes on Iptables'i näol tegemist pigem konfiguratsiooni tööriistaga või kerneli tulemüürimooduli Netfilter'i kasutajaliidesega, kui eraldiseisva tulemüürirakendusega.


Iptables algus

Iptables'i arendus sai alguse paralleelselt Netfilter raamistikuga 1998 aastal. Kasutajateni jõudisis Iptables'i esimene versioon koos linuxi kerneli versiooniga 2.4 aastal 2001. Iptablesi eelkäijateks loetakse rakendusi ipchains ja ipfwadm, millest viimane põhineb omakorda BSD ipfw rakendusel. Vaatamata kestvale arendusprotsessile, pole aja jooksul toimunud suuremaid versiooni muudatusi ning artikli kirjutamise hetkeks on viimane ametlikult väljastatud versioon 1.4.12.1. Aastal 2009 alustati tööd ka Iptables'i järglaseks tituleeritud "nftables" projektiga. Sellest pidi kujunema asendustööriist Iptablesile ning oli mõeldud ühendama praegu eraldiseisvaid protokollide haldusvahendeid. Käesoleval hetkel on antud projektist väljastatud vaid alfaversioon ning aktiivne arendusprotsess on peatunud.

Ülesehitus ja tööpõhimõte

Märkus: Selguse huvides on järgnevat käsitletud ühe linux-süsteemi piires.

Netfilter

Nagu enamik võrguliikluse filtreerimisega seotud rakendusi, põhineb Iptablesi töö andmeside pakettide analüüsil. Iga süsteemi läbiv pakett viiakse läbi kontrollahela(te), mille alusel määratakse paketi edasine saatus vaadeldavas süsteemis. Iptables'i funktsionaalsus põhineb linuxi kernelis paikneval Netfilter'i raamistikul, mis võimaldab võrguliikluse jälgimist ja manipuleerimist. Seetõttu on oluline lisaks Iptablesile tutvustada pisut ka Netfilter'i tööpõhimõtteid.

Netfilter jaotab oma funktsionaalsuse mitmesse ossa. Kasutajataseme programmid, nagu Iptables, saavutavad oma vajaliku funktsionaalsuse pöördudes Netfilter'i erinevate moodulite (osade) poole. Iga moodul tagab erineva funktsionaalsuse ning on teiste moodulite suhtes kindlalt järjestatud, s.t iga mooduli poole pöördumine toimub kindlas järjekorras. Netfilteri mooduleid võib käsitleda ka kui tabeleid mis koosnevad reeglite jadadest. Nagu eelpool mainitud nimetatakse selliseid reeglite jadasid ka ahelateks. Seega iga tabel (moodul) võib koosneda paljudest käskudest mis moodustavad ahela. Selliste ahelate ülesanneteks ongi harilikult võrguliikluse filtreerimine ning pakettide haldamine, seal hulgas ka näiteks NAT'i võimaldamine.

Ahelaid liigitatakse ning nimetatakse üldjuhul filtreeritavate pakettide päritolu järgi. Näiteks välisvõrgust saabuv pakett satuks "INPUT" ahelasse ning välisvõrku suunatud pakett peab läbima "OUTPUT" ahela. Üheks olulisemaks uuenduseks võrreldes oma eelkäijatega ipcahins ja ipfwadm on Netfilter'il võimekus jälgida ja hallata ühenduste olekut (connection tracking). See võimaldab Netfilteril jaotada pakette erinevate, ühenduse, olekute alusel. Viimase abil omakorda on aga võimalik iga pakett suunata koheselt õigesse filtreerimis või NAT ahelasse. Erinevad olekud võivad olla järgnevad

  • NEW: tehakse algust uue ühenduse loomisega
  • ESTABLISHED: analüüsitav pakett kuulub mõne juba eksisteeriva ühenduse juurde
  • RELATED: viitab oodatud, ennustatud käitumisele - näiteks analüüsitav pakett on osa uue ühenduse alustamisest ja seetõttu selle saabumine "ette aimatav". Teine võimalus on näiteks juba olemas oleva ühendusega seotud ühenduse loomine. Teisiti öeldes - mingi, juba ühendust omav programm algatab paralleelselt eksisteeriva ühendusega uue ühenduse, mis on seostatud vanaga. Näiteks FTP parooli sisestamisel algatatakse FTP kliendi poolt mitu erinevat ühendust, mis on omavahel seotud, kuna kuuluvad kõik samale FTP rakendusele.
  • INVALID: viitab paketile, mille päritolu ei suudeta tuvastada ehk mis ei kuulu ühegi olemasoleva ühendusse alla ega alusta uut ühendust.
  • UNTRACKED: eriolek, administraatorile kes soovib mingi paketi ignoreermist ühenduse kontrollimisel

Iptables

Tulenevalt Netfilteri ülesehitusest põhineb ka Iptablesi töö erinevate käsuahelate ja tabelite haldamisel. Iptablesi puhul koosnevad tabelid reeglitest ning otsustest. Iga tabel kirjeldab milliseid tunnuseid pakettides otsida ning kui võrre on tuvastatud, siis millist tegevust antud paketi puhul rakendada. Paketi võrdlemise käigus käiakse tabel ja selles sisalduv ahel läbi käskhaaval. Oluline on teada, et käske läbitakse järjekorras seni kuni leitakse esimene vaste. See tähendab, et pärast esmase vaste leidmist ahelat enam edasi ei uurita. Seega kui ahelas on mitu sarnase võrdlustunnusega kuid erineva otsusega reeglit, sooritatakse filtreerimine vastavalt selle reegli alusel, mis oli ahelas eespool. Näiteks kujutame ette olukorda kui süsteemiadministraator soovib lubada kõiki TCP pakette mis saabuvad INPUT ahelasse pordilt 80 ning samas ahelas keelata pordile 80 saabuvad TCP paketid, mis on suunatud porti 8000. Antud juhul lubatakse siiski kõigi TCP pakettide liiklus kuna üldisem reegel, mis kattus paketi andmetega, eelnes spetsiifilisemale reeglile. Sellisest käitumisest pääsemiseks peab asetama üldisemad reeglid ahela lõpu poole ning rohkem täpsemad reeglid asetama ahela algusesse. Sel viisil uuritakse täpsemalt kirjeldatud reegleid varem ning alles siis, kui ükski varasematest reeglitest pole vajaliku vastet paketile toonud, rakendatakse üldisemalt piiritletud reegleid. Alati on võimalik, et ükski ahela reeglitest ei taga täieliku või sobivat vastet paketile. Sel puhul on võimalik määrata ka ahela üldotsus, mida rakendatakse alles tingimusel kui ükski reegel terves ahelas pole võrreldava tunnusega vastet taganud.

Lisaks harilikele otsustele on võimalik kasutada ka ahela suunamist ehk "goto" funktsiooni. Viimase abil on võimalik teatava üldisema mustri avastamisel suunata pakett ühest ahelast teise, et uues ahelas kontrolli jätkata. Sellist hierarhiat võib luua täpselt nii sügavaks kui peaks vajalikuks osutuma. Kui pakett jõuab suunatud ahela lõppu, kuid pole selles ühtegi vastet tuvastanud suunatakse see automaatselt tagasi n.ö "vanem-ahelasse" ehk sinna kust konkreetne ahel välja kutsuti. Vanemahelasse saab tagasi pöörduda ka kasutades käsku "RETURN" märkides selle mõne sobiva reegli otsuseks. Sarnane ülesehitus kehtib ka NATi kasutamise puhul. Üldjuhul koosneb Iptables vähemalt ühest tabelist nimega "Filter", mis sisaldab endas algseades kolme põhilist filtreerimise ahelat: INPUT, OUTPUT ja FORWARD. Igaühel neist ahelatest on eelnevalt määratud ka vaikimisi otsus juhuks kui antud ahelas peaksid kasutaja poolt defineeritud reeglid puuduma. Vaikimisi on Iptables'is defineeritud 5 alljärgnevat ahelatüüpi

  • PREROUTING: Paketid läbivad selle ahela enne filtreerimistabelite poole pöördumist. Antud ahelat on võimalik kasutatada näiteks NATi rakendamiseks enne filtreerimist või teiste oluliste muudatuse tegemiseks enne paketi suunamist filtreerimisahelasse.
  • INPUT: Paketid selles ahelas on saabunud välisvõrgust ning ahela läbimisel saavad kas ligipääsu kaitstavale (tulemüüritavale) süsteemile või visatakse minema.
  • FORWARD: Ükski pakett selles ahelas pole mõeldud kaitstavasse süsteemi. Kõik paketid FORWARD ahelas kuuluvad edastamisele vastavalt ahelates defineeritud reeglitele.
  • OUTPUT: Ahelat läbivad paketid mis pärinevad kaitstavast süsteemist ja on suunatud välisvõrku.
  • POSTROUTING: Sarnane PREROUTING ahelale. Kasutatakse erinevateks NAT toiminguteks ning pakettide töötlemiseks enne riistvarale üle andmist.

Lisaks neile kirjeldatud ahelatele võib süsteemi administraator luua just nii palju ahelaid kui parasjagu tarvis. Iga Iptablesi tabel võib koosneda ühest või mitmest ahelast ning iga ahel võib asuda omaette tabelis. Iptables võimaldab kasutada nelja Netfilter'i poolt eeldefineeritud tabelit

  • FILTER: Sisaldab peamisi pakettide filtreerimise reegleid ning ahelaid. Võib olla rohkem kui üks.
  • NAT: Sisaldab PRE- ja POSTROUTING ning OUTPUT ahelaid. Kasutatakse NATi realiseerimiseks.
  • MANGLE: Kasutatakse spetsiifiliste (vahel ajutiste) reeglite kogumiseks. Kutsutakse välja enne või pärast filtreerimistoiminguid.
  • RAW: Kui vastav moodul on Netfilter'is lubatud siis kutsutakse see välja enne kõiki teisi tabeleid. Sisaldab PREROUTING ja OUTPUT ahelaid. Võimaldab filtreerida pakette enne kui need edasi mälunõudlikemasse osadesse suunatakse. (Tõenäoline kasutusjuht võiks olla süsteemi välise ründe korral, kus esineb vajadus kiirelt suur hulk pakette kõrvale visata enne kui need pääsevad süsteemi mälu koormama)

Sarnaselt ahelatele võib administraator luua ka enda defineeritud tabeleid. Iptables filtreerimise mehhanism on üles ehitatud selliselt, et iga pakett peaks läbima ainult 1he talle kehtiva filtreerimisahela. Samas, iga pakett peab läbima vähemalt ühe ahela. Konkreetne ahel määratakse peamiselt eelpool mainitud paketi päritolu alusel. Samuti on tänu Netfilterile võimalik pakette filtreerida ka ühenduse olekute alusel ning töödelda neid enne konkreetsemasse ahelasse suunamist. Need omadused vähendavad märgatavalt reeglite läbitöötamiseks vajaliku aega ja protsessori töö mahtu.

Iptables paigaldamine

Iptables on leitav enamike levinud distributsioonide pakivaramutest ning Netfilter'i koduleheküljelt. Nagu alguses viidatud siis kõik käsud tuleb läbi viia root õigustes.

Enne kui installeerimise juurde asuda on soovituslik kontrollida, kas ja milline Iptables versioon on hetkel paigaldatud. Seejärel tuleb see vajadusel kas uuendada või installeerida. Antud tegevusi saab läbi viia käskudega:

-Kontrollimiseks

apt-cache policy iptables

-Uuendamiseks

apt-get update && apt-get upgrade

-Paigaldamiseks

apt-get install iptables

Viimane käsk paigaldab Iptablesi vaikimisi kataloogi, milleks on /usr/sbin/iptables või mõningates süsteemides ka /sbin/iptables. Selleks, et näha esialgset vaikimisi konfiguratsiooni tuleb kasutada käsku

iptables -L

Teine võimalus konfiguratsiooni nägemiseks on koheselt salvestada ka konfiguratsioonifail. Vaikimisi paigladamisel konfiguratsiooni faili ei tekitata, vaid kasutatakse Netfilter'i kerneli mooduli "filter" tabelit 3 tühja ahelaga. Konfiguratsiooni faili salvesatamiseks tuleb kasutada käsku iptables-save ning väljastada tulemus oma vabalt valitud faili. Üldise selguse mõttes on soovitatav kasutada /etc/ kataloogi. Näites on loodud ja kasutatud kataloogi /etc/iptables ning faili nimeks määratud iptables.conf

iptables-save > /etc/iptables/iptables.conf

Loodud faili võib uurida ning muuta vabalt valitud tekstiredaktoriga.

Iptables'i seadistamine

Parameetrid

Uurides eelmises punktis loodud konfiguratsioonifaili on näha, et vaikimisi on kõik ühendused lubatud. Sellisel kujul pole Iptables'ist otsest kasu. Selleks, et luua tabelisse esimesed pakette filtreerivad reeglid tuleb eelnevalt tunda mõningaid olulisemaid iptables'i parameetreid ja konfigureerimise käsu ülesehitust. Iptables’i reeglite määramiseks kasutatakse käsku iptables. Järgnevalt on toodud näide esimese reegli lisamisest loodud konfiguratsioonifaili.

iptables -I INPUT -i eth0 -j ACCEPT -v

Antud käsk lisab INPUT ahelasse kirje mis lubab kõik ühendused liidesel eth0. Siit on näha aga peamised iptables konfiguratsioonilause elemendid: tegevus tabeliga, ahela nimetus(milles reegel asub), reegli elemendid, otsus ning lisaparameetrid.

  • Tabeliga tegevused – parameetrid, mis määravad millist tegevust tuleb minigi konkreetse käsu puhul sooritada. Järgnevalt on toodud välja põhilised tegevused.
-A (append) Lisa uus reegel määratud ahela lõppu.
-D (delete) Kustuta määratud reegel. Reegli saab määrata nii rea numbriga antud ahelas või reegli kuju (reeglis määratud parameetrite) järgi. Samuti on võimalik kasutada mõlemat määramisviisi korraga.
-N (new) Loo uus ahel
-I (insert) Lisa uus reegel määratud ahela algusesse või konkreetsele reale, andes ette vastava rea numbri.
-R (replace) Muuda olemasolevat reeglit, määrates ära muudetava reegli reanumbri.
-L (list) Näitab olemasolevate reeglite nimekirja määratud tabelis või ahelas 
-S (list) Näitab olemasolevaid reegleid määratud tabelis, ahelas või kõigis tabeleis, ahelais. (Sarnane -L parameetrile, veidi lakoonilisem, näitab ainult reegleid)
-F (flush) Kustutab reeglid määratud ahelas või kõigis ahelais
-X (delete-chain) Kustutab loodud ahelaid
-P (policy) Määrab ära kogu ahela üldise otsuse, mis täidetakse, kui ükski reegel ahelas ei ole paketile vastet toonud
  • Ahela nimetus
Võib olla milline tahes kasutaja enda loodud ahelatest, tabelitest või üks 4st süsteemsest tabelist (filter, nat, mangle, raw)
  • Reegli elemendid ja otsus
Koosneb filtreerimise või suunamise otsusest ning erinevatest reegli parameetritest. 

Reegli põhilisemad parameetrid on:
-p (protocol) Määrab, millise protokolli alusel pakette filtreeritakse
-s (source) Määrab paketi päritolu aadressi
-d (destination) Määrab paketi sihtpunkti aadressi.
-i (in-interface) Liides, mille kaudu pakett saabus
-o (out-interface) Liides, mille kaudu pakett on määratud välja minema
-j (jump) Määrab ära ahela või reegli millele antud kohast edasi "hüpatakse". Samuti on võimalik määrata ühte fikseeritud väärtustest, mis otsustab paketi saatuse koheselt. 
Parameetriga -j on võimalik esile kutsuda ka filtreerimise lisamooduleid väga täpsete võrdlustasemete loomiseks. 
Kui reegel, millele hüpati ei sobi paketiga antakse kontroll tagasi sellesse ahelasse, kust reegel välja kutsuti.
-g (goto) Erineb -j parameetrist selle poolest, et pärast kutsumist jätkab reeglite läbimist selles ahelas mis välja kutsuti.
  • Otsus - võib olla ükskõik milline etteantud väärtustest
ACCEPT - Lubab paketi läbi
DROP - Ei luba paketti, "viskab" selle minema
QUEUE - Suunab paketti "töötluse järjekorda" teistele rakendustele edastamiseks.
Uus ahel - Reegli otsuseks võib olla uude ahelasse suunamine, mis muutab vastava ahela vanem-ahelaks suunatavale ahelale. 
RETURN - Lõpetab ahela (milles vastav reegel asub) läbi vaatamise ning jätkab kontrolli vanem-ahelas (selles kust käesolev ahel välja kutsuti). Kui vanem-ahel puudub, siis otsustab paketi saatuse ahela "policy".
  • Lisaparameetrid - Kasutatakse käsu iptables täiendava funktsionaalsuse esile kutsumiseks.
-v (verbose) - väljastab detailset infot töödeldava reegli kohta. Kui -v parameeter on lisatud reegli loomise, muutmise, asendamise või kustutamise käsule, väljastatakse ekraanile kogu käsust tulenev info. 
-numeric - Iptables proovib vaikimisi lahendada kõik aadressid nimedeks. -numeric näitab aadresse numbrilisel kujul, ega ürita neid siduda hostname'idega.
--line-numbers - näitab reeglite reanumbreid, näiteks kasutades käsku iptables -L --line-numbers

Konfigureerimine

Nüüd, olles tutvunud käsu iptables ülesehituse ning olulisemate parameetritega, saame luua esimesed põhilisemad filtreerimise reeglid. Nagu eelnevalt märgitud, siis vaikimisi ei rakenda iptables pakettide liikumisele olulisi piiranguid. Ükski ahel ei sisalda reegleid ning kõigi ahelate policy on vaikimisi seatud läbi laskma kogu liiklust ehk määratud otsusega ACCEPT. Järgnevalt viime ahelatesse sisse mõned muudatused mis muudavad tulemüüri käitumise rohkem kontrollitumaks. Allolevate näidete ulatuses muudame kõigi kolme olemasoleva ahela vaikimisi otuse (policy) vastupidiseks ehk asendisse DROP ning lisame INPUT ja OUTPUT ahelatesse mõned reeglid veebiliikluse ning pingimise (ICMP protokolli) lubamiseks. Antud ahelatesse on hea praktika lisada reegleid paari kaupa - s.t reegeli peaks looma nii sisse tulevate kui väljaminevate pakettide jaoks. See ei ole kindlasti kohustuslik praktika ning sõltub täiesti soovitavast tulemusest, kuid aitab täpsemalt hallata või jälgida (näiteks logida) pakettide liikumist. Selleks, et muuta tulemüür effektiivseks ja turvaliseks tuleb see seadistada küllalt detailselt. Nii on iga reegli lisamisel oluline jägida, et pakettidele seatakse täpselt sellised piirangud mis tagavad süsteemi toimimise, kuid ei võimalda liigset ligipääsu. Enne kui hakata midagi aga muutma on hea mõte salvestada konfiguratsioonifail. See märkus ei kehti neile kes seda varasema sammu juures juba tegid. Kasulik on salvestada fail(i) iga kord kui on sisse viidud kontrollitud ning töötav muudatus. Nii saab hõlpsasti töötava oleku taastada, kui selleks peaks vajadus tekkima. Seega:

 iptables-save > /etc/iptables/iptables.conf 

Taastada konfiguratsioonifailist saab käsuga

 iptables-restore < /etc/iptables/iptables.conf 

Esimese sammuna on küllalt mõistlik lubada liiklus loopback liidesel (üldjuhul lo), kuna see on vajalik mitmete rakenduste tööks. Moodustame vajaliku käsu ning lubame loopback'i liikluse:

 iptables -A INPUT -i lo -j ACCEPT
 iptables -A OUTPUT -o lo -j ACCEPT 

Esimene käskudest lubab kõikide pakettide liikluse sissepoole liidsel lo. Teine lubab sama väljapoole. Tulenevalt lo iseärasustest, reaalselt ükski pakett veel süsteemist ei lahku.

Pingimine võimaldab kontrollida seadme ühenduvust välisvõrguga. Selleks on vajalik ICMP protokolli liiklus, mille avame käskudega:

 iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
 iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT 

Antud käsud annavad võimaluse välja saata ICMP protokolli OUTPUT ahelas ning saada vastuse INPUT ahelas. Seega võimaldavad need käsud nüüdsest pingida teisi võrgus asuvaid seadmeid. Oluline on siikohal märkida, et pingida saab hetkel ainult ip aadresside alusel, kuna hetkel pole lubatud veel nimelahenduse jaoks vajalik UDP protokoll.

Kuna ka välismaailm tahab seadme olemasolust tõenäoliselt aimu saada on tihti vajalik ka vastupidise pingimise lubamine, ehk väljastpoolt saabuvate päringute lubamine:

 iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
 iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT 

Nende käskude täitmisel on võimalik ka konfigureeritavat seadet väljaspoolt pingida. Sarnaselt eelpool mainitule, saab ka siin pingida vaid ip aadressi. Eelnenud käskudes olid mõningad parameetrid, millest antud artiklis lähemalt juttu ei tule. Nende kohta saab täpsemalt lugeda lõpus välja toodud viidete alt.

Olles esmaste muudatustega ühele poole saanud, tuleb iptables nüüd seadistada lubama http veebiliiklust. Selleks on vajalik lubada TCP protokolli liiklus pordil 80.

 iptables -A INPUT -p tcp --sport 80 -j ACCEPT
 iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT 

Muutes pordi numbrit on võimalik sama kiiresti lubada ka turvaline https ühendus

 iptables -A INPUT -p tcp --sport 443 -j ACCEPT
 iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT 

Siiski ei tööta turvaline ühendus enne, kui on lubatud DNS. Seega viimase sammuna oleks äärmiselt asjakohane lisada õigused ka UDP protokolli jaoks, mis võimaldab puuduoleva DNS nimelahenduse.

 iptables -A INPUT -p udp -j ACCEPT
 iptables -A OUTPUT -p udp -j ACCEPT 

Viimaste käskudega on iptablesis olemas esmased põhilised reeglid (filtrid), mis võimaldavad võrgupakettide liikluse olulist piiramist, kuid ka sobivate pakettide lubamist. Juhul kui mingil hetkel peaks tekkima vajadus mõnda olemasolevat reeglit muuta või täiendada saab seda teha kasutades iptables parameetrit -R

 iptables -R INPUT 4 -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT 

Antud käsk muudab INPUT ahelas real 4 asuvat reeglit ning täiendab seda lisades paketi lubamise vajalikuks vasteks ühenduse oleku tunnused NEW ja ESTABLISHED.

Sarnaselt reegli muutmisele võib vajalikuks osutuda ka reegli kustutamine. Lihtsaim viis selle saavutamiseks on kasutades rea numbrit.

 iptables -D INPUT 5 

Käsu täitmisel kustutatakse INPUT ahelast real 5 asetsev UDP protokolli lubav käsk. Selle käsu testimisel peab vatava reegli taastama iseseisvalt.

Pikemate ahelate puhul saab rea numbri teada käsuga:

 iptables -L --line-numbers 



Nüüd oleks paras hetk läbi viia ka uus iptables-save korraldus, salvestamaks tehtud muudatused konfiguratsioonifaili. Tuleb mainida, et antud muudatused kehtivad kuni järgmise alglaadimiseni, mille korral tuleb need taastada iptables-restore käsuga eelnevalt loodud konfiguratsioonifailist. Selleks, et fail laetaks mällu iga kord automaatselt tuleb lisada kirje /etc/network/interfaces faili. Kasutades suvalist tekstiredaktorit, tuleb faili lõppu lisada rida:

 pre-up iptables-restore < /etc/iptables/iptables.conf 

Sisse kantud rida rakendatakse enne kui ükski liides aktiivseks tehakse, mistõttu hakkavad ka filtreerimise reeglid kehtima enne kui paketid liidestel liikumist alustavad. Nii on tagatud kaitse võimalike rünnakute eest, kus muul juhul võidaks filtrite puudumist ära kasutada.

Iptables'i konfiguratsiooni tühistamiseks tuleb kõigi ahelate policy'd seada ACCEPT olekusse ning kasutada kolme järgnevat, eelnevalt loetletud, parameetrit

 iptables -F 

Tühjendab kõik või määratud ahela(d) olemasolevatest reeglitest.

 iptables -Z 

Nullib ära kõigi või määratud ahela(te) paketi loendurid.

 iptables -X 

Võimaldab kustutada kasutaja loodud ahelaid, kuid ainult juhul kui need ei sisalda reegleid. Nime määramata jätmisel üritab kustutada kõiki kasutaja loodud ahelaid.

Siinkohal on esmane konfigureerimine lõppenud. Välja toodud käsud on kindlasti vaid sissejuhatus täpsemasse ning eesmärgipärasesse reeglite loomesse. Toodud käske saab kindlasti täiendada ning lisada erinevaid parameetreid pakettide täpsemaks analüüsiks, nagu näidatud ka reegli muutmise puhul. Konkreetsemaid näiteid ning parameetrite kirjeldused on jällegi leitavad kasutades alltoodud viiteid.

Kokkuvõte

Iptables on linuxi tulemüürirakendus, mis võimaldab konfigreerida linuxi kerneli moodulit nimega Netfilter. Tulemüüri konfigureerimine käib tabelite abil, mis koondavad endasse pakettide filtreerimiseks ning suunamiseks vajalikud reeglid. Reeglid on jaotatud ahelatesse. Iga pakett läbib oma teekonnal süsteemi või sellest välja vähemalt ühe ahela. Iptablesi konfigureerimine toimub käsurea abil.

Dokumentatsioon

Iptables on küllalt hästi dokumenteeritud oma manuaalis, mis on leitav nii käsurealt man iptables, kui ka mitmel pool internetis. Lisaks manuaalile tuleb installatsiooniga kaasa ka html kujul kasutusjuhis mis on leitav kataloogis /usr/share/doc/iptables/html ning veebis aadressil http://netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html#toc7

Kasutatud materjalid

http://en.wikipedia.org/wiki/Iptables - Küllalt detailne ülevaade iptablsesi toimimise mehhanismidest.
http://en.wikipedia.org/wiki/Netfilter - Kaasosa Iptables wiki artiklile. Tutvustab lähemalt Netfilteri ajalugu ja tööpõhimõtteid.
http://linux.die.net/man/8/iptables - Iptables'i manuaal veebis. Sama sisu mis man iptables.
http://www.thegeekstuff.com/2011/06/iptables-rules-examples/ - Olulisemad konfiguratsiooni näited ja parameetrid. Antud artikli näited põhinevad sellel allikal.
http://ubuntuforums.org/showthread.php?t=159661 - Ubuntu foorumid. Ülevaade iptables parameetritest koos näidisreeglitega. Olemas juhised skriptide loomiseks.
http://wiki.itcollege.ee/index.php/Tulem%C3%BC%C3%BCri_labor - EIK IT Infrastruktuuri teenused aine raames vajaliku konfiguratsiooni teostamise juhend.
http://www.thegeekstuff.com/2011/01/iptables-fundamentals/ - Lühitutvustus iptables'ist ja ülesehitusest.
http://office_sep_344747_sep_themes.freecode.com/projects/iptables/releases?page=1 - Iptablesi versioonide ajalugu.