Skip to content

Blackhole (Per-IP Total Drop) ​

Blackholing an IP drops every packet destined to it, at the earliest possible point in the firewall — for as long as the blackhole is active. It is the "take this tenant off the air" switch for dedicated hosts: when one VPS IP is eating a flood big enough to endanger the whole box, you sacrifice that one address and everything else stays fast.

The one exception: established players stay online ​

A blackhole is not a brick wall for people who were already playing. Sources with an established TCP connection to the blackholed IP — a real, completed handshake — keep passing. Crucially, they are exempt from the blackhole only: rate limits, suspicion scoring and bans still apply to them like anyone else.

When an established source goes quiet, a grace timer starts (default 10 minutes). Reconnect within the window and you're straight back in — the timer resets. If the window lapses, the source loses its exemption and is dropped like everyone else until the blackhole ends. No new connections can be established while a blackhole is active — that's the point.

UDP services

The established exemption needs a handshake to observe, and UDP has none (the firewall sees inbound packets only, so "two-way UDP" can't be proven). During a blackhole of a UDP-only service (Minecraft Bedrock, FiveM, voice), all UDP sources are dropped, players included. For TCP services (Minecraft Java, websites, APIs, SFTP) established players ride through.

Manual blackhole ​

bash
openshield blackhole add 203.0.113.10              # until disabled
openshield blackhole add 203.0.113.10 --seconds 300  # timed: 5 minutes
openshield blackhole list                           # active blackholes + remaining time
openshield blackhole remove 203.0.113.10            # lift one
openshield blackhole clear                          # lift all

The TUI's IPs tab shows blackhole state per attached IP and lets you toggle it; the dashboard banner tells you whenever any blackhole is active, and blackhole drops get their own row in the Drop Paths panel. IPv6 works identically.

Auto-blackhole ​

Off by default. When enabled, the firewall watches the inbound rate of each attached IP (see Attached IPs — the registry is what keeps auto-blackhole from ever touching an address you don't manage) and blackholes it when an attack crosses your magnitude:

yaml
blackhole:
  enabled: true            # master switch for the whole feature
  auto_enabled: false      # opt-in: let the firewall blackhole on its own
  auto_pps: 500000         # trigger: inbound packets/sec to one IP (0 = ignore)
  auto_bps: 0              # trigger: bytes/sec to one IP (0 = ignore)
  auto_sustain_sec: 5      # rate must hold this long (anti-spike)
  auto_duration_sec: 300   # blackhole lasts this long...
  grace_minutes: 10        # established-source grace window

If the attack is still over the trigger when the timer expires, the blackhole extends for another auto_duration_sec — no flapping. Every automatic and manual blackhole/lift posts an alert (Discord/webhook) with the IP, the rate that caused it, and whether it was automatic.

What blackhole is not ​

  • It does not replace per-source bans — those still handle the attackers themselves. Blackhole answers "the target is more expensive to defend than to sacrifice."
  • It never touches your management access: the admin whitelist is evaluated before the blackhole, so whitelisted sources always get through.
  • Auto-blackhole requires the target to be an attached IP. If you see floods hitting addresses the registry doesn't know, attach them (or their subnet) first.

Metrics ​

/metrics exposes active blackholes (per-IP: manual/auto, time remaining), cumulative blackhole-dropped packets, the live exemption count, and auto-blackhole event totals — see Metrics & API for field names.