What's a zrok?
zrok (/ziːɹɒk/ ZEE-rock) is a secure, open-source, self-hostable sharing platform that simplifies shielding and sharing network services or files. There's a hardened zrok-as-a-service offering available at zrok.io with a generous free tier.
zrok is licensed under Apache 2.0.
Check the roadmap if you're thinking about the future. We would love to hear your ideas for
zrok is a Ziti Native Application, built on the OpenZiti platform, and supported by the OpenZiti community and NetFoundry team.
What's it for?
zrok to share a running service, like a web server or a network socket, or to share a directory of static files.
If sharing publicly, you can reserve a subdomain, enable authentication options, or both. Public shares proxy HTTPS to your service or files.
If sharing privately, only users with the share token can access your share. In addition to what you can share publicly, private shares can include TCP and UDP services.
Installing the zrok Command
Generating an Invitation
If not using
zrok.io (zrok-as-a-service), you must configure the
zrok command to use your instance. See the instance configuration guide in the self-hosting section for details.
Invite yourself to
zrok by running the
zrok invite command:
zrok invite command presents a small form that allows you to enter (and then confirm) your email address. Tabbing to the
[ Submit ] button will send the request to your configured
Next, check the email where you sent the invite. You should receive a message asking you to click a link to create your
zrok account. When you click that link, you will be brought to a web page that will allow you to set a password for your new account:
Enter a password and its confirmation, and click the
Register Account button. You'll see the following:
For now, we'll ignore the "enable your shell for zrok" section. Just click the
zrok web portal link:
After clicking the
Log In button, you'll be brought into the
zrok web console:
zrok account is ready to go!
Enabling Your zrok Environment
zrok account was created, the service generated a secret token that identifies and authenticates in a single step. Protect your secret token as if it were a password, or an important account number; it's a secret, protect it.
When we left off you had downloaded, extracted, and configured your
zrok environment. In order to use that environment with your account, you'll need to
enable it. Enabling an environment generates a secure identity and the necessary underlying security policies with the OpenZiti network hosting the
From the web console, click on your email address in the upper right corner of the header. That drop down menu contains an
Enable Your Environment link. Click that link and a modal dialog will be shown like this:
This dialog box shows you the
zrok enable command that you can use to enable any shell to work with your
zrok account with a single command.
Let's copy that command and paste it into your shell:
After a few seconds, the message will change and indicate that the enable operation succeeded:
Now, if we run a
zrok status command, you will see the details of your environment:
Excellent... our environment is now fully enabled.
If we return to the web console, we'll now see the new environment reflected in the explorer view:
In my case, the environment is named
michael@ziti-lx, which is the username of my shell and the hostname of the system the shell is running on.
Should you want to use a non-default name for your environment, you can pass the
-d option to the
zrok enable command. See
zrok enable --help for details.
If you click on the environment node in the explorer in the web console, the details panel shown at the bottom of the page will change:
The explorer supports clicking, dragging, mouse wheel zooming, and selecting the nodes in the graph for more information (and available actions) for the selected node. If you ever get lost in the explorer, click the zoom to fit icon in the lower right corner of the explorer.
If we click on the
Detail tab for our environment, we'll see something like:
zrok account you can
zrok enable multiple environments. This will allow you to run
zrok share in one environment, and
zrok access in other environments.
Your environment is fully ready to go. Now we can move on to the fun stuff...
zrok is designed to make sharing resources as effortless as possible, while providing a high degree of security and control.
Ephemeral by Default
Shared resources are ephemeral by default; as soon as you terminate the
zrok share command, the entire share is removed and is no longer available to any users. Identifiers for shared resources are randomly allocated when the share is created.
Public Shares and Frontends
Resources that are shared publicly are exposed to any users on the internet who have access to the
zrok instance's "frontend".
A frontend is an HTTPS listener exposed to the internet, that lets any user with your ephemeral share token access your publicly shared resources.
For example, I might create a public share using the
zrok share public command, which results in my
zrok instance exposing a URL like
https://2ptgbr8tlfvk.share.zrok.io to access my resources.
In this case, my share was given the "share token" of
2ptgbr8tlfvk. That URL can be given to any user, allowing them to immediately access the shared resources directly from my local environment, all without exposing any access to my private, secure environment. The physical network location of my environment is not exposed to anonymous consumers of my resources.
Here is the
--help output from
zrok share public:
zrok share public
<target> defines the path to the local resource that you intend to share. The form of
<target> depends on the
--backend-mode that you're using.
In the case of
<target> should be a URL to an HTTP endpoint.
In the case of
<target> is the path to a file on disk that serves as the "root" of the file tree to be shared.
If we return to the web console, we see our share in the explorer:
If we click on our new share in the explorer, we can see the share details:
If we click on the frontend endpoint a new browser tab opens and we see the content of our share:
If we click on the environment in the explorer, we're shown all of the shares for that environment (including our new share), along with a spark line that shows the activity:
And as soon as I terminate the
zrok share client, the resources are removed from the
If we try to reload the frontend endpoint in our web browser, we'll see:
zrok also provides a powerful private sharing model. If I execute the following command:
zrok service will respond with the following:
Rather than allowing access to your service through a public frontend, a private share is only exposed to the underlying OpenZiti network, and can only be accessed using the
zrok access command.
zrok access private wvszln4dyz9q command can be run by any
zrok user, allowing them to create and bind a local HTTP listener, that allows for private access to your shared resources.
Proxy Backend Mode
Without specifying a backend mode, the
zrok share command will assume that you're trying to share a
proxy resource. A
proxy resource is usually some private HTTP/HTTPS endpoint (like a development server, or a private application) running in your local environment. Usually such an endpoint would have no inbound connectivity except for however it is reachable from your local environment. It might be running on
localhost, or only listening on a private LAN segment behind a firewall.
For these services a
proxy share will allow those endpoints to be reached, either publicly or privately through the
Web Backend Mode
zrok share command accepts a
--backend-mode option. Besides
proxy, the current
v0.3 release (as of this writing) also supports a
web mode. The
web mode allows you to specify a local folder on your filesystem, and instantly turns your
zrok client into a web server, exposing your web content either publicly or privately without having to a configure a web server.
zrok shares are ephemeral unless you specifically create a "reserved" share.
A reserved share can be re-used multiple times; it will survive termination of the
zrok share command, allowing for longer-lasting semi-permanent access to shared resources.
The first step is to create the reserved share:
$ zrok reserve public --backend-mode web v0.3_getting_started
[ 0.275] INFO main.(*reserveCommand).run: your reserved share token is 'mltwsinym1s2'
[ 0.275] INFO main.(*reserveCommand).run: reserved frontend endpoint: https://mltwsinym1s2.share.zrok.io
I'm asking the
zrok service to reserve a share with a
web backend mode, pointing at my local
You'll want to remember the share token (
mltwsinym1s2 in this case), and the frontend endpoint URL. If this were a private reserved share, there would not be a frontend URL.
If we do nothing else, and then point a web browser at the frontend endpoint, we get:
This is the
404 error message returned by the
zrok frontend. We're getting this because we haven't yet started up a
zrok share for the service. Let's do that:
$ zrok share reserved mltwsinym1s2
...results in a new share backend starting up and connecting to the existing reserved share:
And now if we refresh the frontend endpoint URL in the web browser, we'll see an index of the
With the reserved share, we're free to stop and restart the
zrok share reserved command as many times as we want, without losing the token for our share.
When we're done with the reserved share, we can release it using this command:
$ zrok release mltwsinym1s2
[ 0.230] INFO main.(*releaseCommand).run: reserved share 'mltwsinym1s2' released
zrok lets you easily and securely share resources with both general internet users (through public sharing) and also with other
zrok users (through private sharing).
Here's a quick review of the
zrok mental model and the vocabulary.
Instance and Account
You create an account with a
zrok instance. Your account is identified by a username and a password, which you use to log into the web console. Your account also has a secret token, which you will use to authenticate from the
zrok command-line to interact with the instance.
You create a new account with a
zrok instance through the
zrok invite command.
Using your secret token you use the
zrok command-line interface to create an environment. An environment corresponds to a single command-line user on a specific host system.
You create a new environment by using the
zrok enable command.
Once you've enabled an environment, you then create one or more shares. Shares have either a public or private sharing mode. Shares share a specific type of resource using a backend mode. As of this writing
zrok supports a
proxy backend mode to share local HTTP resources as a reverse proxy.
zrok also supports a
web backend mode to share local file and HTML resources by enabling a basic HTTP server.
Every share is identified by a share token. Public shares can be accessed through either a frontend instance offered through the
zrok instance, or through the
zrok access command. Private shares can only be accessed through the
zrok access command.
You use the
zrok share command to create and enable ephemeral shares.
zrok supports creating shares that have a consistent share token that survives restarts of the
zrok share command. These are considered non-ephemeral, and is callled a reserved share.
You use the
zrok reserve command to create reserved shares. Reserved shares last until you use the
zrok release command to delete them.
Self-Hosting an Instance
Interested in self-hosting your own
zrok instance? See the self-hosting guide for details.