Paketové filtry v Linuxu

Lukáš Boháč, xbohac@fi.muni.cz



Typy firewallů

Firewally se používají z různých důvodů, např. k zvýšení bezpečnosti sítě proti vnějším útokům, sledování a omezování toku dat v síti, soustředění přístupu do jednoho místa atd.

Typy:

Paketové filtry

Pracují na síťové vrstvě OSI modelu. Kontrolují hlavičky paketů (zdrojové a cílové IP adresy a porty). Jsou transparentní a nenáročné, pracují rychle na úrovni jádra. Neumožňují však jemnější filtrování, protože pracují na spodní vrstvě OSI modelu.

Aplikační brány (proxy servery)

Pracují na aplikační vrstvě. Většinou však pro určitou službu a tedy je nutné mít zvláštní program pro každou aplikaci. Veškerá komunikace probíhá prostřednictvím proxy serverů. Možnost autentizace a kontroly na úrovni uživatelů. Vyžadují však spolupráci na straně klienta a nejsou tedy transparentní. Umožňují jemnější filtrování, je však zvýšena režie.

Paketový filtr

Paketový filtr je program, který monitoruje příchozí a odchozí pakety a podle obsahu hlavičky (typ paketu, adresy ap.) rozhoduje, jak se s každým paketem naloží (zda bude paket akceptován, zahozen, ...).

Filtrování paketů v Linuxu

V Linuxu je paketový filtr zakomponován přímo v jádře už od verze 1.1. První implementace byla založena na ipfw systému BSD. Ve verzi 2.0 přibyl jednoduchý uživatelský nástroj ipfwadm pro nastavování filtrovacích pravidel, který byl později, ve verzi 2.2, rozšířen nástrojem ipchains. V nových verzích (verze jádra od 2.4) byl kód zcela přepsán, používá se netfilter a pro nastavování filtrovacích pravidel nástroj iptables. Iptables je rozšířením ipfwadm a ipchains.

Netfilter

Stavový paketový filtr od verze jádra 2.4, k ovládání pravidel práce s pakety slouží program iptables. Aby bylo možné filtr používat je nutné mít zkompilované jádro s některými volbami (jako CONFIG_NETFILTER ap.). Tabulky je nutné plnit nějakým startovacím skriptem, protože nastavení nepřežije reboot. Dalšími pomocnými nástroji jsou iptables-save sloužící k uchování současného nastavení do souboru a jeho protějšek iptables-restore. Používá několik bodů ke kontrole toku paketů (viz obrázek).
 
               Deny/Reject                          Deny/Reject
                    |                                    |
                +---+---+                           +----+---+
                | INPUT |->---( Local Process )--->-| OUTPUT |
                +---+---+                           +----+---+
                    |                                    |
                    ^                                (routing)
                    |                                    |
   +------------+   |         +---------+         +------+------+
-->| PREROUTING |-(routing)-->| FORWARD |->------>| POSTROUTING |-->-
   +-----+------+             +----+----+         +------+------+
         |                         |                     |
     Deny/Reject               Deny/Reject          Deny/Reject

Řetězy

Netfilter má 5 základních řetězů pro filtrování a případnou další úpravu paketů (NAT). Lze nadefinovat i další vlastní a do nich přesměrovat pakety (vhodné pro přehlednost a jednoduchost pravidel).

5 základních řetězů (popsány u tabulek)
  • PREROUTING
  • INPUT
  • FORWARD
  • OUTPUT
  • POSTROUTING
Systém netfilteru se skládá z několika tabulek (tables) obsahujících tyto řetězy pravidel (chains)

Tabulky a řetězy

  • filter - používá se na filtrování všeobecně, tedy na akce typu ACCEPT, REJECT, DROP ap. V této tabulce by nemělo docházet k úpravě paketů, provádí se zde pouze filtrování paketů v řetezech (chainech)
    INPUT (pakety určené pro lokální aplikace),
    FORWARD (pakety negenerované lokálně a neurčené pro localhost),
    OUTPUT (lokálně vygenerované paketu).
  • nat - v této tabulce se provádí překládání adres (NAT); prochází jí pouze první paket každého spojení, ve kterém se provádí překlad adres. Výsledek průchodu paketu tabulkou je potom aplikován na všechny ostatní pakety spojení.
    NAT (Network Address Translation) lze rozdělit na Source NAT (překlad zdrojových adres paket) a Destination NAT (překlad cílových adres paket); maškaráda (masquerading) je speciální případ SNAT; překládání portů (port forwarding) a transparentní proxy jsou speciální případy DNAT. NAT se provádí v chainech
    PREROUTING (pakety přicházející ze zařízení) a
    POSTROUTING (pakety odcházející na zařízení).
  • mangle (česky "zkomolit, zmrzačit") - tabulka opět pro úpravu paketů - změny v hlavičkách (TTL, TOS, ...), ale nikoliv NAT a maškarádování. Tyká se zejména řetězů PREROUTING a OUTPUT.

iptables

Umožňuje manipulaci pravidel v jednotlivých řetězech (což jsou seznamy pravidel), např. měnit, vkládat na určitou pozici (záleží totiž na pořadí, pravidla se vyhodnocují postupně) atd. Pravidlo uvádí podmínky, které má paket splňovat a cíl, který se má vykonat. Nesplňuje-li paket podmínky určitého pravidla, zkouší se další pravidlo, dokud nedojdeme na konec seznamu (pak se uplatní implicitní cíl tohoto řetězce (viz -P)). Obecná syntax příkazu iptables je:
   iptables [table] <command> <match> <target/jump>
  • table - tabulka
  • command - co chceme s tabulkou/pravidlem udělat
  • match - popis paketu, pro který pravidlo vyhovuje
  • target - co se má udělat s paketem

Tables

Tabulka se volí přepínáčem -t, implicitně je tam tabulka filter

Commands

Příkazy definují, ci se má s daným pravidlem udělat (přidat, smazat atd.) Příklady:
  • -A, --append - přidává pravidla
  • -D, --delete - maže pravidla
  • -R, --replace - mění již definovaná pravidla
  • -L, --list - vypisuje všechna pravidla zvoleného řetězu
  • -N, --new-chain - nový řetěz
  • ...

Matches

Příklady přepínačů popisující pakety, které budou vyhovovat:
  • -p - protokol (tcp, udp, icmp) (+ další rozšiřující přepínače k jednotlivým protokolům)
  • -s - zdrojová IP adresa
  • -d - cílová IP adresa
  • -i - vstupní zařízení
  • -j - co udělat, když paket vyhovuje (viz dále)
  • ...

Targets

Akce, které se mají vykonat, např.
  • ACCEPT - akceptuje a nechá jít dál
  • DROP - zahodí
  • REJECT - jako DROP, ale navíc vyšle ICMP chybovou zprávu
  • REDIRECT - přesměruje
  • QUEUE - poskytne paket pro zpracování v uživatelském prostoru
  • SNAT, DNAT - překlad zdrojových/cílových adres
  • MASQUERADE - maškaráda
  • LOG - loguje pomocí syslog démona

Nějaké příklady

iptables -A INPUT --dport 80 -j DROP
iptables -D OUTPUT 2
iptables -L FORWARD
iptables -P INPUT DROP
(nastavení implicitní politiky ACCEPT nebo DROP)

... a další možnosti viz manuálové stránky

Ukázky chování filtru na paketech

Forwardovaný paket
paket přichází z Internetu
paket přichází na interface
mangle PREROUTING
nat PREROUTING
rozhodnutí směrování (localhost/forwading)
filter FORWARD
nat POSTROUTING
paket odchází na interface
paket odchází zpět do Internetu

Paket určený pro localhost
paket prichází z Internetu
paket přichází na interface
mangle PREROUTING
nat PREROUTING
rozhodnutí směrování (localhost/forwading)
filter INPUT
lokální proces

Paket generovaný lokálně
lokální proces
mangle OUTPUT
nat OUTPUT
filter OUTPUT
rozhodnutí směrování (localhost/forwading)
nat POSTROUTING
paket odchází na interface
paket jde zpět do Internetu

NAT a iptables

NAT (Network Address Translation) lze rozdělit na dva typy.
  • Source NAT (zdrojový překlad)
    Při "zdrojovém překladu" adres se mění zdrojová adresa prvního paketu, tzn. mění se jakoby místo, odkud paket odchází. Zdrojová adresa se mění vždy až po routování, přímo před tím, než se daný paket vypustí do sítě. Častým typem "zdrojového překladu" je maškarádování.
  • Destination NAT (cílový překlad)
    Při "cílovém překladu" se mění cílová adresa prvního paketu. Cílová adresa se mění vždy před routováním. Častým typem takovéhoto překladu je port forwarding.
Struktura netfilteru umožňuje vytvářet filtrovací pravidla firewallu nezávisle na překladu adres, neboť k němu dochazí buďto před nebo až po routování, a proto filtrovací pravidla pracují se skutečnými zdrojovými i cílovými adresami.
Jsou definováný tři řetězy - PREROUTING, POSTROUTING a OUTPUT.

Příklady

Překlad zdrojové adresy paketů odcházejících z eth0 na určitou adresu a port (vybere se v poslední době nejméně používaná (load-balancing)):
iptables -t nat -A POSTROUTING -i eth0 -j SNAT --to 1.2.3.4-1.2.3.10:5

Adresa přepisující se na adresu rozhraní, přes kterou paket odchází ven:
iptables -t nat -A POSTROUTING -i ppp0 -j MASQUERADE

Překlad cílové adresy:
iptables -t nat -A PREROUTING -p udp -j DNAT --to 1.2.3.4


Zdroje a odkazy