En scraperflom på Cloudflares gratisplan: hva som stoppet den, og hva vi lot være slått på
Drift
En morgen sluttet en av våre produktbeskrivelsessider å åpne seg. Cloudflare viste besøkende en 524-feil, opprinnelsen tok to til seks minutter per side, og ingenting fortalte oss om det i omtrent ti timer. Årsaken var en scraper som gikk gjennom residential-proxies med omtrent 225 forespørsler i sekundet.
Flomens form
- Tusenvis av adresser, én til tre forespørsler hver. Hjemmebredbånd i USA, Spania, Frankrike, Brasil, Storbritannia og andre steder, den typen trafikk et residential proxy-nettverk leier ut.
- Chrome-brukeragenter på Mac, med versjonsnumre fra 103 til 151.
- Nesten aldri en cookie eller en Referer. Av 2 697 forespørsler vi tok ut på serveren, hadde 4 en cookie og 4 en Referer.
- To typer klienter. Omtrent halvparten sendte ingen
Sec-Fetch-*-headere og ingen klienthint: et skript med en kopiert brukeragent-streng. Den andre halvparten sendte fullstendige nettleserheadere: en headless nettleser.
Hver side ble gjengitt for hver forespørsel, så hver worker la seg i kø med hundrevis av gjengivelser og traff sin CPU-grense.
Hvorfor grenser per adresse ikke kunne hjelpe
En hastighetsbegrensning teller forespørsler per adresse. Med én til tre forespørsler fra hver av tusenvis av adresser, kommer ingen enkeltadresse i nærheten av en grense. Å blokkere land ville ha blokkert våre besøkende. Det scraperen ikke kunne forfalske billig, var å oppføre seg som en nettleser som har vært på nettstedet tidligere.
Ved Cloudflares kant: tre gratis regler
Gratisplanen tillater fem WAF-tilpassede regler per sone. Vi brukte tre, alle med en administrert utfordring i stedet for en blokkering, slik at en person som blir tatt ved en feil kan klikke seg gjennom:
- Falsk nettleser: en GET der brukeragenten inneholder
Chrome/og som ikke har noenSec-Fetch-Mode-header. Hver Chrome siden 2019 sender den. - Scraper-skyer: en sideforefråsel fra nettverkene til Alibaba, Tencent og Huawei Cloud, hvor mye av det vi utfordret kom fra.
- Nødsituasjon, av som standard: en GET uten cookie i det hele tatt og uten Referer. En person som har vært på nettstedet, eller som kommer via en lenke, går upåvirket forbi; en scraper som ikke lagrer cookies, møter en utfordring på hver forespørsel. Vi slår den på bare under en flom, fordi den også utfordrer noen som skriver adressen inn i en ny nettleser.
Alle tre slipper gjennom Cloudflares verifiserte botter, brukere som kaller seg robotter, våre egne adresser, API- og webhook-stier, og filer som ikke er sider. To dager senere fortsatte flommen: på én time utfordret regelen for falske nettlesere mer enn 10 000 forespørsler. De 10 000 hendelsene Cloudflare returnerer per spørring kom fra 9 627 adresser, ingen med mer enn 4.
Ved opprinnelsen: en port i appen
Den headless-halvdelen har fullstendige nettleseroverskrifter, så kantreglene alene fanger den ikke opp mens nødstilstanden er av. I selve appen setter vi inn en liten mellomvare foran siderendereren:
- en Chrome-brukeragent uten
Sec-Fetch-Modeeller klienthint får en 403 før noe arbeid utføres; - en fremmed, uten noen av våre informasjonskapsler og uten Referer, får bare sidevisning så lenge arbeideren har ledig kapasitet, ved noen få sider i sekundet. Over dette vises en 400-byte 503-side som setter en informasjonskapsel og laster på nytt etter to sekunder. En person får siden på andre forsøk; en skraping som ikke beholder informasjonskapsler får den aldri.
I det første minuttet nektet porten om lag 6 700 falske nettlesere og avviste om lag 6 700 fremmede, mens den betjente fremmede med om lag 9 sider i sekundet. Treg forespørsler falt til null, arbeiderne CPU falt fra grensen til 12 til 15 prosent, og minnet fra 4 til 5 GB hver til 0,65 GB.
Det vi lot være av
- Bot Fight Mode. Den utfordrer automatisert trafikk og kan ikke hoppes over med en egendefinert regel på Free-planen, og den fanget opp betalingsleverandørens webhooks.
- Under Attack-modus for hele sonen. Den sender alle besøkende, API-klienter og webhooks gjennom mellomlegget. Nødregelen gjør samme jobb bare for fremmedes sideforespørsler.
- Hastighetsbegrensningsregelen på Free-planen. Den teller per adresse, noe denne flommen aldri utløser.
- Blokking av AI-crawlere. Vi ønsker å bli funnet av AI-søkeassistenter, og disse crawlerne var ikke problemet.
Konklusjonen
En flom gjennom bolignettverk er lett å få øye på ved det som mangler: nettleserfetch-overskrifter, informasjonskapsler og Referer. Utfordre dette ved kanten, hold fremmede innenfor det arbeiderne dine kan render, og sørg for at noe utenfor serveren merker det når en side slutter å åpne. Night Watch pakker alle tre: overvåkeren, reglene med en automatisk bryter for nødstilstanden, og porten for Python-nettapper.