IMQ + HTB a nefungujici filtry

Martin Cizek cizek na cmc.hopto.org
Středa Září 10 21:48:02 CEST 2003


On St, 2003-09-10 at 16:37, Ondrej Puzman wrote:
> Chyba byla v tomhle radku:
> > $IPTABLES -t mangle -A PREROUTING -i $INETIFACE -j IMQ --todev $IMQDEVNUM
> 
> spravne to ma byt:
> $IPTABLES -t mangle -A INPUT -i $INETIFACE -j IMQ --todev $IMQDEVNUM
> $IPTABLES -t mangle -A FORWARD -i $INETIFACE -j IMQ --todev $IMQDEVNUM

Stejny problem jsem pred casem resil, a jelikoz jsem podobnou radu
jako nize nenasel, pokusim se nastinit, co jsem zjistil. Doufam,
ze to nekomu pomuze, a za opravy/doplnujici informace budu vdecny.
Pisu na toto tema takove mensi HOWTO (v cestine) jakozto semestralni
praci, o vysledek se pak rad podelim.

Problem vyse uvedeneho reseni je, ze do IMQ nevstoupi pakety, ktere byly
oznaceny pravidlem v INPUT. IMQ vstupuje v cinnost u prichozich paketu
tesne pred NATem pro prichozi pakety, pokud jsou pred tim v tabulce
mangle, chainu PREROUTING oznaceny pro IMQ. (to, ze je to pred NATem,
je duvod, proc Vam to s puvodnim prikazem delalo problemy -
pakety v IMQ nesly rozlisit podle cilove adresy, neb ta jeste nebyla
deNATovana). Odchozi pakety (oznacene v tab. mangle pozdeji) pak vejdou
v IMQ, nez opusti box (ty v INPUTU jej pochopitelne uz neopusti).
Tedy do IMQ se takto dostanou pouze pakety smerujici do Vasi vnitrni
site (oznacene v mangle - FORWARD chainu), avsak ztracite moznost
policingu paketu urcenych pro stroj samotny.

Skutecne je tedy nutne shapovat na IMQ jeste pred routovacim
rozhodnutim. Reseni, jak rozlisit pakety podle cilovych adres
po deNATovani v momente, kdy toto jeste neprobehlo, jsem nasel
v matchovacim modulu "conntrack" pro iptables:
http://www.netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO-3.html#ss3.3
Tento modul umoznuje matchovat dle informaci v ip_conntrack (podobne
jako znamy modul "state", "conntrack" je rozsirenim "state"). Pakety
si podle puvodniho zdroje konexe oznacime ciselnou znackou (-j MARK)
a v IMQ je pak rozradime filtrem "fwmark".

priklad:
IP_PEPA=192.168.3.1
MARK_PEPA=1
iptables -t mangle -A PREROUTING -i $INETIFACE -m conntrack --ctorigsrc
$IP_PEPA -j MARK --set-mark $MARK_PEPA
# v pripade, ze Pepovi forwardujeme nejake porty, tez nasledujici radek:
iptables -t mangle -A PREROUTING -i $INETIFACE -m conntrack --ctreplsrc
$IP_PEPA -j MARK --set-mark $MARK_PEPA
# a oznacime paket pro IMQ
iptables -t mangle -A PREROUTING -i $INETIFACE -j IMQ --todev $IMQDEVNUM

Je zrejme, ze kdyby existoval filtr, ktery by se dokazal pro dany paket
podivat do prislusneho zaznamu v ip_conntrack, bylo by to mnohem 
jednodussi (pokud o takovem vite, dejte vedet).

Jinou (mene primou, za urcitych okolnosti vsak uzitecnou) moznosti je
pouzit target "CONNMARK", kterymi je mozno oznacit si konekse cisly,
ktere pak jdou zkopirovat do znacky paketu (jakou pouziva "mark" a
"MARK") a pri shapingu pak opet pouzit filtr "fwmark".
Bohuzel, moduly CONNMARK/connmark myslim jeste nejsou standardne
zarazeny do iptables, je nutne pouzit patch rucne.
Viz www.netfilter.org

-- 
Martin Cizek <cizek na cmc.hopto.org>



Další informace o konferenci Linux