BOTSTOPPER FROM TECHAROPRODUCT DOCUMENTATION
Documentation/Client IP Headers

Client IP Headers

BotStopper appends the connecting peer address to X-Forwarded-For, then scans the chain from right to left. It forwards the first valid address outside these categories:

  • Private (XFF_STRIP_PRIVATE, enabled by default)
  • Loopback (always stripped)
  • CGNAT (always stripped)
  • Link-local Unicast (always stripped)
Incoming: X-Forwarded-For: 1.2.3.4, 5.6.7.8, 10.0.0.1
Upstream: X-Forwarded-For: 5.6.7.8

This behavior will cause problems if the proxy in front of BotStopper is from a public IP, such as Cloudflare, because BotStopper will use the Cloudflare IP instead of your client's real IP. You will likely see all requests from your browser being blocked and/or an infinite challenge loop.

Incoming: X-Forwarded-For: REAL_CLIENT_IP, CF_IP
Upstream: X-Forwarded-For: CF_IP

Configure your ingress to derive the client address from a trusted source, such as Cloudflare’s CF-Connecting-IP header. Overwrite client-supplied IP headers before the request reaches BotStopper. For a public connecting peer, also set X-Real-IP or configure --custom-real-ip-header. A single incoming X-Forwarded-For address does not prevent BotStopper from appending and selecting the public peer address.

If you do not control the web server upstream of BotStopper, the custom-real-ip-header command line flag accepts a header value that BotStopper will read the real client IP address from. BotStopper will set the X-Real-IP header to the IP address found in the custom header.

If X-Real-IP is absent, BotStopper infers it from X-Forwarded-For. An explicit X-Real-IP value takes precedence. The ingress must replace spoofed values.

These address exclusions are not a list of authenticated proxy identities. Restrict direct access to BotStopper when your configuration relies on ingress headers.

See Cloudflare for an example configuration.

See configuration for deployment configuration.