feat(mesh): app direct ports reachable over the mesh — IPv4 listeners mirrored onto [::]
The companion reaches the node at its fips0 ULA, and the web UI builds app links as http://[<ULA>]:<direct port> — but rootless-podman published ports bind 0.0.0.0 only, so every app URL was refused over the mesh (:8334 first). A reconcile loop in the backend mirrors public IPv4 listeners: any port >=1024 on 0.0.0.0 without an IPv6 any-listener gets a v6-ONLY [::] forwarder to 127.0.0.1, following /proc/net/tcp* so install/remove and hardcoded companion ports are covered without touching a single container. Purely additive: IPv4/LAN/Tor access paths are untouched, v6only listeners cannot collide with or intercept v4 traffic, and foreign IPv6 listeners win. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
6c48de20e3
commit
2ad57c63f1
@@ -34,6 +34,7 @@ mod bitcoin_rpc;
|
||||
mod bitcoin_status;
|
||||
mod blobs;
|
||||
mod bootstrap;
|
||||
mod mesh_ports;
|
||||
mod ceremony;
|
||||
mod config;
|
||||
mod constants;
|
||||
@@ -395,6 +396,10 @@ async fn main() -> Result<()> {
|
||||
// iframe on kiosk nodes (docs/tv-input-iframe-apps.md).
|
||||
tokio::spawn(bootstrap::ensure_gamepad_keys());
|
||||
|
||||
// Mesh access: mirror IPv4-published app ports onto [::] so direct-port
|
||||
// app URLs (http://[<fips0 ULA>]:<port>) work from the companion.
|
||||
tokio::spawn(mesh_ports::run_mesh_port_mirror());
|
||||
|
||||
// Pine voice: re-point IP-pinned Wyoming satellite entries (speakers) when
|
||||
// DHCP renumbering strands them — HA never re-resolves on its own.
|
||||
tokio::spawn(api::rpc::wyoming_satellite_keeper());
|
||||
|
||||
Reference in New Issue
Block a user