[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