Negyedik generációs tűzfal Linux-on
 
 
Kadlecsik József
kadlec@sunserv.kfki.hu
KFKI RMKI SZHK

Networkshop'2000 konferenciaelőadás, 2000. április 18-20., Gödöllő
 
 
A jelenleg fejlesztés alatt álló (2.3) és a következő stabil Linux kernelben (2.4) a csomagszűrő modul a negyedik generációt jelenti a Linux kernel tűzfal-támogatásában. Megvizsgáljuk a netfilter csomag új tulajdonságait, képességeit, összehasonlítva azt az előző ipchains változattal.
 
Bevezetés
 
A Linux kernelben már igen régóta létezik csomagszűrési lehetőség. Jelenleg a negyedik generációs változat (netfilter - iptables) áll fejlesztés alatt:
 
ipfw
Alan Cox, portálás BSD-ről
1.1 (1994 vége)
ipfwadm
Jos Vos
2.0 (1996 közepe)
ipchains
Rusty Russell
2.2 (1998 közepe)
iptables
Rusty Russell
2.4 (1999 közepe)
 
Vajon mi igényelte a kernel csomagszűrési részének az újabb átdolgozását az ipchains után?
 
¤Nem volt mód a csomagok usertérben (kernelen kívül) való kezelésére:
¤ A kernel programozás nehéz
¤ Kernel-kódot csak C/C++-ban lehet írni
¤ A dinamikus szűrés inkább a usertérbe való
¤ 2.2-tol a netlink lehetőséget adott a csomagok usertérbeli kezelésére, de lassú
¤ A transzparens proxy kezelés kezdetleges volt:
¤ Minden csomagot megvizsgált, hogy volt-e hozzá megfelelő socket a rendszerben
¤ Lokálisan generált csomagokat nem lehetett átirányítani
¤ Az átirányítás nem kezelte megfelelően az összes UDP válasz-csomagot
¤ Az átirányítás nem volt összhangban a lokális TCP/UDP port-allokálással
¤ A kód rendkívül sok helyen "nyúlt bele" a normál Linux kernelbe
¤ A masquerading a csomagszűrésre volt ráépítve ­ a két különböző funkció kölcsönhatása komplexé tette a tűzfal-építést:
¤ Az input szűrésnél a válasz-csomagok a lokális gépnek címzettként jelentek meg
¤ Forward szűrésnél a demasquerade által kezelt csomagok egyáltalán nem látszottak
¤ Output szűrésnél a csomagok a lokális géprol indulóként jelentek meg
¤ A TOS manipuláció, átirányítás, mark (amely hatással lehetett mind a port átirányításra, routing-ra, QoS-re) mind a csomagszűrésre volt ráültetve
¤ Az ipchains sem nem moduláris, sem nem kiterjesztheto
¤ ­.
 
Négy különböző dolog - csomagszűrés, masquerading (NAT), routing és TOS manipuláció - keveredett egyben és az egész meglehetősen ad-hoc módon kapcsolódott össze. Lehetetlen volt egyetlen funkcióval foglalkozni, ami mind a fejlesztést, mind a rendszerkonfigurálást nehézkessé tette.
 
1. Netfilter
 
A netfilter egy keretrendszer ­ infrastruktúra ­ a Linux kernelen belül, amely négy részbol áll
 
¤Minden protokoll jól definiált belépési pontokat határoz meg a protokoll stack-jében (az IPv4 5-öt), ahol a protokoll a netfilter keretrendszerrel lép kapcsolatba.
¤ A kernel részei (modulok) regisztálhatják magukat a belépési pontoknál. Így amikor egy csomag belép a netfilter rendszerbe, az megnézi, hogy az adott protokollra és belépési pontra valaki regisztráltatta-e magát. Ha igen, azok prioritási sorban megvizsgálhatják (és megváltoztathatják) a csomagot és eldönthetik annak sorsát: a csomagot el kell dobni; továbbhaladhat a netfilter rendszerben; kerüljön bele egy a usertérbe való átadáshoz fenntartott queue-be.
¤ Queue a usertérnek átatandó csomagok számára: ezeket a csomagokat a rendszer aszinkron módon kezeli.
¤ Végül a netfilter keretrendszer része a forráskódbeli megjegyzések sora, valamint a dokumentáció .
 
A keretrendszerre épülve különböző modulok készültek el. Ezek közül a legjelentosebb a teljes NAT rendszer, valamint a kiterjeszthető csomagszűrő modul.
 
2. A netfilter architektúrája
 
IPv4 esetén az (idealizált) netfilter belépési pontokat a következő ábra mutatja:

Az ábra bal oldalán belépő csomagok (néhány minimális ellenorzés után, pl IP checksum) először a PREROUTING belépési ponton keresztül jutnak be a netfilter rendszerbe.
 
Ez után belépnek a routing kódba, amely eldönti, hogy egy lokális programnak címzett csomagról van-e szó, vagy sem.
 
Ha a csomag egy lokális programnak szól, akkor a LOCAL IN (INPUT), ha egy másik interface-nek, akkor a FORWARD belépési ponton keresztül újra a netfilteren a sor, hogy megvizsgálja a csomagot.
 
A lokálisan generált csomagok rögtön a LOCAL OUT (OUTPUT) belépési ponthoz kerülnek. Ez után a routing kód eldönti, mely interface-nek szól a csomag és (a FORWARD belépési ponton keresztül érkező csomagokkal együtt) a POSTROUTING pontban újra a netfilter rendszerbe kerülnek.
 
A kernel modulok bármely belépési pontnál (vagy pontoknál) regisztrálhatják magukat. Amikor egy-egy csomag hozzájuk kerül, a következő "válaszokat" adhatják a netfilter keretrendszernek:
 
¤ACCEPT: a csomag folytassa az útját a rendszerben
¤ DROP: dobd el a csomagot
¤ STOLEN: elvettem a csomagot, felejtkezz el róla
¤ QUEUE: tedd a csomagot a usertér számára a queue-be
 
Ezzel az infrastruktúrával egy meglehetősen komplex ­ és kiterjeszthető - csomag-manipulási rendszer hozható létre. A csomagszűrés, NAT, csomag-módosítás önálló részekké váltak, így a rendszer sokkal átláthatóbb és jobban kontrollálható.
 
2.1 Csomagszűrés
 
A csomagszűrés (iptables [-t filter]) három belépési ponton regisztrálja magát: LOCAL IN, FORWARD és LOCAL OUT:

Ez alapvetően különbözik attól, mint ami a 2.0 és 2.2 kernelek esetén volt:

Minden csomag számára egy és csak egy helyen lehet szűrési feltételeket beállítani. Ez sokkal egyszerubbé teszi a csomagszűrést az ipchains-hez képest ­ miközben az iptables kicsi és gyors! Mivel a LOCAL IN ponton az input, a LOCAL OUT-nál az output, míg a FORWARD-nál az input/output interface-k vizsgálhatók, sokféle szűrés egyszerubbé vált.
 
Készültek modulok, amelyek segítségével ­ formálisan ­ az ipfwadm, ipchains parancsok változatlanul használhatók.
 
2.2 NAT
 
A netfilter insfrastruktúrája három belépési pontot biztosít a NAT (iptables ­t nat) számára. Nem-lokális csomagok esetén a PREROUTING és POSTROUTING, míg lokális csomagok esetén a LOCAL OUT belépési pontok tökéletesen megfelelőek forrás és címzett-cím manipuláláshoz.
 
A NAT a netfilternél két típusra bontható: forráscím manipulálás (SNAT: source NAT) és célcím manipulálás (DNAT: destination NAT).
 
SNAT esetében a forráscímet változtatjuk meg. Ez mindig a routing után történik (POSTROUTING). A masquerading az SNAT egy speciális esete.
 
DNAT-nál a csomagban szereplő célcímet cseréljük le egy másikra. Ez nem-lokális csomagnál még routing előtt (PREROUTING), lokálisan generált csomagnál pedig a LOCAL OUT (OUTPUT) kapcsolódási pontoknál hajtható végre. A port átirányítás, load sharing, transzparens proxy mind egy-egy példa a DNAT különböző alkalmazási lehetőségeire.

2.3 Csomag-módosítás
 
Az IP csomag TOS mezejének manipulálása és a "mark" önálló modul részei lettek (iptables ­t mangle). A mangle modul a PREROUTING és LOCAL OUT belépési pontokon regisztálja magát a netfilterben.
 
2.4 Kapcsolatok nyomonkövetés
 
A kapcsolatok nyomonkövetése alapvető a NAT számára. Ezt egy a NAT-tól független modul végzi, így lehetové vált a csomagszűrést egy a kapcsolat-állapotokat vizsgáló modullal kiegészíteni (iptables ­m state). Ezzel gyakorlatilag az ún. stateful packet filtering az iptables természetes része lett.
 
3. Hiányosságok
 
A netfilter keretrendszer nagyon fiatal. Hiányzik belőle néhány modul és javításra szorul néhány már létezo:
 
¤A kapcsolatok nyomonkövetése (a NAT miatt) megelőzi a csomagszűrést. Ezért minden új kapcsolatot eredményező csomag egy-egy új bejegyzést generál a kapcsolatok táblázatában, amely DoS támadásokkal szemben sérülékennyé teheti a rendszert. Szükség lenne egy ratelimit modulra, amely az új kapcsolatoknak a kapcsolatok táblázatába való kerülését szabályozza, kontrollálja (a már létező limit modul nem erre való).
¤ A TCP kapcsolatok nyomonkövetése lényegében megörökölte a 2.2-es kernel TCP masquerading részében használt megoldást, amely
¤ Elnagyolt, nincs benne IP sorozatszám, ACK, window nyomkövetés
¤ A TCP állapottér-figyelés nem akadályozza meg az ún. ACK scanning-ot
¤ A NAT és a kapcsolat-nyomkövetés még nagyon kevés speciális alkalmazást ismer (jelen cikk irásakor csupán az FTP-t).
 
Összefoglalás
 
A netfilter keretrendszer egy igen komoly előrelépés a Linux kernel csomag-manipulálásában. Modularizáltsága miatt igen könnyen kiterjeszthető és már most léteznek hozzá speciális modulok:
 
¤owner, amellyel a szűrőfeltételben a lokális csomagot generáló felhasználó tulajdonságaira [uid, gid, pid, sid] lehet szűrni
¤ mac, ahol az Ethernet keretben lévő MAC címre szűrhetünk
¤ unclean, amellyel "abnormális" csomagokat lehet kiszűrni
 
Az első átgondoltan a Linux kernelbe ágyazott csomag-manipuláló keretrendszer révén lehetőséget biztosít az IPv4-en kívül más protokollok (pl. IPv6) integrálására, amely a jövő szempontjából nagyon fontos és előremutató.
 
URL
 
http://netfilter.kernelnotes.org/