Netfilter

**Netfilter** ir ietvars, kas dod iespēju Linux kodolam pievienot notikumu apstrādātājus pakešu pārtveršanai un apstrādei. Pazīstamākais komponents, kas balstīts uz *Netfilter* ir ugunsmūris, kurš filtrē paketes, bet notikumu apstrādes "āķus" izmanto arī citi komponenti, kas veic tīkla adrešu tulkošanu, stāvokļjūtīgu pakešu izsekošanu un pakešu sarindošanu lietotāja atmiņas apgabalā. Nosaukums **Netfilter** attiecas arī uz projekta nosaukumu, kurā tiek izstrādāti ugunsmūra rīki Linuksam. Šie kompenenti parasti ir ielādējami kodola moduļi, lai gan projekts arī piedāvā lietotāja apgabalā izvietojamus rīkus un bibliotēkas. Netfilter produkti pēdējā laikā vairs nenodrošina atpakaļsavietojamību ar ipchains.

**iptables** ir nosaukums rīkam lietotāja apgabalā, ar kuru Linuksa servera administratori veido likumus pakešu filtrēšanai un NAT moduļiem. Tehniski runājot, iptables ir rīks, kurš vienīgi kontrolē pakešu filtrēšanu un NAT komponentus kodolā, nosaukumu *iptables* bieži lieto, lai aprakstītu visu infrastruktūru, ieskaitot Netfilter, savienojumu sekošanu un NAT, kā arī pašu *iptables* komponentu. Tā ir standarta sastāvdaļa visās mūsdienīgās Linux distribūcijās.

## 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 (). 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ēhttp://pwet.fr/man/linux/administration_systeme/iptables . Š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.

## Skatīt arī
* Shorewall, softs vienkāršākai iptables pārvaldīšanai.
* FireHOL, vienkārša lietojumprogramma, lai lietotu iptables ugunsmūri.
* NuFW, Netfilter paplašinājums lietotāja atmiņas apgabalam
* ipchains, Netfilter priekšgājējs.
* Netlink, Netfilter lietotais programmējamais interfeiss (API)
* PF (ugunsmūris)
* ipfw
* ipfilter

## Ārējās saites
* Netfilter/iptables projekta sākumlapa
* IP Tables apmācības kurss
* Netfilter-a savienojumu izsekošanas sistēma, autors Pablo Neira Ayuso
* Kā iptables seko savienojumiem
* Iptables piemērs - likumsaraksti (rulesets)
* Vienkāršs iptables ugunsmūra scenārijs
* Iptables skaidrojums vienkāršiem vārdiem (ļoti izvērsts)
* Tiešsaistes Iptables ģenerēšanas scenārijs
* Netfilter un Iptables -- Stāvokļjūtīgi ugunsmūri Linux-am
* Iptables Linux 2.4 kodolā
* Kā programmēt Netfilter/iptables moduļus iekš "Rope" 
* Freshmeat projekta sākumlapa 

### Lietotāju saskarnes
* :en:NuFW autentificējošs ugunsmūris, kurš izmanto Netfilter
* Ugunsmūru veidotājs 
* dwall  Universāls ugunsmūru generators
* Firestarter vizuāls ugunsmūru konfigurēšanas rīks
* NetfilterOne  bezmaksas grafisks rīks Netfilter-a drošības politikas veidošanai (šo softu vairs tieši nepiegādā Solsoft)
* KMyFirewall KDE/QT balstīts konfigurēšanas rīks

### Diagrammas
Lai labāk saprastu, kā pakete šķērso Linux kodola Netfilter tabulas/ķēdes, sk. šādas diagrammas:
* http://inai.de/images/nf-packet-flow.png
* http://xkr47.outerspace.dyndns.org/netfilter/packet_flow/packet_flow9.png
* https://web.archive.org/web/20080307181043/http://en.wikipedia.org/wiki/Image:Iptables_packet_traversal.pdf
* http://www.shorewall.net/images/Netfilter.png 
* https://archive.today/20130103103429/dmiessler.com/images/DM_NF.PNG