- předchozí článek - následující článek - obsah -

Linuxové noviny Březen 1998

Firewall v řetězech

Jan Kasprzak, 14. břazna 1998

V tomto článku vás chci seznámit s nástrojem zvaným ipchains, jehož autorem je Paul Russel (Paul.Russell@rustcorp.com.au). Je to nástroj pro tvorbu firewallů typu packetový filtr pod Linuxem. Jeho funkčnost je nadmnožinou funkčnosti IPFW.

Účel použití IP chains v systému je stejný, jako u klasického IPFW packetového filtru: specifikovat, které packety mohou projít systémem (ať již dovnitř, ven nebo být forwardovány přes systém), dále mít možnost sledovat, kolik packetů určitého tvaru prochází systémem, a dokonce mít možnost například logovat příchod podezřelých packetů. Poslední jmenovaná vlastnost je důležitá pro skutečně aktivní obranu před útočníkem a umožňuje odchytit pokusy o průnik hned v začátcích.

Zprovoznění IP chains

Systém IP chains má dvě části: jedna je uvnitř jádra a jde o vlastní filtrovací kód, druhá část - program ipchains - slouží k nastavování jednotlivých filtrovacích pravidel. První část je možno získat jako patch do jádra (ať již vývojového - série 2.1, tak i stabilního - série 2.0). Program ipchains je dostupný ve zdrojové formě z domovské stránky IP Firewalling chains. To, že v systému je nainstalován IP chains, lze ověřit tak, že existuje soubor /proc/sys/net/ip_fwchains.

Cesta packetu počítačem

K porozumění systému IP chains je nutné vědět, jakým způsobem prochází packet počítačem (viz obrázek Cesta packetu počítačem).

[ schéma ]

Obrázek 2: Cesta packetu počítačem

  • Vznik packetu: Packet může buďto vzniknout činností lokálního procesu (pak je na něj aplikováno pravidlo output) nebo přijít ze sítě. Na takovýto příchozí packet jsou aplikovány dvě kontroly: kontrolní součet a kontrola na rozumnost některých hlaviček. Nevyhovující packety jsou rovnou zahozeny.

  • input: Toto je sada filtrovacích pravidel, aplikovaná na příchozí packety. Zde je možno packet přijmout (ACCEPT), zahodit DENY, odmítnout (REJECT) nebo přesměrovat (REDIRECT).

  • Demasquerade: Je-li packet odpovědí na předchozí masqueradovaný packet, přepíšou se odpovídajícím způsobem hlavičky a packet se pošle na výstup.

  • Routing: Směrovací kód v jádře nyní rozhodne, jestli je packet určený lokálnímu procesu (pak se doručí) nebo k přeposlání na jiný stroj.

  • forward: Další sada filtrovacích pravidel. Určuje, které packety se smějí forwardovat dál, případně u kterých se má provést přepis hlaviček (masquerading).

  • output: Lokálně vzniknuvší a forwardované packety jsou nakonec zkontrolovány výstupní sadou pravidel, která určí, jestli packety mohou opustit počítač.

V čem se liší IP chains?

V předchozím odstavci jsem popsal cestu packetu počítačem. Tato cesta je v podstatě stejná při použití klasického firewallingu (ipfwadm) i při použití IP chains. Kde je tedy rozdíl?

Klasický přístup definoval tři základní sady filtrovacích pravidel - vstupní, forwardovací a výstupní (plus čtvrtý typ - accounting). V systému IP chains může být takovýchto sad (v terminologii IP chains řetězů) libovolně mnoho a mohou na sebe navzájem odkazovat. Existují tři výchozí řetězce: input, output a forward. Jádro každým z těchto řetězců kontroluje, jestli packet smí projít dál na příslušném místě zmiňovaného obrázku. Dále existuje pět pseudořetězců ACCEPT, DENY, REJECT, REDIR a MASQ. Tyto se chovají jako běžné řetězce v tom smyslu, že mohou být odkazovány z jiných řetězců (například pokud řetězec forward odkáže všechny packety na řetězec DENY, znamená to zákaz forwardování přes tento počítač).

Logika práce IP chains je pak jasná: Pomocí programu ipchains podobně jako přes ipfwadm vytváříme filtrovací pravidla. Tak jako v ipfwadm mělo každé pravidlo typ podle toho, jestli akceptovalo nebo odmítalo packet, který mu odpovídal, spustí v IP chains každé pravidlo na packet, který mu odpovídá, nějaký jiný řetězec (ACCEPT, DENY nebo jiný). Výhoda IP chains je v tom, že nejsme odkázáni jen na standardní pseudořetězce, ale můžeme si vytvářet vlastní.

Příklad - třídy počítačů

Mějme síť, na které běží několik serverů a několik uživatelských stanic. Chceme povolit telnet, ssh a finger na servery, jakékoli spojení ze serverů ven, ale na stanice chceme povolit jen finger. Pomocí ipfwadm bychom museli pro každý počítač jednotlivě specifikovat příslušná práva. Pokud bychom se později rozhodli například povolit ssh i na stanice, museli bychom přidat tolik pravidel, jako je stanic.

Pomocí IP chains můžeme například nadefinovat řetězec stanice a řetězec servery, a příslušné packety v řetězci forward na tyto přeposílat, jdou-li na servery, na stanice nebo jinam. Případnou změnu pro celou třídu strojů pak můžeme jednoduše realizovat přidáním jediného pravidla do řetězce stanice nebo servery:

MYNET=1.2.3.0/255.255.255.0
# Definujeme pravidla pro servery:
ipchains -N servery
# Dovnitř pustíme pouze na port telnetu, ssh, fingeru ...
ipchains -A servery -d $MYNET telnet -p tcp -j ACCEPT
ipchains -A servery -d $MYNET ssh -p tcp -j ACCEPT
ipchains -A servery -d $MYNET finger -p tcp -j ACCEPT
# ... a zakážeme otvírání jakýchkoli jiných 
#     TCP spojení dovnitř
ipchains -A servery -d $MYNET -p tcp -y -j DENY
# zbytek TCP packetu povolíme:
ipchains -A servery -p tcp -j ACCEPT
# Povolíme ICMP oběma směry
ipchains -A servery -p icmp -j ACCEPT
# Zbytek zakážeme
ipchains -A forward -j DENY

# Definujeme pravidla pro stanice:
ipchains -N stanice
# Dovnitř pustíme pouze na port fingeru ...
ipchains -A stanice -d $MYNET finger -p tcp -j ACCEPT
# ... a zakážeme otvírání jakýchkoli jiných 
#     TCP spojení dovnitř
ipchains -A stanice -d $MYNET -p tcp -y -j DENY
# zbytek TCP packetu povolíme:
ipchains -A stanice -p tcp -j ACCEPT
# Povolíme ICMP oběma smery
ipchains -A stanice -p icmp -j ACCEPT
# Zbytek zakážeme
ipchains -A forward -j DENY

# Řetězec forward: definujeme servery ...
ipchains -A forward -s 1.2.3.1 -j servery
ipchains -A forward -d 1.2.3.1 -j servery
ipchains -A forward -s 1.2.3.6 -j servery
ipchains -A forward -d 1.2.3.6 -j servery
ipchains -A forward -s 1.2.3.8 -j servery
ipchains -A forward -d 1.2.3.8 -j servery

# ... a stanice ...
ipchains -A forward -s 1.2.3.2 -j stanice
ipchains -A forward -d 1.2.3.2 -j stanice
ipchains -A forward -s 1.2.3.129 -j stanice
ipchains -A forward -d 1.2.3.129 -j stanice
ipchains -A forward -s 1.2.3.123 -j stanice
ipchains -A forward -d 1.2.3.123 -j stanice

# ... a zakážeme zbytek.
ipchains -A forward -j DENY

Takto tedy máme oddělenou sadu pravidel pro servery a pro stanice, přičemž přidání další stanice nebo dalšího serveru je otázku přidání dvou pravidel do řetězce forward, povolení další TCP služby pro danou třídu počítačů obnáší jedno další pravidlo do řetězce servery nebo stanice.

Samozřejmě definování řetězců podle tříd počítačů není jedinou možností IP chains. Je možné mít například odděleně vstupní a výstupní řetězec, nebo třeba řetězce pro každý interface či protokol zvlášť.

Výhody IP chains

Hlavním přínosem IP chains je samozřejmě možnost definování vlastních řetězců. Celý systém je ale vylepšen i o mnoho dalších vlastností:

  • Podstatně širší možnost definování pravidel (téhož efektu lze dosáhnout s méně pravidly než u ipfwadm, jak jsme viděli v předchozím příkladě).
  • Účtování (accounting) integrováno do filtrovacích pravidel. Každé pravidlo v řetězci může mít svoje počítadlo.
  • 64-bitové hodnoty účtování i na 32-bitových systémech. Při použití ipfwadm může velmi brzo dojít k přetečení.
  • Je možné specifikovat třídu rozhraní (například ppp značí všechna rozhraní - ppp0, ppp1 atd.).
  • ICMP packety je možno filtrovat nejen na základě typu, ale i na základě podtypu (kódu).
  • Složitější účtování nebo filtrování je možno provádět též user-space démonem (pouze v kernelech 2.1).
  • Je možné logovat a účtovat i chybné packety.
  • Většina změn konfigurace firewallu je možná atomicky.
  • Rozhraní je možno použít i pro jiné protokoly než jen ICMP, UDP a TCP.
  • IP chains umožňuje i negativní pravidla (například všechny packety, které jdou z jiného zařízení než ppp0).
  • Je možno filtrovat i fragmenty IP packetů.
  • Lze specifikovat i interval portů (tedy například jedním pravidlem vybrat privilegované porty - 0-1023).

Odkazy:

  1. Linux Firewalling Chains
    http://www.adelaide.net.au/~rustcorp/ipfwchains/,
  2. Linux IPCHAINS-HOWTO
    http://www.adelaide.net.au/~rustcorp/ipfwchains/HOWTO.html.
*


- předchozí článek - následující článek - obsah -