IPFW - pravidla
Martin Machacek
mm at i.cz
Wed Jun 14 17:45:33 CEST 2000
On 14-Jun-00 Aleš Kotmel wrote:
> Při definování filtrovacích pravidel mohu dle své potřeby definovat, které
> typy paketů a kam mohou odejít, např.:
>
> allow tcp from 195.250.137.147 to any 80 out xmit fxp0
Je to ještě obecnější. Filtrovacími pravidly říkám, které pakety přes svůj
počítač pustím a které ne. Rozhodnutí mohu řídit podle řady parametrů a jedním
z nich je i síťové rozhraní, přes které byl paket přijat nebo přes které se
bude vysílat. Filtrační pravidla se vyhodnocují hned po přijetí a znovu
těsně před vysláním.
> Ale jak pak má vypadat pravidlo, kterým chci za zcela stejných podmínek
> rozhodnout, jaké pakety přijmu ?
Např. symetrické k výše uvedenému pravidlu je:
allow tcp from any 80 to 195.250.137.147 recv fxp0
Toto pravidlo jste i v konfiguraci měl. Jenže, pravidla se vyhodnocují v
pořadí, ve kterém jsou uvedena (pominuli direktivu skipto) a první pravidlo,
jehož podmínka vyhoví se uplatní a dál se již nevyhodnocuje, s vyjímkou divert
pravidel, kdy se celá báze pravidel projede znovu, ale již bez divert
pravidel. Ve Vaší konfiguraci pravidlu pro příjem TCP paketů z portu 80
předcházelo pravidlo pro divert paketů do natd. Natd s pakety dělá to, že v
nich (dle aktuálního stavu překladové tabulky) přepisuje zdrojové resp. cílové
adresy a (pokud se přepis podařil = byl záznam v překladové tabulce), tak je
opět vrací jádru systému. To právě provede znovuvyhodnocení filtrovacích
pravidel. Takže, co se ve Vaší konfiguraci děje, řekněme pro TCP spojení na
port 80 na adresu vně Vaší chráněné sítě. Dejme tomu, že iniciátorem spojení je
stroj s adresou 192.168.1.14 a cílem (serverem) je 195.113.19.84.
1) klient uvnitř Vaší sítě vyšle požadavek na navázání spojení, ted paket s
src=192.168.1.14 port=1030 dst=195.113.19.84 port=80
2) paket dorazí na firewall, kde prvním odpovídajícím pravidlem (ve Vaší
původní konfiguraci) bylo divert pravidlo - tudíž paket je předán natd
3) natd přepíše zdrojovou adresu (a potenciálně i zdrojový port) na vnější
adresu Vašeho firewallu, tedy vznikne paket:
src=195.250.137.147 port=1030 dst=195.113.19.84 port=80
Zároveň si natd poznamená, že v příchozích paketech z adresy 195.113.19.84
portu 80 na adresu 195.250.137.147 port 1030 má přepsat cílovou adresu na
192.168.1.14
4) znovu se vyhodnotí báze pravidel, tentokrát již bez divert pravidel a prvním
vyhovujícím pravidlem bude pravidlo
allow tcp from 195.250.137.147 to any 80 out xmit fxp0
a tudíž paket je povolen a vyslán ven přes rozhraní fxp0 (rozhraní se ještě
předtím zjistí z routovací tabulky)
5) server 195.113.19.84 odpoví a tedy k firewallu přijde paket
src=195.113.19.84 port=80 dst=195.250.137.147 port=1030
6) jako první se opět uplatní divert pravidlo a paket je tedy předán natd
7) natd se podívá do aktuální překladové tabulky a zjistí, že má přepsat
cílovou adresu na 192.168.1.14 a taky to udělá a vznikne tak paket
src=195.113.19.84 port=80 dst=192.168.1.14 port=1030
a ten předá zpátky jádru
8) znovu se vyhodnotí báze pravidel (opět bez divert pravidel) a první
vyhovující pravidlo bude:
allow log logamount 100 tcp from any to any
Pravidlo:
allow tcp from any 80 to 195.250.137.147 recv fxp0
nevyhovuje, protože nesedí cílová adresa
9) paket je vyslán dále přes rozhraní fxp1 (na což se přislo z routovací
tabulky) a zároveň je zapsán záznam do logu
Výše uvedený popis je trošku zjednodušený, protože jsem (čistě z
lenosti) vynechal druhý průchod paket filtrem tesně před odeslání. Pro
ilustraci v čem je Váš problém to ani není podstatné.
> Pravidlo:
>
> allow log logamount 100 tcp from any to any
>
> mi rozhodně takovou možnost nedává ....
Samozřejmě, že ne. To jenom říká, že všechny TCP pakety odkudkoliv kamkoliv jsou
povolené a má se o nich udělat zázanm do logu, avšak maximálně stokrát. V daném
kontextu toto pravidlo zajistilo, že TCP pakety již prošlé překladem byly
povoleny.
> Přiznám se, že vašemu výkladu zcela nerozumím. Při odchodu jasně řeknu jaké
> pakety mohou odejít, ale při příchodu akceptuji úplně všechny????
Neakceptujete všechny, ale pouze ty, pro které je záznam v překladové tabulce
natd. Pokud totiž propaket není záznam, tak se již nevrátí jádru a natd ho
prostě zahodí. Záznamy v překladové tabulce natd vznikají (pokud je tesy
explicitně nezkonfigurujete) POUZE na základě komunikace zevnitř. To kde je
vnitřek a kde vnějšek se říká pomocí identifikace síťového rozhraní na kterém
se má překlad provádět v konfiguraci natd (parametr -n). Vše je popsáno v
mauálové stránce pro natd a taktéž ve FreeBSD Handbook, viz:
http://www.freebsd.org/handbook/firewalls.html
> Tomu nerozumím.
Doporučuji studium odpovídající literatury.
> Děkuji za případnou odpověď.
Rádo se stalo,
Martin
---
[PGP KeyID F3F409C4]
More information about the Users-l
mailing list