Skip to content

§7 hardening before any public post: the coordinator's bind has no private network to hide behind #218

Description

@defenwycke

Reconnaissance done 2026-09-06, before the v0.20.0 Delving/HN post. RUNBOOK.md §7 lists what must be closed before a public write endpoint is announced. One item does not fit the architecture as written.

What §7 assumes vs what exists

§7 says: "If the coordinator is a separate box, set COORD_BIND to its private-network IP (not 0.0.0.0) and firewall :8899 to the web box."

There is no private network. The coordinator's interfaces are:

lo        127.0.0.1/8
eth0      152.53.93.164/22     <- public
docker0   172.17.0.1/16

The web box (83.136.255.218) proxies to the coordinator over the public internet. So:

  • COORD_BIND=127.0.0.1 would break the proxy — the board would go dark
  • there is no private IP to bind to instead
  • COORD_BIND=0.0.0.0 is currently the only workable value

What is actually protecting it

Measured, with a working control:

probe result
152.53.93.164:8899 curl_exit=28timed out, i.e. filtered
152.53.93.164:9110 curl_exit=7 — refused
bitcoinghost.org/hazync/api/meta (control) http=200 — the probe method works

So a provider-level filter drops :8899 from arbitrary hosts while allowing the web box. That is real protection, but it is one layer, and it is not oursufw is inactive and iptables INPUT is empty on the host.

Proposed

  1. Host firewall allowing :8899 only from the web box's egress address — defence in depth that does not need a private network, and survives a provider-side rule changing.
  2. Keep COORD_BIND=0.0.0.0 and correct §7's wording, which currently prescribes something impossible on this topology.
  3. The rest of §7 (nginx limit_req/limit_conn, the 1s /api/state micro-cache, client_max_body_size 8m, TRUSTED_PROXIES) applies on the web box and is unaffected.

⚠ Not changed yet, deliberately: altering live network access mid-release risks the board. Do it with the cutover restart, when the coordinator is already down.

Blocks: the Delving/HN post. An anonymous GET flood on /api/state is, in §7's own words, "the cheapest board-takedown".

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions