Skip to content

Fleet firewall access · in active development

Open the right port. For the right IP. For exactly long enough.

FleetGate is a signed, time-boxed firewall access plane for your whole fleet: grant IP- and port-scoped access on demand, propagate bans to every host, and keep zero standing open ports. Self-hostable, agent-light, and built by people who run fleets in production.

See it work

Watch a grant open and close itself

One request — signed and time-boxed. The host opens the port, then closes it on its own when the TTL runs out. Nothing left standing.

fleetgate · cp01

$ fleetgate grant 203.0.113.7 --port 22 --ttl 10s

verdict issued · id 7f3ad9 · tier 1 · Ed25519-signed

cp01 · pulled, signature verified against pinned key

cp01 · firewall ACCEPT 203.0.113.7 tcp/22 · expires 00:10

cp01 · firewall: rule expired — removed

access closed automatically · zero standing ports

How it works

A control plane that decides, hosts that just enforce.

A central authority makes and signs every access decision. A tiny enforcer on each host verifies and applies it. Nothing the host receives is trusted without a valid signature, and nothing stays open longer than it was granted for.

01
Request
Someone needs a port open — an operator, a self-service client unbanning their IP, or an automated tier-0/tier-1 check.
02
Authorise & sign
The authority validates the request, mints a time-boxed verdict, Ed25519-signs it, and records it in a tamper-evident audit log.
03
Enforce
Each host pulls its verdicts, verifies the signature against a pinned key, and programs the firewall — bans ordered ahead of allows.
04
Expire & report
The grant expires on its TTL (a kernel dead-man backs it up), and the host reports back what it actually applied.

Attack surface

Standing doors, or just-in-time access

Every always-open management port is a door anyone can knock on, around the clock. FleetGate keeps them shut until access is granted — then shuts them again on the TTL.

Without FleetGate 5 ports open · 24/7
  • 22 · ssh ● open
  • 3306 · mysql ● open
  • 2087 · whm ● open
  • 10000 · webmin ● open
  • 8080 · admin ● open

Every gated service is reachable by anyone, always. Your firewall is a static allow-list you hope is still current.

With FleetGate 0 standing · 1 granted
  • 22 · ssh ○ closed
  • 3306 · mysql ○ closed
  • 2087 · whm ○ closed
  • 10000 · webmin ○ closed
  • 8080 · admin ○ closed
  • 22 · ssh → 203.0.113.7 ● 03:41

Nothing stands open. One IP holds a time-boxed grant on one port; it closes itself when the TTL runs out.

Built for the way fleets actually run

The boring-but-critical parts of firewall access, done once and done right — so access is something you grant, not something you leave open.

Time-boxed by default

Every grant carries a TTL. Access opens for exactly as long as it is needed and expires on its own — no standing open ports, no forgotten allow-list entries to audit later.

Signed, verifiable verdicts

Every decision is Ed25519-signed by the authority and verified on each host before it touches the firewall. The transport is assumed hostile; only a valid signature counts.

Fleet-wide bans

Ban a source once and it propagates to every host — even the boxes with no detection agent of their own. Your detectors feed it; FleetGate distributes and enforces.

Agent-light, no containers

A tiny Go enforcer ships as a signed .deb/.rpm and drives the firewall you already run (firewalld today). No runtime, no sidecars, no daemon zoo.

The wire format

Signed, inspectable, boring on purpose

Every decision is a small JSON object with a detached Ed25519 signature. The host verifies it against a key pinned at enrolment before it touches the firewall — the transport is assumed hostile, so a valid signature is the only thing that counts.

The signature covers the verdict's canonical form (sorted keys, no whitespace), so it is byte-identical across the TypeScript control plane and the Go enforcer.

signed-verdict.json
{
  "verdict": {
    "v": 1,
    "id": "7f3ad9e2-1c4b-4f8a-9b2e-2a1d4c6e8f00",
    "subject": "203.0.113.7",
    "effect": "allow",
    "ports": [22],
    "target": "cp01",
    "scope": "host",
    "expiresAt": 1923264000,
    "tier": "1"
  },
  "alg": "ed25519",
  "keyId": "Bki7-YhfHIibqiKN",
  "signature": "nBniygI9PtgUOXSoK1UTn57b4v41o7nNIjv8LXiroywhmlJ…"
}

Security

Security is the product, not a checkbox

FleetGate touches the firewall on every host you run, so the trust model came first — not as a retrofit.

Signed end to end

Verdicts are Ed25519-signed and verified against a key pinned at enrolment. No CA to trust, no transport to trust.

Tamper-evident audit

Every decision lands in a hash-chained audit log. Any edit to history breaks the chain and is detectable.

Protected ranges

Management, monitoring and tailnet ranges are un-bannable by policy — a propagated ban can never lock you out.

Undo is one command

Host changes are runtime-only, so reverting to the baseline firewall is a single reload. Hard to brick by design.

Read the security overview

Verify our packages

Don't trust the download. Verify it.

The FleetGate enforcer ships as a GPG-signed .deb and .rpm. Import our public key once and your package manager checks the signature on every release.

Download public key

fingerprint: E80D 40D6 0D6E 1B34 9651 410A 265F 7CA0 1EDA C2BC

verify a release
# RPM hosts (AlmaLinux / CloudLinux)
sudo rpm --import https://fleetgate.dev/keys/fleetgate-packages.asc
rpm --checksig turnstyle-enforcer-*.rpm

# Debian / Ubuntu hosts
curl -fsSL https://fleetgate.dev/keys/fleetgate-packages.asc \
  | sudo gpg --dearmor -o /usr/share/keyrings/fleetgate.gpg

Want in early?

FleetGate is in active development. Leave an email and we will tell you when it is ready to put in front of your fleet — no drip campaign, no newsletter, just the one message that matters.

We will only email you once. Unsubscribe is a no-op — there is nothing to unsubscribe from.