feat(security): bind Bitcoin RPC/ZMQ publishes to loopback + archy-net gateway (§C)
USER DECISION 2026-07-08: accept breaking external wallets pointed at nodeIP:8332. The 0.0.0.0 publish exposed auth-only RPC (and unauthenticated ZMQ 28332/28333 on the legacy path) to the whole LAN. - New `bind` field on manifest port mappings (validated as an IP; the same host port may repeat with distinct binds). Rendered as PublishPort=<ip>:<host>:<container> in quadlet units and host_ip in the podman API create — unbound ports render byte-identical to before, so no fleet-wide false-drift wave. - bitcoin-knots/-core manifests publish 8332 on 127.0.0.1 + 10.89.0.1 only. In-node consumers (lnd, fedimint-gateway, btcpay/nbxplorer) are unaffected: they dial host.archipelago / host.containers.internal, which the orchestrator pins to the archy-net gateway 10.89.0.1. P2P 8333 stays public. - Legacy config.rs port strings get the same treatment incl. ZMQ. Tests: new quadlet bind-render + manifest bind-validation tests; container:: suite 167/167, archipelago-container 63/63. DEPLOY NOTE: PublishPort strings change for bitcoin containers → one planned recreate per node; restart lnd afterwards (it caches the backend IP — see the backend-recreate cascade tracker item). Catalog manifests for bitcoin apps must be regenerated + re-signed for catalog-covered nodes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
81743874a1
commit
dd61a20413
@@ -660,10 +660,16 @@ pub(super) async fn get_app_config(
|
||||
),
|
||||
"bitcoin-core" => (
|
||||
vec![
|
||||
"8332:8332".to_string(),
|
||||
// RPC + ZMQ are auth-only/unauthenticated: host-local + the
|
||||
// archy-net gateway (host.archipelago) only — never the LAN.
|
||||
// P2P 8333 stays public.
|
||||
"127.0.0.1:8332:8332".to_string(),
|
||||
"10.89.0.1:8332:8332".to_string(),
|
||||
"8333:8333".to_string(),
|
||||
"28332:28332".to_string(),
|
||||
"28333:28333".to_string(),
|
||||
"127.0.0.1:28332:28332".to_string(),
|
||||
"10.89.0.1:28332:28332".to_string(),
|
||||
"127.0.0.1:28333:28333".to_string(),
|
||||
"10.89.0.1:28333:28333".to_string(),
|
||||
],
|
||||
vec!["/var/lib/archipelago/bitcoin:/home/bitcoin/.bitcoin".to_string()],
|
||||
vec![],
|
||||
@@ -702,10 +708,16 @@ pub(super) async fn get_app_config(
|
||||
),
|
||||
"bitcoin" | "bitcoin-knots" => (
|
||||
vec![
|
||||
"8332:8332".to_string(),
|
||||
// RPC + ZMQ are auth-only/unauthenticated: host-local + the
|
||||
// archy-net gateway (host.archipelago) only — never the LAN.
|
||||
// P2P 8333 stays public.
|
||||
"127.0.0.1:8332:8332".to_string(),
|
||||
"10.89.0.1:8332:8332".to_string(),
|
||||
"8333:8333".to_string(),
|
||||
"28332:28332".to_string(),
|
||||
"28333:28333".to_string(),
|
||||
"127.0.0.1:28332:28332".to_string(),
|
||||
"10.89.0.1:28332:28332".to_string(),
|
||||
"127.0.0.1:28333:28333".to_string(),
|
||||
"10.89.0.1:28333:28333".to_string(),
|
||||
],
|
||||
vec!["/var/lib/archipelago/bitcoin:/home/bitcoin/.bitcoin".to_string()],
|
||||
vec![],
|
||||
|
||||
Reference in New Issue
Block a user