Netfilter/iptables

Vēsture

Netfilter/iptables projektu 1998. gadā uzsāka Rastijs Rasels, kurš bija arī iepriekšējā projekta - ipchains autors. Projektam augot, viņš izveidoja Netfilter pamatkomandu (vai vienkārši pamatkomandu(coreteam)) 1999. gadā. Softs, ko viņi veido (kopš tā laika to sauc netfilter) ir licencēts ar GNU General Public License (GPL), un tika sapludināts ar Linux 2.3 2000.gada martā. 2003.gada augustā Harald Welte kļuva par pamatkomandas vadītāju, un 2004.gada aprīlī, veicot šī projekta ietvaros izmeklēšanas darbības pret tiem, kas izplatīja viņu softu iegultās sistēmās - rūteros, neievērojot GPL licences noteikumus, Welte Vācijas tiesā panāca svarīgu piekāpšanos no Sitecom Germany, kas līdz tam atteicās sekot GNU licences noteikumiem (sk. Tiesu strīdi saistībā ar GPL).
Pirms iptables, dominējošā programmatūra Linux ugunsmūru veidošanai bija ipchains versijai Linux 2.2 un ipfwadm versijai Linux 2.0, kas savukārt bija balstīts uz BSD ipfw. Gan ipchains, gan ipfwadm maina tīklošanās kodu tā, lai varētu manipulēt ar pakotnēm, jo pirms Netfilter nebija universāla pakešu vadības ietvara. iptables saglabā pamatidejas, ko Linux-ā ieviesa ipfwadm: likumu saraksts, no kuriem katrs rāda, kādas atbilstības meklēt paketē un ko darīt ar katru šādu paketi. ipchains pievienoja likumu ķēžu jēdzienu, un iptables to tālāk paplašināja par tabulām: vienu tabulu pārbaudīja, lai izlemtu, vai NAT-ot paketi, otru izmantoja, lai izlemtu, kā filtrēt paketi. Turklāt trīs punkti paketes ceļā, kur agrāk veica filtrēšanu tika izmainīti, tādēļ iptables gadījumā katra pakete iet cauri tikai vienam filtrēšanas punktam. 
Kamēr ipchains un ipfwadm kombinē pakešu filtrēšanu un NAT (it īpaši trīs atsevišķus NAT paveidus, ko sauc "maskošanās", "portu pāradresēšana" un "novirzīšana"), Netfilter dod iespēju sadalīt pakešu operācijas trīs daļās - pakešu filtrēšana, savienojumu sekošana un tīkla adrešu tulkošana. Katra daļa piesaistās Netfilter atpakaļizsaukumiem ("āķiem") atšķirīgās koda vietās, lai piekļūtu paketēm. Savienojumu sekošana un NAT apakšsistēmas ir vispārīgākas un varenākas nekā vienkāršotās versijas, ko lieto ipchains un ipfwadm.
Šī atbildības dalīšana savukārt ļāva iptables izmantot informāciju, ko savienojumu izsekošanas slānis bija noteicis par pakotni - agrāk šī informācija bija piesaistīta NAT-am. iptables ir pārākas par ipchains, jo tām ir spēja novērot savienojuma stāvokli un novirzīt, pārveidot vai apturēt datu paketes, atkarībā no savienojuma stāvokļa, ne tikai no izcelsmes, galaadreses vai datu satura šajā paketē. Ugunsmūris, kurš balstīts uz iptables tādēļ kļūst par stāvokļjūtīgu ugunsmūri atšķirībā no ipchains, kas ļauj veidot vienīgi bezstāvokļa ugunsmūri, izņemot ļoti specifiskus gadījumus. Var uzskatīt, ka ipchains nezina pilnu kontekstu, kurā datu pakete rodas, kamēr iptables to zina. Tādēļ iptables var pieņemt labākus lēmumus par pakešu un savienojumu likteni.
Iptables, NAT-a apakšsistēma un savienojumu sekošanas apakšsistēma arī ir paplašināmas, un daudzi paplašinājumi ir iekļauti pamata "iptables" risinājumā, piemēram "iptables" paplašinājums, kurš ļauj izdarīt vaicājumus par savienojuma stāvokli, kā izklāstīts augstāk. Papildu paplašinājumi tiek izplatīti līdzās iptables lietojumprogrammai, piemēram, ielāpi kodola pirmkodam, līdz ar ielāpu rīku, ko sauc patch-o-matic. 
Tika izveidota arī iptables versija protokolam IPv6, kuru sauc par ip6tables, atbilstoši administrēšanas rīka nosaukumam.

Darbības pārskats

Netfilter ietvars ļauj sistēmas administratoram noteikt likumus, ko darīt ar tīkla paketēm. Likumus grupē ķēdēs - katra ķēde ir sakārtots likumu saraksts. Ķēdes grupē tabulās - katra tabula tiek saistīta ar citu pakešu apstrādes paveidu.
Katrs likums apraksta nosacījumu, kuras paketes tam atbilst un mērķi, kas norāda, ko darīt ar paketi, ja tā atbilst nosacījumam. Katra tīkla pakete, kas ienāk vai iziet no datora šķērso vismaz vienu ķēdi un katrs likums šajā ķēdē pārbauda savu nosacījumu. Atrodot pirmo likumu, kurš atbilst pakotnei, pārbaude beidzas, un likuma mērķis nosaka, ko darīt ar paketi. Ja pakete sasniedz predefinētas ķēdes beigas, neatbilstot neviena šīs ķēdes likuma nosacījumam, ķēdes politikas mērķis nosaka, ko darīt ar paketi. Ja pakete sasniedz lietotāja definētas ķēdes beigas, neatrodot nevienu atbilstošu likumu šajā ķēdē vai arī lietotāja definētā ķēde ir tukša, pārbaude turpinās izsaucošajā ķēdē (noklusētais mērķis ir RETURN). Vienīgi predefinētām ķēdēm ir politikas.
Katrs likums var izmest paketi no ķēdes (īsslēgums), un turpmākas ķēdes tad netiek apskatītas. Ķēde var saturēt norādi uz citu ķēdi - ja vai nu pakete iziet cauri visai ķēdei vai atbilst RETURN mērķim kārtējā likumā, tā turpināsies pirmajā ķēdē. Nav robežas uz to, cik daudzas iekļautas ķēdes var būt. Ir trīs vienkāršas predefinētas ķēdes (INPUT, OUTPUT un FORWARD), un lietotājs var radīt jaunas ķēdes pēc vajadzības. Likums var būt arī vienkārši norāde uz ķēdi.

Savienojumu izsekošana

Viena no svarīgākajām funkcijām, kas ir izveidota uz Netfilter ietvara pamata, ir savienojumu izsekošana (angļu: connection tracking). Savienojumu izsekošana ļauj kodolam sekot līdzi visām loģiskajiem tīkla savienojumiem vai sesijām, un tādējādi atpazīt paketes, kuras varētu piederēt dotajam savienojumam. NAT balstās uz šo informāciju, lai translētu visas saistītās paketes vienā un tanī pašā veidā, un "iptables" var izmantot šo informāciju, lai darbotos kā stāvokļjūtīgs ugunsmūris.
Savienojumu izsekošana klasificē katru paketi vienā no četriem stāvokļiem - NEW jeb jauna (cenšas izveidot jaunu savienojumu), ESTABLISHED jeb izveidojusies (daļa no jau esoša savienojumu), RELATED jeb saistīta (saistīta ar kādu no esošajiem savienojumiem, bet faktiski tai nepieder) vai INVALID jeb nederīga (nepieder pastāvošajam savienojumam un nespēj izveidot jaunu savienojumu). Normāla secība ir šāda - pirmā pakete, ko redz ugunsmūris tiek klasificēta kā NEW, atbilde uz to tiks klasificēta kā ESTABLISHED un ICMP kļūda būs RELATED. Savukārt tāda ICMP kļūdas pakotne, kas neatbilda nevienam zināmam savienojumam tiktu klasificēta kā INVALID.
Savienojuma stāvoklis ir pilnīgi neatkarīgs no jebkāda TCP stāvokļa. Ja hosts atbild ar SYN ACK pakotni, lai apstiprinātu jaunu ienākošo TCP savienojumu, tad pats TCP savienojums vēl nav izveidots, bet izsekojamais savienojums jau ir - šāda pakete atbildīs stāvoklim ESTABLISHED. Izsekots savienojums bezsavienojumu protokolam, piemēram UDP, tik un tā ir ar savienojuma stāvokli. 
Izmantojot spraudņu moduļus, savienojumu izsekošanai var darīt zināmus lietotnes slāņa protokolus un tādējādi var konstatēt, ka divi vai vairāki atsevišķi savienojumi ir "saistīti". Piemēram, aplūkosim FTP protokolu. Vispirms izveidojas vadības savienojums, bet, kad sākas datu pārraide, rodas atsevišķs savienojums datu pārraidei. Kad ielādējas nf_conntrack_ftp modulis, pirmā FTP datu savienojuma pakotne tiks apzīmēta kā RELATED nevis NEW, jo tā loģiski ir jau pastāvoša savienojums sastāvdaļa.
iptables var izmantot savienojumu izsekošanas informāciju, lai paplašinātu pakešu filtrēšanas likumu iespējas un vadāmību. Pakešu atbilstības nosacījumu "conntrack" paplašinājums pārbauda paketes savienojumu izsekošanas klasifikatoru dotajai paketei. Piemēram, kāds likums varētu atļaut NEW paketes tikai no iekšpuses uz ārpusi, bet atļautu RELATED un ESTABLISHED abos virzienos. Tas atļauj normālas atbildes pakotnes no ārpuses jau izveidotam (ESTABLISHED) savienojumam, bet neatļauj jaunus savoienojumus no ārpuses uz iekšpusi. Toties, ja FTP datu savienojumam ir jānāk no ugunsmūra ārpuses uz iekšpusi, tā tiks atļauta, jo paketi pareizi klasificēs kā RELATED attiecībā pret FTP vadības savienojumu, nevis kā NEW savienojumu.

iptables

iptables ir lietotāja apgabala lietojumprogramma, kas ļauj sistēmas administratoram konfigurēt Netfilter tabulas, ķēdes un likumus kā paskaidrots agrāk. Tā kā "iptables" darbināšanai ir nepieciešamas papildu privilēģijas, to jāizpilda lietotājam root, citādi tā nedarbosies. Vairumam Linux sistēmu, iptables ir instalēts kā /sbin/iptables un dokumentēts savā man lappusē. Šis vienkāršais piemērs iptables lietojumam ilustrē, kā novirzīt visu datu plūsmu, kura pienāk uz noklusēto HTTP portu tālāk uz portu 8080, atļaujot HTTP dēmonam darboties kā nepriviliģētam lietotājam, kurš nevar klausīties portus, kuru numuri ir mazāki par 1024.
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

ipset

ipset tiek lietots, lai izveidotu, uzturētu un pārlūkotu t.s. "IP kopas" Linux-a kodolā. "IP kopa" parasti satur kopu ar IP adresēm, bet var arī saturēt kopas ar citiem tīklošanā izmantotiem skaitliskiem identifikatoriem, atkarībā no tās "tipa".
Jebkuru elementu vienā kopā var piesaistīt arī citai kopai, kas ļauj veikt sarežģītas atbilstību meklēšanas darbības. IP kopu var izdzēst vienīgi tad, ja nav iptables likumu vai citu kopu, kas uz to norādītu.