Iptables
Koostanud: Mikk Käosaar A41, Detsember 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üsteemi administraatoritel 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 sissaldavad 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
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
- NEW: viitab uue ühenduse loomisele
- ESTABLISHED: analüüsitav pakett kuulub mõne juba eksisteeriva ühenduse alla
- 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.
- 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 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. 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. 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 võimalust kasutatakse näiteks NATi rakendamiseks enne filtreerimist või mõne muud muudatuse tegemiseks enne paketi suunamist läbi filtreerimisahela.
- 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.
- FORWARD: Ükski pakett selles ahelas pole mõeldud kaitstavasse süsteemi. Kõik paketid FORWARD ahelas kuuluvad edastamisele vastavalt ahela filtritele.
- 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.
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.
- NAT: Sisaldab PRE- ja POSTROUTING ning OUTPUT ahelaid. Kasutatakse NATi konfigureerimiseks.
- MANGLE: Kasutatakse spetsiifiliste 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)
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.
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. Eelistatum on esimene. 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 konfiguratsiooni faili ei tekitata, vaid kasutatakse Netfilteri "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 vaadata ning muuta vabalt valitud tekstiredaktoriga.
Iptables konfigureerimine
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 „imekspandavalt“ käsku iptables. Peamised iptables konfiguratsioonilause elemendid on: tegevus tabeliga, ahela nimetus“(milles reegel asub)', reegli elemendid’’, ’’otsus’’ ning lisaparameetrid.
- Tabeliga tegevused – parameetrid, mis määravad milliste 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) alusel. 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) Kustuta reeglid määratud ahelas või kõigis ahelais -X (delete-chain) Kustuta 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
- 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 (tuleb arvestada oma NAT seadistustega, s.t võib toimuda PREROUTING NAT) -sport (source-port) Määrab paketi päritolu pordi numbri -d (destination) Määrab paketi sihtpunkti aadressi. -dport (destination-port) Määrab paketi sihtpunkti pordi numbri. -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 etteantud väärtustest, mis otsustab paketi saatuse koheselt. Lisaks on-j parameetriga võimalik ka esile kutsuda filtreerimise lisamooduleid väga täpsete võrdlusastmete loomiseks. Kui reegel, millele hüpati ei sobi paketiga antakse järg 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.
- Lisaparameetrid
Võimaldavad muuta reeglite visuaalse esituse ning visuaalse väljastuse omadusi