Next Previous Contents

3. Netfilter Felépítés

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.

3.1 Netfilter Alapok

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:

  1. NF_ACCEPT: folytassa az útját.
  2. NF_DROP: dobja el a csomagot, ne folytassa az útját.
  3. NF_STOLEN: átvettem a csomagot, ne folytassa az útját.
  4. NF_QUEUE: rakja be a sorba a csomagot (rendszerint userspace-beli feldolgozásra).
  5. NF_REPEAT: ismételje meg a hook-ot.

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.

3.2 Csomag kiválasztás: IP Tables

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

Csomagszûrés

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.

NAT

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.

Masquerade, Port Forward, Transparent Proxy

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.

Csomag megváltoztatás

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.

3.3 Kapcsolatkövetés

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).

3.4 Egyéb kiegészítések

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.


Next Previous Contents