Repository navigation
iOS client: WireGuard handshake succeeds but no data plane traffic, SSH connections time out #7666
Replies: 4 comments
|
Update: as a workaround, we tried switching to a self-hosted Headscale server instead (same official Tailscale apps, different control server). SSH connectivity worked flawlessly there — the same symptom described above (successful handshake, no actual data plane traffic) did not occur at all with Headscale, which points fairly strongly at this being specific to NetBird's client/data-plane implementation on iOS rather than an environment issue on our end. However, we ended up having to revert back to the original, proprietary Tailscale (tailscale.com-hosted) control server anyway, because Headscale currently doesn't support Tailscale Funnel, which we rely on for remote access to a self-hosted service. So for now we're stuck back on standard Tailscale, since neither of the self-hosted alternatives we tried (NetBird due to this issue, Headscale due to missing Funnel support) fully covers our use case yet. |
|
Same symptom here, on NetBird Cloud rather than self-hosted, and reproducing on P2P as well as relayed — so this does not look relay-specific. I have packet-level captures that I think answer your last question directly:
It is client-side, and it is data-plane-only. The iOS client never emits a data packet. Setup
The measurementA single 30-second capture, taken on both the physical interface and the WireGuard interface simultaneously, while continuously reloading During that same window a macOS control peer happened to be transferring. That peer is behind the same NAT and presents the same public IP as the iPhone, differing only in source port — so NAT traversal conditions are identical for both.
The iPhone's 86 frames arrive at a fixed cadence and are all keepalive/handshake sized. No data-sized frame is ever produced, despite continuous user-driven requests throughout the window. The control peer pushed 4879 full-MTU frames over the same interface, through the same NAT, at the same time, and all of them decrypted and were delivered. This matches your The receiving peer is not dropping anything
The identical trace for the working control peer returns the same verdict under the same rule. Local services are confirmed healthy independently — Reproduced across every combination tested
Two notes that may be useful to whoever picks this up:
Debug bundleSince I am on Cloud, I could upload one — this may cover the gap you hit with self-hosting. Generated with trace logs enabled and anonymisation on, immediately after a reproduction: Happy to re-run any capture on request. |
|
Thanks for the writeup, we'll look into it as soon as possible 🚀 NetBird has moved to a discussion first model, explained in #6074. Issues are |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Environment
Symptom
SSH connection attempts from the iPhone peer to another peer's NetBird IP consistently time out (
Operation timed out/Connection to port <port> on <NetBird IP> timed out), even though:netbird status --detailon the target peer shows the iPhone peer asStatus: ConnectedLast WireGuard handshakerefreshes to a few seconds old on each attemptRelayedvia our own self-hosted relay (rels://...)However, the
Transfer status (received/sent)counter for that peer never exceeds a few hundred bytes (roughly 300-500 B each direction) regardless of how many connection attempts are made or how long the peer stays "connected" — consistent with only handshake/keepalive traffic, no actual TCP payload ever passing through the tunnel.Steps taken / things ruled out
netbird-acl-input-rulesallow-set; traffic from that peer is not being dropped by the host's own NetBird ACL chains.wt0) at all.netbird-servercontainer logs during multiple connection attempts; no errors or drops specific to this peer, only periodic reconnect/keepalive cycling consistent with normal relay session renewal.What would help
upload.debug.netbird.io— the app's "Upload debug bundle" feature currently appears to only support NetBird's own cloud endpoint, which isn't usable for a self-hosted-only setup that wants to avoid sending IP/domain/key data to a third party.Happy to provide more logs/detail if useful.
All reactions