Refusing probe traffic is the part everyone agrees on. Where you refuse decides whether your own numbers move at all. This is part one of a five-part series on scanner defence, written from our own logs rather than from theory.

Refuse probe traffic at the edge, but never challenge a client that cannot run JavaScript.

What this layer is

A CDN or WAF evaluates the request before it reaches your server, matching path fingerprints, user agents or reputation signals, and answers with a block or a challenge. Because the request never arrives, it never reaches your access log.

What our own numbers showed

In our own window: 71,191 requests, of which 40,263 were refused and 33,133 matched known scan paths; the top five probe paths were /v1/graphql (857), /api/graphql (845), /graphql (831), /api/config (814) and /actuator/loggers (533).

Refusing those requests at the origin did not reduce the count — by definition, because the count reads the origin's log. Moving the same refusal to the edge changed which layer answers: our probe paths now return a provider block page, and the origin-side counters are the ones that should fall.

What we run

  • Path families: credential files, framework endpoints and the scanner patterns our log actually showed.
  • Extensions we never serve: .php, .py, .yml, .bak, .sql.
  • Scraper user agents we previously refused at the origin, now refused one layer earlier.

Where we disagree with the textbook

The usual advice is to answer with a JavaScript challenge instead of a hard block. For a site whose purpose is being read and cited by AI answer engines, that is the wrong tool: retrieval crawlers do not run JavaScript, so a challenge is a block for exactly the clients we want. We tested this — requests identifying as GPTBot, Googlebot and ClaudeBot are served normally on this site. A challenge belongs on human-facing abuse (login attempts, form spam), not on probe paths.

The second disagreement is about reputation. Blocking by IP or ASN sounds precise; we classified our own traffic first and every top source address turned out to be a cloud range carrying both crawler and scanner traffic. Blocking those ranges would have removed readers along with noise. Path fingerprints do not have that problem.

How to verify

Sources: our own nginx access log and edge rules; RFC 9309 for crawler policy semantics (rfc-editor.org); Cloudflare's WAF custom rules (developers.cloudflare.com) and bot concepts (developers.cloudflare.com); Google's guidance on verifying requests from Google crawlers (developers.google.com); OWASP automated threats (owasp.org).

Does edge blocking stop the scanners?

It stops them reaching your server, which is the part you control. The attempts continue; they simply never arrive.

Why not challenge every suspicious request?

Because challenged clients that do not run JavaScript - including AI retrieval crawlers - are treated as failures. On a site that earns its traffic by being crawlable, that is self-harm.

Is a provider block the same as a 403?

No. A 403 comes from your server and appears in your log; a provider block answers before your server sees the request.

Related reading: Five Layers of Scanner Defence, Tested on Our Own Site · Layer 5: Closing the Loop in Public

More on this site: live signals · dated reports · how to verify us