Ett skrapertåg på Cloudflares kostnadsfria plan: vad som stoppade det och vad vi lämnade avstängt

Drift

En morgon slutade en av våra produktbeskrivningssidor att öppnas. Cloudflare visade besökare ett 524-fel, ursprungsservern tog två till sex minuter per sida, och inget varnade oss på ungefär tio timmar. Orsaken var en skrapare som gick via bostadsproxyer med cirka 225 förfrågningar i sekunden.

Tågets utformning

Varje sida renderades för varje förfrågan, så varje arbetarprocess köade hundratals renderingar och nådde sin CPU-gräns.

Varför begränsningar per adress inte hjälpte

En hastighetsbegränsning räknar förfrågningar per adress. Med en till tre förfrågningar från vardera av tusentals adresser kommer ingen enskild adress i närheten av en gräns. Att blockera länder hade blockerat våra besökare. Det skraparen inte kunde fejka billigt var att bete sig som en webbläsare som har varit på sajten tidigare.

Vid Cloudflares edge: tre kostnadsfria regler

Den kostnadsfria planen tillåter fem anpassade WAF-regler per zon. Vi använde tre, alla med en hanterad utmaning istället för ett block, så att en person som fångas av misstag kan klicka sig igenom:

Alla tre släpper igenom Cloudflares verifierade botar, användaragenter som namnger sig som robotar, våra egna adresser, API- och webhook-sökvägarna samt filer som inte är sidor. Två dagar senare pågick strömmen fortfarande: på en timme utmanade regeln för falska webbläsare fler än 10 000 förfrågningar. De 10 000 händelser Cloudflare returnerar per fråga kom från 9 627 adresser, ingen med fler än 4.

Vid ursprunget: en grind i appen

Den headless-halvan har fullständiga webbläsarheadrar, så kantreglarna fångar den inte ensam medan nödregeln är avstängd. I själva appen satte vi in en liten middleware framför sidrenderaren:

Under den första minuten avvisade grinden cirka 6 700 falska webbläsare och vände bort cirka 6 700 främlingar, medan den serverade främlingar cirka 9 sidor per sekund. Långsamma förfrågningar föll till noll, workrarnas CPU sjönk från deras gräns till 12 till 15 procent, och deras minne från 4 till 5 GB vardera till 0,65 GB.

Vad vi lämnade avstängt

Slutsatsen

En ström genom bostadsproxyer är lätt att upptäcka på vad den saknar: webbläsarfetch-headrar, cookies och Referers. Utmana det vid kanten, håll främlingar inom vad dina workers kan rendera, och se till att något utanför servern märker när en slutar öppnas. Night Watch paketerar alla tre: bevakningen, reglerna med en automatisk omkopplare för nödregeln, och grinden för Python-webbappar.

Uppdaterad: