[zorp-hu] tproxy 4.1.0 + iptables szabalyok + zorp 3.1
Balazs Scheidler
bazsi at balabit.hu
2009. Júl. 30., Cs, 10:18:05 CEST
On Tue, 2009-07-28 at 16:56 +0200, Kosa Attila wrote:
> Hello!
> Valaki meg tudna szanni, es megmondana, hogy melyik doksit
> kellene elolvasnom ahhoz, hogy legalabb nyomokban megprobalhassam
> megerteni az uj mukodest? A tproxy.txt fajlt hiaba olvasom, nem
> igazan ertem hogyan is kellene mukodnie...
>
> Ezt meg ertem is...
> # ip rule add fwmark 1 lookup 100
> De ezt mar nem annyira. Miert 0.0.0.0/0 es miert "lo"?
> # ip route add local 0.0.0.0/0 dev lo table 100
ez kenyszeriti ki, hogy az 1-el megmarkolt csomagok a lokalis IP
stackhez menjenek IP cimtol fuggetlenul.
Amugy itt a "local" a kulcsszo, ld. route type-ok:
ip route help:
TYPE := [ unicast | local | broadcast | multicast | throw |
unreachable | prohibit | blackhole | nat ]
a local azt jelenti, hogy a lokalis stacknek menjenek a csomagok.
>
> Ez csak siman letrehozza a DIVERT chain-t.
> # iptables -t mangle -N DIVERT
> Ez beletolja a tcp forgalmat a DIVERT chain-be.
> # iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
marmint azokat a forgalmakat, amire az "-m socket" matchel. ami arra
matchel, amihez van lokalis socket.
> Ez megjeloli a DIVERT chain forgalmat. De miert van ketto is
> belole a doksiban?
> # iptables -t mangle -A DIVERT -j MARK --set-xmark 0x1/0xffffffff
> # iptables -t mangle -A DIVERT -j MARK --set-mark 1
ha a mark-ot bitenkent akarod allokalni (aminek azert lehet ertelme),
akkor az elsot hasznalod.
ha a teljes markot csak erre hasznalod, akkor eleg a masodik.
> Ez csak engedelyezi a DIVERT forgalmat.
> # iptables -t mangle -A DIVERT -j ACCEPT
igen, miutan ratette a markot.
>
> Ez a 80-as portra tarto forgalmat feltolja az 50080-as portra.
> # iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY \
> --tproxy-mark 0x1/0x1 --on-port 50080
lookupolja az 50080-as portot azon az IP cimen, ahonnan az aktualis
csomag eppen erkezik. (ez ugyanaz a mukodes, mint eddig), es ha ott van
tproxy-s socket, akkor bebillenti az 1-es markot.
>
> Amit nem ertek:
> - Ebbol hogyan derul ki, hogy melyik interfeszre kell bind-olni a
> zorp-ot?
oda, ahova eddig. a TPROXY target a bejovo interface elso IP cimet
hasznalja lookuphoz.
> - Hogyan jut el a forgalom a zorp-hoz? Ugyanis a fentieket
> megcsinalva nem kerul fel...
a Zorpnak hallgatoznia kell a fenti porton, es be kell billentenie az
IP_TRANSPARENT setsockopt-ot. strace-ben nezd meg, hogy ezt megteszi-e.
milyen zorp verzio? most megneztem a 3.1.15c-ben benne van a szukseges
kod:
static gint
z_do_tp40_bind(gint fd, struct sockaddr *sa, socklen_t salen, guint32 sock_flags)
{
gint on = 1, res;
z_enter();
if (sock_flags & ZSF_TRANSPARENT || sock_flags & ZSF_MARK_TPROXY)
{
if (setsockopt(fd, SOL_IP, IP_TRANSPARENT, &on, sizeof(on)) < 0)
setsockopt(fd, SOL_IP, IP_FREEBIND, &on, sizeof(on));
}
res = z_do_ll_bind(fd, sa, salen, sock_flags);
z_return(res);
}
itt az IP_TRANSPARENT a lenyeg.
> - Ha kettonel tobb halokartyam van, akkor regebben tobb
> interfeszre is bindolhattam ugyanazon portra (eth0 - 50080,
> eth1 - 50080 stb.) Ezt most hogy tudom elkovetni?
ugyanugy.
--
Bazsi
További információk a(z) zorp-hu levelezőlistáról