ipfw connect throttle

Sziasztok!

Szeretnék valami programot írni arra, hogy ha X helyről túl sok kérés érkezik egyszerre és leterheli a szervert, akkor valamilyen módon csökkenteném a terhelést. Automatikusan.

Konkrétan arról van szó, hogy fut a web szerver, és időnként bejönnek robotok amik 10 IP-ről másodpercenként 10 kérést csinálnak, és nagyon terhelik a gépet. Ami a felhasználhatóság rovására megy. Nem szeretném letiltani őket, mert annak káros hatása lenne (keresőmotor kizárja a keresésből mert "nem elérhető"). Viszont azt sem szeretném, hogy a normál felhasználók szívjanak miatta. Mivel nem keep-alive-oznak ezért a bandwidth throttle nem használható. Általában egy IP-ről egyszerre csak egy kapcsolódás van, ezért a TCP queue méret változtatása se segít. Valami olyan működést szeretnék, hogy ha kapcsolódik akkor egy megadott ideig várakoztatja a tűzfal mielőtt tovább engedi a csomagot. Ez nyilván csak akkor működik normálisan, ha egy IP-ről csak egy TCP setup érkezik és a küldő szép türelmesen megvárja a választ. De ezek a robotok pont ilyenek. Szóval jön a TCP setup, a tűzfal megfogja a csomagot egy időre, és utána tovább engedi. A várakoztatás idő az elején nulla, de egy log analyzer automatikusan állítja ha kell. Ha mondjuk az utolsó 20 másodpercben volt legalább 30 kérés, akkor a várakoztatási időt beállítja 1 másodpercre. A "normál" felhasználók így nem vesznek észre semmi lassulást, a robotok meg pont annyit, hogy a gép jobb reakció idővel tudja kiszolgálni a normál felhasználókat.

Ez lenne az elmélet. Viszont a gyakorlatot nem tudom. ipfw-ben csak a bandwidth limitert ismerem, nem tudok olyat hogy "kapcsolat kiépítés késleltetése" szabály. Persze meg lehetne oldani mással is, nem csak tűzfallal. Ha async szerver lenne akkor egyszerű lenne a szerverben implementálni. Ez a web szerver egy apache, ami multi threaded. Esetleg van erre apache modul?

Hozzászólások