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