[GH-ISSUE #6400] Reverse Proxy 0.72.x regression: mode=tcp services no longer bind their custom ports (works in 0.71.4) #12195

Open
opened 2026-08-05 01:32:37 -04:00 by saavagebueno · 0 comments
Owner

Originally created by @wgetnz on GitHub (Jun 10, 2026).
Original GitHub issue: https://github.com/netbirdio/netbird/issues/6400

Description

After upgrading netbirdio/reverse-proxy from 0.71.4 to 0.72.x, all mode=tcp services became unreachable from outside. The proxy process no longer binds the configured custom ports — inside the container only :8443 is listening. Downgrading only the proxy container back to 0.71.4 (management/server kept at 0.72.3) immediately restores correct behavior.

Environment

  • Self-hosted, single-account
  • netbird-server (management/signal/relay): 0.72.3
  • netbird-proxy: broken on 0.72.0–0.72.3, works on 0.71.4
  • Several mode=tcp services (SSH→22, RDP→3389, …) with custom listen ports (10001–10004, 3389)

Symptom

  • External TCP connect to any mode=tcp service's listen port → connection refused/reset
  • mode=http services (443) work fine
  • docker exec netbird-proxy netstat -tlnp on 0.72.3 shows only :::8443 — none of the configured custom ports
  • Startup log shows a single proxy main listener bound :8443; no per-port listeners

Differential evidence (same environment, only the proxy image changed)

  • 0.72.3: netstat → only :::8443. TCP services unreachable.
  • 0.71.4: netstat:::8443 :::10001 :::10002 :::10003 :::10004 :::3389. After Initial mapping sync complete the proxy binds each custom port; external SSH works (received a real SSH banner through the tunnel).

In both versions the proxy registers the services correctly (debug clients lists the l4:<id> keys, mapping sync completes, the WireGuard tunnel to the target peer is healthy). The only difference is that 0.72.x never opens the per-port TCP listeners.

Steps to reproduce

  1. Self-host netbird with the reverse-proxy
  2. Create a mode=tcp service with a custom listen_port (e.g. SSH, listen 10001 → target peer :22)
  3. On proxy 0.72.x: external connect to :10001 fails; netstat inside the container shows no :10001 listener
  4. Downgrade only the proxy container to 0.71.4 → :10001 starts listening, connection works

Notes

  • Not the same as #6068 (that one is mode=tls / SNI passthrough / autocert). This is mode=tcp raw per-port forwarding.
  • Side note: 0.71.4 force-downloads the GeoLite2 DB at startup and hard-blocks if it can't reach pkgs.netbird.io (0.72.3 only warns) — relevant for restricted/air-gapped networks.
Originally created by @wgetnz on GitHub (Jun 10, 2026). Original GitHub issue: https://github.com/netbirdio/netbird/issues/6400 ## Description After upgrading `netbirdio/reverse-proxy` from 0.71.4 to 0.72.x, all `mode=tcp` services became unreachable from outside. The proxy process no longer binds the configured custom ports — inside the container only `:8443` is listening. Downgrading **only** the proxy container back to 0.71.4 (management/server kept at 0.72.3) immediately restores correct behavior. ## Environment - Self-hosted, single-account - netbird-server (management/signal/relay): **0.72.3** - netbird-proxy: broken on **0.72.0–0.72.3**, works on **0.71.4** - Several `mode=tcp` services (SSH→22, RDP→3389, …) with custom listen ports (10001–10004, 3389) ## Symptom - External TCP connect to any `mode=tcp` service's listen port → connection refused/reset - `mode=http` services (443) work fine - `docker exec netbird-proxy netstat -tlnp` on 0.72.3 shows only `:::8443` — none of the configured custom ports - Startup log shows a single `proxy main listener bound :8443`; no per-port listeners ## Differential evidence (same environment, only the proxy image changed) - **0.72.3:** `netstat` → only `:::8443`. TCP services unreachable. - **0.71.4:** `netstat` → `:::8443 :::10001 :::10002 :::10003 :::10004 :::3389`. After `Initial mapping sync complete` the proxy binds each custom port; external SSH works (received a real SSH banner through the tunnel). In both versions the proxy registers the services correctly (`debug clients` lists the `l4:<id>` keys, mapping sync completes, the WireGuard tunnel to the target peer is healthy). The only difference is that 0.72.x never opens the per-port TCP listeners. ## Steps to reproduce 1. Self-host netbird with the reverse-proxy 2. Create a `mode=tcp` service with a custom `listen_port` (e.g. SSH, listen 10001 → target peer :22) 3. On proxy 0.72.x: external connect to :10001 fails; `netstat` inside the container shows no :10001 listener 4. Downgrade only the proxy container to 0.71.4 → :10001 starts listening, connection works ## Notes - Not the same as #6068 (that one is `mode=tls` / SNI passthrough / autocert). This is `mode=tcp` raw per-port forwarding. - Side note: 0.71.4 force-downloads the GeoLite2 DB at startup and hard-blocks if it can't reach `pkgs.netbird.io` (0.72.3 only warns) — relevant for restricted/air-gapped networks.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#12195