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