[zorp-hu] TPROXY hibá k

Balazs Scheidler zorp-hu@lists.balabit.hu
Thu, 12 Jun 2003 19:04:47 +0200


On Thu, Jun 12, 2003 at 05:06:41PM +0200, Czakó Krisztián wrote:
> Hello,
> 
> A 2.0.2 Zorp néha kapcsolat hibával visszadobja a http kérést.
> Az alap szitu, hogy egy szerver zónát véd a zorp.
> Igen szép számú kérés érkezik. Általában 150-180 zorp thread fut
> egyszerre.
> Kernel 2.4.20+rsbac+tproxy. Debian woody.
> 
> Itt a log részlet, amikor ilyet csinál:
> 
> Jun 12 13:46:15 fw kernel: IP_TPROXY: socket already assigned, reuse=1,
> 5d92380a:d8ba, sr->faddr=799238c3:d9ba, flags=90005
> Jun 12 13:46:15 fw new_internet_http[16455]:
> (firewall@fw.hu/http:16957/http): Error in setsockopt(SOL_IP,
> IP_TPROXY_ASSIGN), netfilter-tproxy support required; fd='614',
> error='Invalid argument'
> Jun 12 13:46:15 fw new_internet_http[16455]:
> (firewall@fw.hu/http:16957/http): bind() failed; error='Invalid
> argument'
> Jun 12 13:46:15 fw new_internet_http[16455]:
> (firewall@fw.hu/http:16957/http): Server connection failure;
> server_address='AF_INET(1.2.3.4:8888)', server_zone='Zone(vedett,
> 1.2.3.0/24)', server_local='None'
> 
> Mit lehet tenni ezek elkerüléséért?

a kernel modul ezekben az esetekben ad EINVAL-t:

- ha a bindolt socket mar kapcsolodott (azaz nem frissen van nyitva)
- ha a setsockopt bemeno parametere rossz meretu
- ha a bindolt socket nem UDP/TCP
- ha a socket nincs autobindolva ill ez a bind nem fully qualified (azaz ip
  vagy a portszam 0)
- ha az autobindcim utkozes van (azaz ketszer ugyanahhoz az autobind cimhez
  akar idegencim hamisitast kerni)

ezek kozul az utolso kettot erzem elkepzelhetonek. hmm... most neztem meg a
kernel uzenetedet, ez alapjan egyertelmu, hogy az utolso eset jott be.

a flags alapjan az latszik, hogy a megtalalt korabbi bejegyzest szinten
kapcsolodasra hasznaltak fel.

valami race condition-t sejtek, ugyanis ez azt jelenti, hogy a TPROXY
jelenleg ket olyan socketet lat, aminek ugyanaz a local cime.

ez szerintem akkor kepzelheto el, ha
1) preemptiv kernel patched
2) vagy tobb procid van

mivel a TPROXY a socket lezarasanak vegen veszi ki a sajat hashebol a socket
cimet, ezert elofordulhat az, hogy a socket mar kikerult a TCP-s socket
hashbol, de meg nem torlodott a TPROXY-s hashbol, kozben viszont egy masik
thread mar bindolta (sikeresen, hiszen a TCP hashben mar nincs bent), es
probalt ra IP_TPROXY_ASSIGN-t hivni.

Ez mondjuk azert eleg nehezen valosul meg, plane mivel a socketek lezaras
utan egy darabig TIME_WAIT-ben maradnak (kb 2 perc)

raadasul az autobind sorban egymas utan veszi a portokat, tehat ehhez az is
kell, hogy az osszes port foglalt legyen a local port range tartomanyban.

ez szinte lehetetlen. a local port range defaultbol 32768-61000 (2.4-es
kernelen) itt most a 47832-es portrol van szo.

hany nyitott socketed van az autobind-ip -re bindolva?

-- 
Bazsi
PGP info: KeyID 9AF8D0A9 Fingerprint CD27 CFB0 802C 0944 9CFD 804E C82C 8EB1