Ability to block abusive clients (IP/CIDR + user-agent) from the economy-explorer web tier, so a repeat of the Blockantir scrape can be cut off without taking the site offline.
2026-07-16 → 07-20 a scraper (Blockantir-BalanceCollector/1.0, IP 136.107.101.57) made ~3.25M unauthenticated requests (~10 req/s, ~30x baseline) paginating /accounts?sort=balance + /firms — a full balance/firm harvest. It pinned the shared DB host and put the explorer into a crash loop (~21 restarts over the 4 days). Stopped on its own after the in-game ban; there is currently no way to block the client at the network/app layer. Detection/alerting is now in place (PrometheusRule → Discord); this is the missing response control.
Investigated — a CCNP is a no-op for this topology:
X-Forwarded-For (that's where the access log reads it). A pod-targeted fromCIDR policy matches nothing.enable-host-firewall is off, and enabling it + selecting the host endpoint flips host ingress to default-deny — requires allowlisting SSH/kube-API/node-to-node or you lock both nodes out. Not worth it for this.So the effective + low-risk layer is the app itself, where the XFF IP + UA already exist.
403 early for matching requests.X-Forwarded-For, trusting the gateway hop) and User-Agent (exact + substring).BLOCKED_IPS / BLOCKED_UAS, comma-separated, CIDR-aware) so updates are a values change in k8s-gitops, no rebuild.kind:"blocked") per rejected request so blocks are visible in Loki and can feed a "still being probed" metric.136.107.101.57, UA Blockantir-BalanceCollector/1.0./accounts + /firms pagination and cap page depth (the deep-OFFSET queries are what caused the max_statement_time timeouts).