[GH-ISSUE #5972] Windows userspace bind proxy (factory_usp): P2PConnected stuck at 0 for NAT traversal peers despite STUN responses received #12600

Open
opened 2026-08-05 02:06:15 -04:00 by saavagebueno · 0 comments
Owner

Originally created by @jmezinko on GitHub (Apr 23, 2026).
Original GitHub issue: https://github.com/netbirdio/netbird/issues/5972

Description:
On Windows with the userspace bind proxy (factory_usp), ICE NAT traversal fails permanently for peers outside the local subnet. STUN responses are confirmed arriving at the machine via packet capture, RemoteCandidate counts accumulate normally, and WGCheckSuccess increments — but P2PConnected never moves off 0. The same network with a Linux client (kernel WireGuard) achieves P2P to the same peers immediately.
Environment:

OS: Windows 10/11 amd64
NetBird version: 0.69.0
Interface type: Userspace (factory_usp / bind proxy)
Network: Behind NAT (OPNsense firewall with Hybrid outbound NAT + static port)

Key log evidence:
INFO client/net/env_bound_iface.go:46: system supports advanced routing
INFO client/iface/wgproxy/factory_usp.go:15: WireGuard Proxy Factory will produce bind proxy
WARN client/iface/bind/activity.go:85: could not find record for address 127.1.x.x:51820
State dump after 30+ minutes — P2PConnected permanently 0:
RemoteCandidate: 409, P2PConnected: 0, WGCheckSuccess: 17, RelayConnected: 1
Packet capture confirms STUN working: Bidirectional UDP traffic to stun.netbird.io on ports 443 and 5555 from source port 51820, with responses arriving. Linux peer on same network achieves host/prflx P2P to the same peers.
Root cause hypothesis: The bind proxy's activity table (iface/bind/activity.go) is not registering incoming STUN responses as valid ICE candidate records when the source port is 51820 (the WireGuard proxy port), causing all ICE connectivity checks to fail silently.

netbird.debug.2232727617.zip

Originally created by @jmezinko on GitHub (Apr 23, 2026). Original GitHub issue: https://github.com/netbirdio/netbird/issues/5972 Description: On Windows with the userspace bind proxy (factory_usp), ICE NAT traversal fails permanently for peers outside the local subnet. STUN responses are confirmed arriving at the machine via packet capture, RemoteCandidate counts accumulate normally, and WGCheckSuccess increments — but P2PConnected never moves off 0. The same network with a Linux client (kernel WireGuard) achieves P2P to the same peers immediately. Environment: OS: Windows 10/11 amd64 NetBird version: 0.69.0 Interface type: Userspace (factory_usp / bind proxy) Network: Behind NAT (OPNsense firewall with Hybrid outbound NAT + static port) Key log evidence: INFO client/net/env_bound_iface.go:46: system supports advanced routing INFO client/iface/wgproxy/factory_usp.go:15: WireGuard Proxy Factory will produce bind proxy WARN client/iface/bind/activity.go:85: could not find record for address 127.1.x.x:51820 State dump after 30+ minutes — P2PConnected permanently 0: RemoteCandidate: 409, P2PConnected: 0, WGCheckSuccess: 17, RelayConnected: 1 Packet capture confirms STUN working: Bidirectional UDP traffic to stun.netbird.io on ports 443 and 5555 from source port 51820, with responses arriving. Linux peer on same network achieves host/prflx P2P to the same peers. Root cause hypothesis: The bind proxy's activity table (iface/bind/activity.go) is not registering incoming STUN responses as valid ICE candidate records when the source port is 51820 (the WireGuard proxy port), causing all ICE connectivity checks to fail silently. [netbird.debug.2232727617.zip](https://github.com/user-attachments/files/27015166/netbird.debug.2232727617.zip)
saavagebueno added the triage-needed label 2026-08-05 02:06:15 -04:00
Sign in to join this conversation.
No Label triage-needed
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#12600