Installing the agent
One binary (ztna), one install command per platform. The installer
detects OS and architecture, downloads the correct build, installs as a system
service, and (if ZTNA_AUTH_KEY is set) auto-registers.
Quick install
$ curl -fsSL https://login.quickztna.com/install.sh | sh
# With auth key (headless fleet rollout):
$ curl -fsSL https://login.quickztna.com/install.sh | ZTNA_AUTH_KEY=tskey-auth-xxx sh What the installer does
- Detects OS (
linux,darwin,windows) and architecture (amd64,arm64). - Queries
/api/client-versionwithaction: "check"and yourplatformto get the latest release URL. - Downloads the binary from
/api/releases/*over HTTPS. - Verifies the SHA-256 checksum against the release manifest.
- Installs to
/usr/local/bin/ztna(Linux/macOS) orC:\\Program Files\\QuickZTNA\\ztna.exe(Windows). - Installs + starts a system service: systemd on Linux, launchd on macOS, Windows service on Windows.
- If
ZTNA_AUTH_KEYis set: runsztna login --auth-key+ztna up.
Platform requirements
WireGuard kernel module (built into mainline 5.6+, or wireguard-dkms). Falls back to userspace (wireguard-go) if kernel module missing.
Uses userspace WireGuard (utun device). Requires admin password for network extension on first install.
Uses Wintun driver (installed automatically). Requires admin privileges for install only; daily operation needs no admin.
ARM supported: Apple Silicon (M1/M2/M3), Graviton, Raspberry Pi 4/5 (64-bit OS).
HTTPS 443 to login.quickztna.com, UDP 3478 (STUN), WSS 443 (DERP). Inbound is not required.
MDM rollout — Intune, Jamf, Kandji
Most MDMs can push a shell or PowerShell script. The installer is idempotent — running it twice is safe.
Microsoft Intune (Windows + macOS)
- Devices → Configuration → Scripts and remediations → Add
- Platform: macOS or Windows
- Script content:
$env:ZTNA_AUTH_KEY = "tskey-auth-xxx" irm https://login.quickztna.com/install.ps1 | iex - Assignment: your target device group
- Set execution frequency: once (or weekly for auto-healing)
Jamf (macOS)
Create a policy with a shell script payload. Scope to devices or a Smart Group. Trigger on enrolment.
Kandji / Workspace One
Use a Custom App or Automated App with the install script above. Pass the auth key as a secret variable.
Ansible playbook
- name: Install QuickZTNA on Linux + macOS
hosts: all
become: true
vars:
ztna_auth_key: "{{ lookup('env', 'ZTNA_KEY') }}"
tasks:
- name: Run installer
shell: |
curl -fsSL https://login.quickztna.com/install.sh | ZTNA_AUTH_KEY={{ ztna_auth_key }} sh
environment:
ZTNA_AUTH_KEY: "{{ ztna_auth_key }}"
args:
creates: /usr/local/bin/ztna
- name: Verify connection
command: ztna status --json
register: ztna_status
- name: Report tailnet IP
debug:
msg: "{{ (ztna_status.stdout | from_json).tailnet_ip }}" cloud-init (AWS, GCP, DigitalOcean)
#cloud-config
write_files:
- path: /etc/environment
append: true
content: "ZTNA_AUTH_KEY=tskey-auth-xxx\n"
runcmd:
- curl -fsSL https://login.quickztna.com/install.sh | ZTNA_AUTH_KEY=tskey-auth-xxx sh
- ztna set --advertise-tags tag:server,tag:prod For Terraform providers that accept user_data (AWS EC2, GCP Compute Engine, DigitalOcean Droplets), render the cloud-init above via a template_file data source.
Docker / Kubernetes
Run the agent in userspace mode — no TUN device, no privileged container, no host-network dependency.
FROM ubuntu:24.04
ARG ZTNA_AUTH_KEY
RUN apt-get update && apt-get install -y curl && \
curl -fsSL https://login.quickztna.com/install.sh | ZTNA_AUTH_KEY=$ZTNA_AUTH_KEY sh
ENTRYPOINT ["ztna", "up", "--userspace"] Manual binary install (offline / air-gapped)
- Download the binary from login.quickztna.com/download on an internet-connected machine.
- Verify the SHA-256 checksum from the same page.
- Copy to the target device +
chmod +x. - Move to
/usr/local/bin/ztnaor equivalent. sudo ztna install— sets up the service.sudo ztna up --auth-key ...— registers + connects.
Uninstall
$ sudo ztna uninstall
→ Stopping service
→ Removing /etc/systemd/system/quickztna-svc.service
✓ Service removed · config preserved in ~/.config/ztna/
# To fully purge: sudo rm -rf /usr/local/bin/ztna ~/.config/ztna Troubleshooting
Outbound HTTPS 443 to login.quickztna.com blocked. Add firewall exception.
Run with sudo. The installer needs root to install the systemd unit.
System Settings → Privacy & Security → Allow QuickZTNA. Then re-run ztna up.
Run PowerShell as admin. Uninstall existing Wintun. Re-run installer.
Issue a new one from the dashboard and re-run with the new key.
See also
- CLI: ztna up — every flag the agent accepts
- Issuing auth keys — what to create before rolling out
- Architecture: Go agent — what's actually running on each device