tailscale/tailscale · error

netstack: Bind(%v): %v

Error message

netstack: Bind(%v): %v

What it means

ListenPacket created a gVisor UDP endpoint but binding it to the requested address and port on the netstack NIC failed, most often because the port is already in use inside the netstack. The endpoint is closed before returning.

Source

Thrown at wgengine/netstack/netstack.go:1894

		if !ap.Addr().Is6() {
			return nil, fmt.Errorf("netstack: udp6 requires an IPv6 address")
		}
	default:
		return nil, fmt.Errorf("netstack: unsupported network %q", network)
	}
	var wq waiter.Queue
	ep, nserr := ns.ipstack.NewEndpoint(udp.ProtocolNumber, networkProto, &wq)
	if nserr != nil {
		return nil, fmt.Errorf("netstack: NewEndpoint: %v", nserr)
	}
	localAddress := tcpip.FullAddress{
		NIC:  nicID,
		Addr: tcpip.AddrFromSlice(ap.Addr().AsSlice()),
		Port: ap.Port(),
	}
	if err := ep.Bind(localAddress); err != nil {
		ep.Close()
		return nil, fmt.Errorf("netstack: Bind(%v): %v", localAddress, err)
	}
	return gonet.NewUDPConn(&wq, ep), nil
}

// ListenTCP listens for TCP connections on the given address.
func (ns *Impl) ListenTCP(network, address string) (*gonet.TCPListener, error) {
	ap, err := netip.ParseAddrPort(address)
	if err != nil {
		return nil, fmt.Errorf("netstack: ParseAddrPort(%q): %w", address, err)
	}

	var networkProto tcpip.NetworkProtocolNumber
	switch network {
	case "tcp4":
		networkProto = ipv4.ProtocolNumber
		if ap.Addr().IsValid() && !ap.Addr().Is4() {
			return nil, fmt.Errorf("netstack: tcp4 requires an IPv4 address")
		}

View on GitHub (pinned to 5201273aec)

Solutions

  1. Check the wrapped bind error; the address/port may already be in use inside netstack or be invalid.
  2. Choose a different local port or address that is free in the netstack.
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at wgengine/netstack/netstack.go:1868 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of tailscale/tailscale@5201273aec (2026-08-18). Data as JSON: /api/errors/f300927ae5c4320d. Report an issue: GitHub.