LinuxovΘ noviny | B°ezen 1998 | ||||||||||||||||||
| |||||||||||||||||||
V linuxovΘm jßd°e je vestav∞na pom∞rn∞ silnß a flexibilnφ podpora pro filtrovßnφ paket∙ (specißln∞ IP datagram∙, i kdy╛ je mo╛no filtrovat i jinΘ protokoly, nap°. IPX) zpracovßvan²ch sφ╗ov²m subsystΘmem jßdra. Filtrovßnφ je mo╛no provßd∞t ve t°ech r∙zn²ch fßzφch: bezprost°edn∞ po p°ijetφ datagramu ze sφt∞, b∞hem jeho p°esm∞rovßnφ do jinΘ sφt∞ a p°ed vyslßnφm datagramu do sφt∞. Pro aktivaci t∞chto funkcφ je t°eba zapnout volby Network firewalls a IP firewalling. Poznamenejme, ╛e nenφ nutnΘ, aby byl uzel nakonfigurovßn jako router (IP forwarding/gatewaying), i kdy╛ je to obvyklΘ. Pro protokol IP znßzor≥uje postavenφ jednotliv²ch filtr∙ (jsou oznaΦeny modrou barvou) vzhledem k ostatnφm komponentßm (v konkrΘtnφ konfiguraci nemusφ b²t n∞kterΘ p°φtomny) tento diagram:
![]() Datagram je po svΘm p°ijetφ n∞kter²m sφ╗ov²m rozhranφm zpracovßn vstupnφm filtrem (input). Pokud je jeho adresa lokßlnφ (nebo vstupnφ filtr na°izuje p°esm∞rovßnφ datagramu na lokßlnφ port, tzv. transparent proxying), je provedeno "odmaskovßnφ" cφlovΘ adresy-tj. pokud je v Φinnosti p°eklad adres (NAT, v Linuxu oznaΦovßno jako masquerade, tedy ma╣karßda). Pokud je pod cφlovou adresou datagramu skryta jinß adresa, je tato "odmaskovßna" a datagram je p°esm∞rovßn na svΘ skuteΦnΘ mφsto urΦenφ. Jinak je (pokud je to mo╛nΘ) doruΦen na p°φslu╣n² lokßlnφ port a p°evzat lokßln∞ be╛φcφm procesem. Pokud nenφ cφlovß adresa datagramu lokßlnφ (ani nemß dojφt k jeho p°esm∞rovßnφ na lokßlnφ port), je datagram sm∞rovßn a zkontrolovßn p°edßvacφm filtrem (forward). Pokud to filtr vy╛aduje, je provedeno "maskovßnφ" zdrojovΘ adresy datagramu. V╣echny datagramy, kterΘ majφ b²t vyslßny do sφt∞, jsou je╣t∞ p°ed sv²m p°edßnφm sφ╗ovΘmu rozhranφ zkontrolovßny v²stupnφm filtrem (output). JednotlivΘ filtry popsanΘ v p°edchozφm textu jsou vyvolßvßny v procedurßch sφ╗ov²ch protokol∙ (pokud filtrovßnφ podporujφ) pomocφ nßsledujφcφch funkcφ:
int call_fw_firewall(int pf, \ struct device *dev, void *phdr, void *arg); int call_in_firewall(int pf, \ struct device *dev, void *phdr, void *arg); int call_out_firewall(int pf, \ struct device *dev, void *phdr, void *arg);kde parametr pf urΦuje sφ╗ov² protokol (nap°. PF_INET), dev urΦuje za°φzenφ, odkud byl datagram p°ijat, pro vstupnφ filtr resp. za°φzenφ, kam bude datagram odeslßn, pro p°edßvacφ a v²stupnφ filtr, phdr ukazuje na zaΦßtek dat v datagramu (z pohledu sφ╗ovΘho protokolu) a arg je pomocn² parametr (kter² je nap°. u vstupnφch filtr∙ pro protokol IP pou╛it pro p°esm∞rovßnφ na lokßlnφ porty). Ka╛dß z t∞chto funkcφ vracφ jednu z nßsledujφcφch hodnot:
Pro protokol IP mß hodnota FW_REDIRECT smysl pouze u vstupnφch filtr∙ a hodnota FW_MASQUERADE pouze u p°edßvacφch filtr∙. Protokol IPX tyto hodnoty nerozeznßvß v∙bec. Pro ka╛d² protokol je definovßna prioritnφ fronta filtr∙, kterΘ jsou popsßny strukturou firewall_ops (viz v²pis Struktura firewall_ops).
V²pis 1: Struktura firewall_ops Funkce call_..._firewall vyvolßvajφ odpovφdajφcφ metody zaregistrovan²ch filtr∙ podle jejich priority (od nejmen╣φ k nejv∞t╣φ), dokud nenφ hodnota vrßcenß metodou r∙znß od FW_SKIP. Pokud ani jeden filtr ve front∞ nerozhodne o osudu datagramu, je vrßcena p°eddefinovanß hodnota (FW_ACCEPT). V╣echny zmφn∞nΘ definice je mo╛no nalΘzt v souboru include/linux/firewall.h. Standardnφ IP filtr a p°φkaz ipfwadmP°φmo ve standardnφm linuxovΘm jad°e (v souboru net/ipv4/ipfw.c) je mo╛no nalΘzt jednoduchou implementaci bezstavovΘho filtru pro protokol IP. K≤d pochßzφ z BSD UNIXu verze 4.4 (a byl portovßn do Linuxu je╣t∞ v dob∞, kdy v²╣e popsanΘ obecnΘ mechanismy je╣t∞ neexistovaly).Ka╛d² filtr je definovßn jako seznam pravidel (rules), kterß se sklßdajφ z podmφnky (urΦujφcφ, kdy je pravidlo pou╛ito) a akce (urΦujφcφ, jak mß b²t s datagramem nalo╛eno), a jednΘ implicitnφ akce (default policy). Pro ka╛d² datagram je seznam pravidel prochßzen dokud nenφ nalezeno pravidlo, jeho╛ podmφnka je spln∞na, a pak je pou╛ita jeho direktiva. Pokud nenφ ╛ßdnΘ takovΘ pravidlo nalezeno, je pou╛ita implicitnφ akce. Podmφnka je tvo°ena (v zßvorkßch jsou uvedeny odpovφdajφcφ parametry p°φkazu ipfwadm, o kterΘm bude °eΦ pozd∞ji):
Explicitnφ akci pak tvo°φ:
Implicitnφ akce se sklßdß pouze ze zp∙sobu, jak²m mß b²t s datagramem nalo╛eno, tj. zda mß b²t datagram akceptovßn nebo zamφtnut (s oznßmenφm nebo bez n∞j). Mimoto je mo╛no definovat tzv. ·Φtovacφ pravidla (pokud je v konfiguraci jßdra zapnuto IP accounting), kterß majφ stejnΘ podmφnky, ale ╛ßdnΘ direktivy. ┌Φtovacφ pravidla jsou dvou druh∙: vstupnφ a v²stupnφ. Pro jejich vyvolßvßnφ nenφ pou╛it mechanismus filtr∙, nebo╗ jsou explicitn∞ volßna ze subsystΘmu protokolu IP. Se seznamy pravidel je mo╛no pracovat pomocφ systΘmov²ch volßnφ popsan²ch v manußlovΘ strßnce ipfw(4). To ov╣em nenφ p°φli╣ praktickΘ pro b∞╛nΘ pou╛itφ, a proto existuje program ipfwadm, kter² tyto funkce zp°φstup≥uje. Pomocφ tohoto programu je mo╛no konfigurovat filtrovacφ a ·Φtovacφ pravidla, zji╣╗ovat ·daje o nakonfigurovan²ch pravidlech a testovat je. Syntaxe v╣ech jeho parametr∙ je detailn∞ popsßna v manußlovΘ strßnce ipfwadm(8), struΦn² p°ehled je mo╛no zφskat zadßnφm p°φkazu ipfwadm -h. NutnΘ minimum p°edstavujφ nßsledujφcφ varianty:
ipfwadm filtr -p v²sledek ipfwadm filtr -a v²sledek parametry... ipfwadm filtr -f ipfwadm filtr -l Prvnφ varianta nastavuje implicitnφ akci pro zadan² filtr. Filtr je -I pro vstupnφ filtr, -O pro v²stupnφ a -F pro p°edßvacφ. V²sledek je accept pro p°ijetφ, deny pro odmφtnutφ, nebo reject pro odmφtnutφ se zaslßnφm oznßmenφ. Druhß varianta p°idßvß na konec seznamu novΘ pravidlo, jeho╛ podmφnka a dal╣φ atributy akce jsou popsßny parametry. Nahrazenφm volby -a je mo╛no pravidla p°idßvat na zaΦßtek seznamu (-i) nebo ze seznamu odebφrat (-d). T°etφ varianta zcela vyprßzdnφ seznam zadanΘho filtru. Poslednφ varianta vypφ╣e obsah zadanΘho filtru, spolu se statistikou pou╛itφ jednotliv²ch pravidel (pomocφ voleb -l a -e je mo╛no zφskat detailn∞j╣φ informace). Nynφ si ukß╛eme n∞kolik p°φklad∙. Trivißlnφ vstupnφ filtrTento p°φklad ukazuje, jak inicializovat nejjednodu╣╣φ vstupnφ filtr, kter² zabra≥uje podvr╛enφ lokßlnφ sφ╗ovΘ adresy (address spoofing). P°edpoklßdejme, ╛e poΦφtaΦ mß dv∞ sφ╗ovß rozhranφ: lo s adresou 127.0.0.1 a eth0 s adresou 1.2.3.4.
ipfwadm -I -p deny ipfwadm -I -f ipfwadm -I -a accept -S 127.0.0.0/8 -W lo ipfwadm -I -a accept -S 1.2.3.4 -W lo ipfwadm -I -a deny -S 127.0.0.0/8 ipfwadm -I -a deny -S 1.2.3.4 ipfwadm -I -p accept Vstupnφ filtr je inicializovßn pravidly, kterß zabra≥ujφ, aby vyjmenovanΘ zdrojovΘ adresy byly pou╛ity na jinΘm za°φzenφ ne╛ je loopback. Nastavenφ implicitnφ direktivy na zaΦßtku a na konci demonstruje o╣et°enφ nestabilnφho stavu v pr∙b∞hu inicializace, kdy by mohlo b²t mo╛no filtr obejφt. V╣echna zamφtnutφ jsou definovßna jako deny, nebo╗ zdrojovß adresa nenφ platnß, a proto nemß smysl na ni nic posφlat. Slo╛it∞j╣φ kontrola adresP°edpoklßdejme, ╛e propojujeme sφ╗ 1.2.3.0/8 s Internetem. Chceme-li zajistit, aby z vn∞j╣ku nebylo mo╛no podvrhnout vnit°nφ adresy a naopak. TakΘ chceme odfiltrovat neplatnΘ adresy. Lokßlnφ sφ╗ je zapojena na eth0, ven sm∞°uje ppp0.
ipfwadm -I deny -b -S 10.0.0.0/8 -o ipfwadm -I deny -b -S 172.16.0.0/12 -o ipfwadm -I deny -b -S 192.168.0.0/16 -o ipfwadm -I deny -b -S 0.0.0.0 -o ipfwadm -I deny -b -S 255.255.255.255 -o ipfwadm -I accept -S 1.2.3.0/8 -W eth0 ipfwadm -I deny -W eth0 -o ipfwadm -I deny -S 1.2.3.0/8 -o Prvnφ blok filtruje privßtnφ a neplatnΘ IP adresy, a to jak zdrojovΘ, tak cφlovΘ. Druh² blok zaji╣╗uje, ╛e adresy 1.2.3.0/8 mohou pou╛φvat pouze poΦφtaΦe v lokßlnφ sφti, p°iΦem╛ jim nenφ dovoleno pou╛φvat jinΘ adresy. V²skyt ne╛ßdoucφch adres je zaznamenßn do logu. Omezenφ p°φstupu na urΦitΘ adresy a protokolyChceme umo╛nit, aby poΦφtaΦe z vnit°nφ sφt∞ mohly navazovat TCP spojenφ bez omezenφ, ale v opaΦnΘm sm∞ru je dovolen pouze p°φstup na porty 100 a 101 na adrese 1.2.3.4. Je povoleno pou╛itφ p°φkazu ping bez omezenφ. Nic jinΘho povoleno nenφ.
ipfwadm -F accept -P tcp -k -D 1.2.3.4 100 101 ipfwadm -F accept -P tcp -k -S 1.2.3.0/8 ipfwadm -F accept -P tcp -y ipfwadm -F accept -P icmp -S 0.0.0.0/0 0 8 ipfwadm -F -p reject Pravidla jsou v tΘto ukßzce umφst∞na do p°edßvacφho filtru, tak╛e ovliv≥ujφ komunikaci mezi vnit°nφ sφtφ a vn∞j╣kem, ale neomezujφ mo╛nosti samotnΘho firewallu a proces∙ na n∞m be╛φcφch (co╛ m∙╛e-ale nemusφ-b²t ╛ßdoucφ). Prvnφ dv∞ pravidla povolujφ zahajovat TCP spojenφ, pokud je cφlem jeden z povolen²ch port∙ na poΦφtaΦi 1.2.3.4 nebo zdroj le╛φ ve vnit°nφ sφti (p°edpoklßdß se, ╛e ji╛ byla uΦin∞na opat°enφ proti podvr╛en²m adresßm). T°etφ pravidlo povoluje neomezen² provoz pro ji╛ zahßjenß spojenφ. ╚tvrtΘ pravidlo povoluje pr∙chod zprßv ECHO (8) a ECHO REPLY (0) protokolu ICMP (v praxi by bylo vhodn∞j╣φ mΘn∞ restriktivnφ pravidlo). Nakonec je nastavena implicitnφ akce na odmφtnutφ datagramu, Φili v╣echno, co dosud nebylo povoleno, je zakßzßno. P°eklad adres a p°esm∞rovßnφ provozu na lokßlnφ portMßme lokßlnφ sφ╗ s adresou 192.168.5.0/8 (pozor, zm∞na!) a chceme poΦφtaΦ∙m na nφ umo╛nit komunikaci s Internetem pomocφ p°ekladu adres. Zßrove≥ chceme v╣echna spojenφ z lokßlnφ sφt∞ sm∞rovanß na port 80 p°esm∞rovat na lokßln∞ b∞╛φcφ HTTP proxy (takov², kter² to podporuje - nap°. squid) poslouchajφcφ na portu 1234.
ipfwadm -I accept -P tcp -D 0.0.0.0/0 80 -W eth0 -r 1234 ipfwadm -F accept -S 192.168.5.0/8 -m ipfwadm -M -s 120 60 120 Prvnφ pravidlo "odchytßvß" spojenφ z lokßlnφ sφt∞ na port 80 na libovolnΘ adrese a p°esm∞rovßvß je na lokßlnφ port 1234. DruhΘ pravidlo zaji╣╗uje p°eklad privßtnφch adres z lokßlnφ sφt∞. T°etφ pravidlo demonstruje nastavenφ Φasov²ch parametr∙ "ma╣karßdy" (pro zvlß╣t∞ pomalΘ spojenφ). Testovßnφ filtruProgram ipfwadm je takΘ mo╛no pou╛φt pro ov∞°enφ, zda filtr akceptuje, Φi odmφtne urΦit² datagram. Je nutno uvΘst v╣echny parametry, vΦetn∞ adresy sφ╗ovΘho rozhranφ. Nßsledujφcφ p°φkaz ov∞°φ, zda je (z hlediska vstupnφho filtru) p°φpustnΘ zahßjit TCP spojenφ z adresy 1.2.6.7, portu 1234 na adresu 1.2.6.7, port 7, p°iΦem╛ datagram je p°ijat p°es rozhranφ eth0.
ipfwadm -I -c -P tcp -S 1.2.3.4 1234 \ -D 1.2.6.7 7 -k -V 1.2.3.1 -W eth0 Pokud to mo╛nΘ je, pak program odpovφ:
packet accepted Alternativnφ filtryV²╣e popsanß implementace filtr∙ nenφ jedinß mo╛nß. K dispozici je vylep╣enß varianta pod nßzvem IP firewall chains http://www.adelaide.net.au/~rustcorp/ipfwchains, kterß p°edev╣φm umφ lΘpe pracovat s fragmentovan²mi datagramy, zavßdφ n∞kterΘ novΘ druhy podmφnek, umo╛≥uje hierarchicky strukturovat seznamy pravidel a dovoluje provßd∞t zm∞ny seznam∙ pravidel atomicky. Modul je koncipovßn jako nßhrada standarnφho filtru. Obsa╛ena je obdoba programu ipfwadm pod nßzvem ipchains.Naprosto nezßvislou implementaci filtru pro protokol IP p°edstavuje sf Firewall ftp://ftp.switch.ch/software/sources/network/sf. K hlavnφm rys∙m pat°φ sledovßnφ stavu komunikaΦnφch protokol∙ (nap°. TCP), schopnost dynamickΘho vytvß°enφ pravidel na zßklad∞ jin²ch pravidel, bohat² konfiguraΦnφ jazyk s ╣irok²m repertoßrem podmφnek a akcφ a mo╛nost efektivnφ rekonfigurace za b∞hu. Na druhou stranu ale nenφ (ve verzi 0.2.9) podporovßn p°eklad adres ani p°esm∞rovßnφ na lokßlnφ port.
Pro Linux je tΘ╛ dostupn² multiplatformnφ balφk IP Filter
http://cheops.anu.edu.au/~avalon/.
K jeho zajφmav²m vlastnostem pat°φ podpora pro detailnφ kontrolu obsahu
hlaviΦek datagram∙, sledovßnφ stavu komunikaΦnφch protokol∙,
sdru╛ovßnφ pravidel do skupin a podpora pro zachycovßnφ podez°el²ch
datagram∙ a jejich zpracovßnφ externφm procesem.
|