- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 01/2000

Netfilter a iptables

Jarda Cmunt

Pokud jste se již vzpamatovali z přechodu z ipfwadm na ipchains, čeká vás s příchodem kernelu 2.4 další velká změna. Firewalling kód v kernelu byl zcela přepsán a nový nástroj pro správu filtrování packetů se jmenuje iptables.

Hned na úvod jedna dobrá zpráva. Nový kód je zpětně kompatibilní jak s ipchains, tak s ipfwadm (filtrovací pravidla lze spravovat pomocí těchto nástrojů), a autor je podle svých slov hodlá podporovat až do roku 2003. I když jste s ipchains plně spokojeni, můžete si přečíst následující článek, neboť iptables přinášejí některé nové a značně významné možnosti, jako např. stavové filtrování (jinak také dynamické filtrování).

Proč byl kód opět přepsán? Funkce jako filtrování paketů, maškaráda nebo transparentní proxy jsou v nynějších jádrech spojeny, a to nejen v tom smyslu, že jsou spravovány jedním nástrojem, ale i na úrovni implementace. To zvyšuje možnost zavádění nechtěných chyb do filtrovacích pravidel při současném použití filtrování packetů a maškarády (iptables nyní skutečně pouze filtrují a packety nijak nemění).

Oddělení těchto věcí v jádrech 2.4 má za následek jednodušší používání nástroje iptables a vytvářená pravidla jsou průhlednější. To mimo jiné snižuje i možnost zavlečení chyb při konfiguraci firewallu. Další významnou změnou je rozšiřitelnost všech těchto nástrojů.

NAT, maškaráda, port forwarding, reverse NAT (load sharing) a další jsou nyní spravovány nástrojem ipnatctl, který opět slouží pouze k tomuto účelu.

Vzhledem k tomu, že architektura se zcela liší od ipchains popsaných v Linuxových novinách v březnu roku 1998, bude vhodné, když se na ní podíváme trochu detailněji.

Netfilter

Základem je netfilter framework, který je součástí jádra. Ten definuje na cestě packetu TCP/IP stackem pět bodů, ve kterých se mohou moduly jádra přihlásit k jejich odběru a rozhodnout, zda packetu dají šanci postoupit dál, nebo zda bude zlikvidován. V každém bodě může být přihlášeno libovolné množství modulů, a packety, pokud nejsou některým zlikvidovány, jsou předány postupně všem. Pro větší názornost si cestu packetu ukážeme na obrázku.

[ netfilter ]

A to je vše, co se děje na této základní úrovni. Netfilter kromě toho nabízí už jen základní infrastrukturu pro komunikaci userspace vs. kernel, kterou lze použít k předávání parametrů do modulů a zpětnému získávání stavových informací. Stejně jako u ipchains lze předávat packety do userspace k dalšímu zpracování, opět je to ovšem implementováno jinak (cena za všechna tato zlepšení).

Iptables

Nyní k vlastnímu filtru packetů. Ten je implementován sadou modulů jádra, které je nutno zavést před vlastním vytvářením filtrovacích pravidel. Rozčlenění na moduly různého druhu má několik výhod. Jednak můžete zavádět pouze ty, které opravdu potřebujete, jednak samotné iptables jsou navrženy jako rozšiřitelné právě pomocí modulů jádra. Jako moduly lze přidávat jednak cíle (na rozdíl od ipchains zde nejsou pouze základní cíle DENY, REJECT, ACCEPT a uživatelem vytvořené řetězce, lze přidávat libovolné další), a také filtrovací pravidla.

Aby tyto moduly byly spravovatelné pomocí nástroje iptables, je i tento program navržen jako rozšiřitelný, a to pomocí dynamických knihoven. Každý netriviální modul, který vyžaduje předat nějaké parametry, má svůj doplněk v dynamické knihovně pro iptables. Vše je navrženo tak, aby implementace byla co nejjednodušší, a dosti kvalitně zdokumentováno.

Rozčlenění na moduly má i další kladný dopad. Kód pro stavové filtrování, který byl původně součástí NAT (connection tracking) a implementován rovněž pomocí modulů, je nyní sdílen s iptables.

Cesta packetu filtrovacím kódem se liší od ipchains a poskytuje větší nezávislost filtrovacích pravidel na interfacech. Bude dobré, když ji opět zobrazíme graficky (viz druhý obrázek).

[ iptables ]

Řetězec INPUT odpovídá bodu NF_IP_LOCAL_IN z předchozího obrázku, řetězec FORWARD bodu NF_IP_FORWARD a konečně řetězec OUTPUT bodu NF_IP_LOCAL_OUT.

Výhodou oproti předchozím implementacím je, že packet procházející řetězcem FORWARD, ve kterém se v běžných případech bude odehrávat většina filtrování, ví, jak o vstupním, tak o výstupním rozhraní, neboť již bylo rozhodnuto o jeho směrování.

Vzhledem k tomu, že vytváření filtrovacích pravidel se nijak zvlášť neliší od ipchains (jsou zde syntaktické změny, koncepce funkce je ale podobná), budeme se dále zabývat pouze funkcemi, které iptables nabízejí navíc. Popis příkazu iptables (a ipnatctl) naleznete v balíku netfilter, který najdete na adrese http://www.samba.org/netfilter/.

První významnou, a zřejmě nejdůležitější změnou, je stavové filtrování. Při konstrukci filtrovacího pravidla můžete zohlednit stav socketu, ke kterému procházející packet patří. Rozlišované stavy jsou tyto:

  • NEW - jde o packet, který vytváří nový socket.

  • ESTABLISHED - packet, který lze přiřadit některému již probíhajícímu spojení.

  • RELATED - packet, který se vztahuje k nějakému probíhajícímu spojení, ale není jeho součástí (např. ICMP zpráva o chybě).

  • INVALID - packet, který nelze přiřadit žádnému spojení. Tyto packety by měly být likvidovány.

Budeme-li tedy např. chtít zvýšit odolnost systému proti stealth port scanům, můžeme to zajistit tím, že budeme likvidovat packety s nastaveným FIN flagem a stavem INVALID.

Další možnost je zmíněna v předchozím odstavci. iptables umožňují rozlišovat jednotlivé flagy v TCP hlavičce a filtrovat packety podle nich. V ipchains bylo možné detekovat pouze nastavený SYN flag.

Dále je možné filtrovat podle TCP options nebo MAC adresy.

A konečně je zde pravidlo limit, které je možné použít například k omezení logování v některém řetězci. U toho pravidla můžeme nastavit maximální počet shod za sekundu a omezit tak přeplňování logu v řetězci, u kterého lze očekávat velký počet shod.

V současné době jsou iptables ve vývoji, takže je možné, že počet nových vlastností se před uvedením jader řady 2.4 ještě zvětší.

Netfilter je součástí současných vývojových jader 2.3, takže pokud ho chcete vyzkoušet, případně začít vyvíjet vlastní moduly, potřebujete instalovat nejnovější jádro této řady a balík netfilter v výše uvedené adresy, který obsahuje implementaci iptables, ipnatctl a dokumentaci.

Informace o mailing listu pro netfilter naleznete na téže adrese (jde spíše o vývojářský list než o technickou podporu). *


- předchozí článek - následující článek - obsah - úvodní stránka -