Netfilter csupán hook-ok sorozata a protokoll-stack különbözõ pontjain (jelen állapotban IPv4, IPv6 és DECnetben). Az (idealizált) IPv4 diagramm a következõképpen néz ki:
Csomag útja a netfilter rendszerben:
--->[1]--->[ROUTE]--->[3]--->[4]--->
| ^
| |
| [ROUTE]
v |
[2] [5]
| ^
| |
v |
A csomag a bal oldalon érkezik be: átesik az alapvetõ ésszerûségi ellenõrzéseken (pl. nem csonkolt, IP checksum rendben, nem promiscous csomag), átadásra kerül a netfilter keretrendszernek az NF_IP_PRE_ROUTING [1] hookon.
Ezután belépnek a rouolási kódba, itt dõl el, hogy a csomag egy másik interface felé tart, vagy helyi feldolgozásra kerül. A routolási kód eldobhatja a nem továbbítható csomagokat.
Amennyiben az eszköznek érkezett a csomag, a netfilter váz újra meghívódik a NF_IP_LOCAL_IN [2] hookkal, még mielõtt megkapná a program (ha van ilyen).
Ha egy másik interface-nek kell továbbítani, akkor a netfilter rendszer meghívja a NF_IP_FORWARD [3] hookot.
A csomag ezután az utolsó hookhoz érkezik, a NF_IP_POST_ROUTING [4] hookhoz, mielõtt ismét kikerülne a hálózatra.
Az NF_IP_LOCAL_OUT [5] hook a helyileg keletkezett csomagokra hívódik meg. Mint látható, az útvonalválasztás csak a hook után történik meg: abban az esetben, ha a routing kód elõbb kerülne meghívásra (a forráscím és pár opció kiszámítására) - ha meg akarod változtatni a routolást, magát az `skb->dst' mezõt kell módosítanod, ahogy az a NAT kódban is történik.
Van egy példánk az IPv4-es netfilterhez, ahol láthatod, hogy minden hook meghívódik. Ez a lényege a netfilternek.
Kernel modulok bármelyik hookra regisztrálhatják magukat. A modulnak, ami regisztrálja magát, prioritást kell rendelnie a funkciójához; ezután amikor a netfilter hook aktivizálódik a belsõ hálózati részekbõl, minden bejegyzett modul meghívásra kerül a prioritási sorrend alapján, s szabadon módosíthatja a csomagot. A modul öt dologra kérheti a netfiltert:
A netfilter egyéb részei (sorba-állított csomagok kezelése, kiegészítések) a kernel részben kerülnek bemutatásra.
Ezen az alapon nagyon összetett csomagmanipulációt tudunk kiépíteni, mind azt a következõ két szakasz is bemutatja.
A csomag-kiválasztási rendszert IP Tablesnek hívják, s a netfilter vázra épült. Közvetlen leszármazottja az ipchains (ami az ipfwadmnak, s ami a BSD ipfw-jének) - csak bõvíthetõséggel. Kernel modulok tudnak új táblákat bejegyezni, s arra ítélni egy csomagot, hogy az adott táblán haladjon végig. Ez a kiválasztás használatba kerül a csomagszûrésnél (`filter' tábla), hálózati címfordításnál (NAT) (`nat' tábla) valamint az általános routolás elõtti csomagmódosításnál (`mangle' tábla).
A következõ hookok vannak regisztrálva a netfilterben (abban a sorrendben felsorolva, ahogyan meghívásra kerülnek):
--->PRE------>[ROUTE]--->FWD---------->POST------>
Conntrack | Filter ^ NAT (Src)
Mangle | | Conntrack
NAT (Dst) | [ROUTE]
(QDisc) v |
IN Filter OUT Conntrack
| Conntrack ^ Mangle
| | NAT (Dst)
v | Filter
Ez a tábla, a `filter' sose változtatja meg a csomagot: csak megszûri.
Az iptables elõnye az ipchains-szel szemben, hogy kicsi és gyors, valamint a netfilterbe az NF_IP_LOCAL_IN, NF_IP_FORWARD és NF_IP_LOCAL_OUT pontokon kapcsolódik. Ez azt jelenti, hogy minden egyes csomag egy (és csak is egy) helyen kerülhet megszûrésre. Ez sokkal könnyebbé teszi a használatát az ipchains-szel szemben. Szintén elõny, hogy a netfilter váz biztosítani képes a be és kimenõ interface-t is az NF_IP_FORWARD hooknak, ami számos szûrést egyszerûbbé tesz.
Megjegyzés: az ipchains és az ipfwadm is portolásra került a netfilter vázra, lehetõvé téve a meglevõ rendszerek használatát.
Ez a `nat' tábla birodalma, ami két helyrõl eszi a csomagokat: a nem helyi csomagokat a NF_IP_PRE_ROUTING és a NF_IP_POST_ROUTING hookokról, amik lehetõséget adnak a cél és forrás megváltoztatására. Ha a CONFIG_IP_NF_NAT_LOCAL definiált, a NF_IP_LOCAL_OUT és NF_IP_LOCAL_IN hookok kerülnek használatba a helyi eredetû csomagok esetében.
Ez a tábla kevésben tér el a `filter' táblától: a kapcsolatnak csak az elsõ csomagja halad keresztül a láncon, s az eredmény ezután minden csomagra alkalmazva lesz a kapcsolat alatt.
A NAT-ot két részre bontottam: Source NAT (ahol a csomag forrása változhat) és Destination NAT (ahol az elsõ csomag célja változhat).
Masquerading az SNAT egy speciális formája; a port forwarding és a transzparens proxy-zás a DNAT esetei. Ezek mindegyike megvalósítható a NAT keretrendszerrel, ahelyett, hogy különálló rendszerek lennének.
A csomagváltoztató tábla (`mangle' tábla) használható a csomag tartalmának megváltoztatására. Ez a NF_IP_PRE_ROUTING és a NF_IP_LOCAL_OUT pontokon kapcsolódik a netfilterhez.
Kapcsolatkövetés sarkalatos pontja a NAT-nak, de ennek ellenére külön modulként került megvalósításra; ez megengedi, hogy a csomagszûrõ egy kiegészítése egyszerûen és tisztán használja a kapcsolatkövetést (a `state' modul).
Az új flexibilitás lehetõséget ad igazán vad dolgokra, de azok számára is nyitott a lehetõség, akik bõvítéseket, vagy teljesen helyettesítõ részeket szeretnének belevenni a rendszerbe.