Vybrane stati ze sitoveho stacku

Dan Lukes dan at obluda.cz
Sun Jan 31 13:36:31 CET 2010


On 01/31/10 11:42, Miroslav Lachman:
> Myslim, ze to bylo perfektne srozumitelne i bez oblacku. Minimalne pro
> me to bylo velmi zajimave. Jen mi v tom nejak chybi hook pro PF (jelikoz
> jsem uzivatelem PF ;]), vidim tam jen hooky pro IPFW a IPFilter.

Ja jsem to nedobre oznacil a proto to srozumitelne nebylo.

To, co bylo popsano jako "hook pro ipfilter" se asi lepe melo jmenovat 
"hook pro pfil".

To je misto, kde jsou pripojene vsechny registrovatelne packet-filtry.

Hook specificky pro ipfw tam je, ale jen na L2 - tam jiny filtr nepusobi.

Dobre, ten hook pro pfil jeste teda rozepisu.

> Skoda, ze takovych podobnych "strucnych" popisu, co se jak v systemu
> odehrava, neni na netu vic.

Chapu, ze je to velmi prijemne mit "po kupe" - a ze se takhle na to 
podiva i nekdo, koho vec zajima jen "ze zvedavosti" a zrovna tu znalost 
bezpodminecne nutne nepotrebuje.

Na druhou stranu, je otazka, jak vysokou "pridanou hodnotu" ma podobny 
popis vuci tomu, ze se na to podivas rovnou do zdrojaku. Kter jsou navic 
vzdy aktualni, zatimco ten strucny popis co jsem dodal ja byl ze 7.2 a 
nejenze mozna neplati pro 6.x, ale treba neni aktualni ani pro 8.x ...

  ========================================

Jak tedy funguje to filtrovani.

Na L2 funguje jediny filtr, a to je ipfw. K tomu neni celkem co dodat.

Na L3 ma FreeBSD pripraveny genericky zaklad. Ma centralne vedeny seznam 
seznamu filtru. Seznam seznamu proto, ze zde mame ruzne tridy filtru a v 
ramci jedne tridy pak muze existovat nekolik filtru, ktere vsechny maji 
zajem dany provoz filtrovat.

V teto chvili (a na verzi 7.2) je realne pouziva jediny typ - 
PFIL_TYPE_AF a dve ruzne AF: AF_INET a AF_INET6

Jinymi slovy - mame nekolik (realne dva) seznamu filtru. Jeden se 
jmenuje inet_pfil_hook a druhy inet6_pfil_hook

Filtry se pak registruji do jednoho nebo vice seznamu. Samotny filtr 
registruje zvlast vstupni bod pro filtrovani "IN" a pro filtrovani "OUT" 
(muze ale registrovat i jen jeden z nich). Do seznamu registrovanych IN 
filtru se novy vklada na zacatek seznamu, u OUT filtru pak na konec.

Ve vhodnem miste, kde je treba filtrovat, se zavola phil_run_hooks (v 
mem popisu je to prave to misto, kde je napsano "hook pro ipfilter"), 
kteremu se krome paketu a dalsich informaci predava take konkretni 
seznam jehoz filtry maji byt spusteny. Spousteji se podle poradi v jakem 
jsou ve fronte, to znamena, ze v pripade IN se k paketu dostanou nejprve 
naposled registrvane filtry zatimco u OUT jsou prvni ty sluzebne nejstarsi.

Retezec spousteni se prerusi a dalsi filtr v seznamu uz se nespousti pokud:
a) filtr paket pohlti
b) volana filtrovaci funkce vratila nenulovou navratovou hodnotu (chyba)

Celkovym vysledkem volani seznamu filtru je navratova hodnota posledni 
volane filtrovaci funkce a puvodni pripadne modifikovany paket, pripadne 
paket "zadny" pokud byl filtrovanim pohlcen.

Zbyva vyresit jake filtry se registruji a v jakem poradi. A to uz je 
jednoduche. Grep mi poseptal, ze:

DECLARE_MODULE(ipfilter, ipfiltermod, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY);
DECLARE_MODULE(pf, pf_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_FIRST);
DECLARE_MODULE(ipfw, ipfwmod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY 
- 256);

Jelikoz:
SI_SUB_PROTO_DOMAIN<SI_SUB_PROTO_IFATTACHDOMAIN
a pri rovnosti pak
SI_ORDER_FIRST<SI_ORDER_ANY - 256

plati, ze poradi registrace je ipfilter-pf-ipfw a v tomto poradi filtry 
prochazi OUT pakety. IN pakety prochazeji v poradi opacnem.

Toz tak.

						Dan


More information about the Users-l mailing list