WebSocket upgrade headers stripped/mishandled by reverse proxy (v0.71.2) — silent failure, not the same as #5329/#5507 #6190
Unanswered
sdejongh
asked this question in
Issue Triage
Replies: 2 comments 2 replies
-
|
Upgraded to latest 0.7.4, issue is still the same. |
Beta Was this translation helpful? Give feedback.
0 replies
-
|
Enabling this option will fix the problem:
|
Beta Was this translation helpful? Give feedback.
2 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment

Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Before posting
Affected area
Reverse Proxy
Deployment type
Self-hosted - quickstart script
Operating system or environment
Linux
NetBird version and upgrade status
Did this work before?
No, this never worked
Regression details
No response
Summary
The NetBird built-in reverse proxy (v0.71.0) silently drops WebSocket upgrade headers when forwarding HTTP/1.1 requests, and mishandles WebSocket-over-HTTP/2 requests (RFC 8441). The result is that no WebSocket-using application works behind the proxy: GitLab ActionCable, Immich, Home Assistant, Mattermost, Nextcloud Talk, and any other modern self-hosted web app.The failure is silent at the proxy level — no log entries, no warnings, no errors. Operators only see a 404 in the dashboard "Proxy Events" tab and reasonably assume their backend is misconfigured.
Current behavior
WebSocket handshake requests reaching netbird-proxy fail in two distinct ways depending on HTTP version:
HTTP/1.1: the Connection: Upgrade and Upgrade: websocket headers are silently stripped before forwarding to the backend. The upstream service receives a plain GET request on the WebSocket endpoint and returns whatever it normally returns for a non-WebSocket GET on that path (typically 404).
HTTP/2 (browser default via ALPN): the upstream nginx receives the request but rejects it with 400 websocket upgrade required, indicating that something in the HTTP/2 → HTTP/1.1 conversion (or RFC 8441 :protocol: websocket handling) is broken.
In both cases:
netbird-proxy container logs are silent — no warning, no error.
The dashboard "Proxy Events" tab shows the request as 404 Request failed with no further detail.
The retry loop from the client (typical for ActionCable, Socket.IO, etc.) produces a continuous stream of failed requests with no diagnostic information.
Expected behavior
netbird-proxy should detect WebSocket upgrade requests and proxy them correctly:
HTTP/1.1: preserve Connection: Upgrade and Upgrade: websocket when forwarding, and hijack the TCP connection to bridge frames between client and upstream.
HTTP/2: handle RFC 8441 CONNECT with :protocol: websocket, or downgrade to HTTP/1.1 toward the upstream while preserving the upgrade semantics.
The expected response to a valid WebSocket handshake is 101 Switching Protocols from the upstream, after which the proxy tunnels frames bidirectionally for the lifetime of the connection.
Steps to reproduce
Environment and topology
Self-hosted details, if available
Logs, status output, or debug evidence
Logs:
(empty — no warning, no error, no entry related to the WebSocket path at default log level)
CURL TEST HTTP/1.1*
Command
Response
CURL TEST HTTP/2
Command
Response
By-PASSING Traefik
Command
Response
Related issues or discussions
Impact
No response
Additional context
No response
Beta Was this translation helpful? Give feedback.
All reactions