Headscale vs NetBird vs Defguard: Self-Hosted Mesh VPN for VPS Operators (2026)

Headscale vs NetBird vs Defguard: Self-Hosted Mesh VPN for VPS Operators (2026)

By Fanny Engriana Β· Β· 12 min read Β· 11 views

Connecting a fleet of VPS instances that span Hostinger shared, Hetzner cloud, and a couple of bare-metal boxes used to mean port-forwards, IP allowlists, and the constant dread of an exposed admin panel showing up on Shodan. Mesh VPNs changed that calculus. Three projects now compete for the self-hosted operator's attention in 2026: Headscale, NetBird, and Defguard β€” all WireGuard-based, all open source, but each pulling in a different direction.

I run seven aggregator sites on Hostinger plus 50+ client projects across various cloud providers at Warung Digital Teknologi, and I've migrated production traffic through every one of these stacks at least once. This is not a paper comparison. It's the writeup I wish existed before I spent two weekends ripping out a Headscale deployment that turned out to be wrong for the use case.

If you operate VPS infrastructure β€” whether that's three Hetzner nodes hosting WordPress sites or thirty Contabo boxes running a SaaS backend β€” picking the right mesh VPN affects deployment speed, attack surface, and how cleanly you sleep at night. Let's get into it.

Why mesh VPN beats traditional WireGuard or OpenVPN in 2026

Plain WireGuard on a VPS works great until you have more than three nodes. The peer config files start sprawling. Adding a new server means SSH-ing into every other server to update wg0.conf. Key rotation becomes a forty-minute project. I lived this for about eighteen months across the cluster powering CyberShieldTips, HoroAura, and our QuickExam stack before giving up.

Mesh VPN tools fix the coordination problem. They run a control plane that holds peer metadata, distributes keys, and lets you add or remove a node with a single command. The actual data path is still WireGuard, so kernel-level performance stays β€” typical throughput on a modern Hetzner CCX13 hits 4–6 Gbps before CPU becomes the bottleneck. The control plane only handles signaling, not your traffic.

That separation is the single most important architectural detail when comparing the three tools. How each one handles control-plane exposure, key custody, and peer authentication is where the differences really live.

Quick comparison: Headscale vs NetBird vs Defguard at a glance

FeatureHeadscaleNetBirdDefguard
Latest version (May 2026)v0.23.0v0.70.5v1.5 (2.0 in roadmap)
LicenseBSD-3-ClauseApache 2.0Apache 2.0 (Enterprise tier)
Client compatibilityOfficial Tailscale clientsCustom NetBird clientsCustom Defguard clients
SSO / OIDCOIDC supportedMandatory (Zitadel/Keycloak)Built-in SSO + external IdP
MFAVia OIDC providerVia IdP (POSTURE checks)Native TOTP, biometry
Control plane exposurePublic-facingPublic-facing (all components)Segmented (core never exposed)
Memory footprint~80 MB RSS~180 MB RSS (signal+mgmt+dashboard)~250 MB RSS (core+gateway+proxy)
Setup time (1-node)15 minutes30 minutes45–60 minutes
Best forHome lab, small teamsMulti-cloud ops, MSPsRegulated enterprise

Headscale: the lightweight Tailscale stand-in

Headscale is the project that started the self-hosted mesh VPN movement seriously taking off in 2022. It's a re-implementation of the Tailscale coordination server in Go, and as of May 2026 it has surpassed 30,000 stars on GitHub. Version 0.23.0 (the most recent stable as of this article) ships as a single static binary with optional Docker images.

The trick that makes Headscale interesting is client compatibility. You install the official Tailscale client on your devices β€” the same one shipped via Apple App Store, Microsoft Store, and most Linux package managers β€” and point it at your Headscale server instead of the Tailscale SaaS coordination URL. You inherit a polished, well-tested client without having to maintain it yourself.

What Headscale handles well

The setup is genuinely fast. On a 1-vCPU Hetzner CX11 box, I had a working coordination server in 15 minutes β€” installing the binary, generating a config file with headscale.yaml, opening port 8080 behind a Caddy reverse proxy with automatic TLS, and registering the first node. Total RSS at idle sits around 80 MB on my measurement, which means it'll happily run on the same VPS as a small Postgres or a low-traffic blog without resource contention.

ACLs are surprisingly powerful for an open-source tool. You write JSON policies that map users to tagged hosts, and the server enforces them by only signaling permitted peer pairs. Across the seven aggregator sites I run, I tag prod boxes tag:web-prod and dev boxes tag:dev, then let only my admin user reach prod while the team has dev access. Three lines of policy, done.

Where Headscale falls short

The control plane is public-facing. There's no way around it β€” clients need to reach the coordination server over the internet to register. If your security model can't tolerate a public-facing Go service, Headscale is out before you start. In practice the attack surface is small (the binary handles a narrow protocol) but you're trusting the project's vulnerability-response cadence, which is volunteer-maintained.

OIDC integration works but it's bolted on. You wire it up via config file with no admin UI to configure providers, and SCIM provisioning isn't supported. For a five-person team this doesn't matter; for a fifty-person team you'll feel it.

There's also no built-in dashboard. You manage everything through the headscale CLI on the server. Several community projects (headscale-ui, headplane) provide a web frontend, but they add another moving part. I'd recommend headplane for teams of more than three operators.

Who should pick Headscale

Solo operators, home labbers, small dev teams (less than 10 people), and anyone already invested in the Tailscale client ecosystem. If your team's laptops already have Tailscale installed and you just want to escape the per-user pricing past the free tier's 100-device limit, Headscale is the obvious move. I run Headscale myself on the personal infra side β€” three VPS, a NAS, two laptops β€” and it's been stable for 14 months without a single incident.

NetBird: the multi-cloud workhorse

NetBird is what I'd call the most operationally serious of the three. It's a complete platform β€” control server, signal server, dashboard, native clients for every major OS β€” released under Apache 2.0. Version 0.70.5 dropped in early May 2026, and the release pace is aggressive: roughly one minor version per month with substantive feature work.

The defining design choice is that NetBird requires SSO from day one. You don't get a "create local user" form. Before you can register a single peer, you have to wire up an OIDC identity provider β€” Zitadel (which they bundle in their docker-compose) or Keycloak, Okta, JumpCloud, Authelia, or anything else that speaks OIDC. This is more friction at install time but it pays off because user lifecycle is handled by your IdP. Suspend a user in Okta, their NetBird access vanishes within minutes.

The 2026 features that matter

NetBird shipped two changes in 2026 that genuinely shifted what's possible with self-hosted mesh:

  • v0.65 β€” Built-in reverse proxy. The management server now exposes internal services to the public internet behind SSO/PIN/password gates. Translation: you can run a private-by-default Grafana on a peer node and surface it publicly with auth, without standing up a separate proxy.
  • v0.67 β€” Layer 4 reverse proxy. The proxy now handles TLS passthrough, raw TCP, and UDP. Database ports, game servers, VoIP traffic β€” all routable through the same auth-gated pipeline.
  • CrowdSec integration. The proxy blocks malicious IPs based on CrowdSec's reputation feed. For exposed services this is a meaningful baseline of defense without writing a single fail2ban rule.
  • POSTURE checks. Deny network access based on device OS version, running processes, geo-location. I use this to require macOS 14+ on any device touching production.

NetBird's footprint and ops reality

Memory is heavier β€” roughly 180 MB RSS for the management + signal + dashboard combined, plus whatever your Zitadel deployment consumes (another 200–400 MB). The minimum viable VPS is a Hetzner CX21 (4 GB RAM) or equivalent. Setup takes 30 minutes if you follow the docker-compose path; budget an hour the first time if you're integrating an existing Keycloak.

One tradeoff worth knowing: NetBird's architecture exposes both control and data planes publicly when self-hosted. The signal server has to be reachable for NAT traversal, and the management API needs to be reachable for client check-ins. This isn't a vulnerability β€” it's how the design works β€” but it means you cannot run NetBird's coordination components in a network segment isolated from the public internet.

Who should pick NetBird

Multi-cloud operators, MSPs managing client infrastructure, dev teams above 10 people, anyone who already runs an OIDC provider, and teams that want a polished web dashboard out of the box. I migrated the cluster running CyberShieldTips and four other aggregator blogs to NetBird in February 2026 specifically because the built-in reverse proxy let me retire a Caddy + Authelia combo and consolidate three services into one. The 30 percent reduction in moving parts paid for the migration time inside a month.

Defguard: the security-paranoid choice

Defguard is the youngest of the three projects and the most architecturally distinct. It's built around what they call a "secure-by-design" principle: the control plane is segmented so the core (which holds your secrets and policy) never has a public network path. Public-facing components β€” the proxy and gateway β€” are stateless and communicate inward only through narrowly-defined channels.

This matters when you're under audit. If you're running a fintech, a healthcare service handling PHI, or anything that triggers SOC 2 Type II checks, Defguard's architecture gives you a defensible answer to "where does the secret material live?" The answer is "in a network segment that has no inbound internet connectivity," which is much easier to explain to auditors than "on a publicly-reachable Go service."

Native MFA and the WireGuard 2FA story

Defguard's killer feature is native multi-factor authentication on the WireGuard connection itself. Most mesh VPNs do MFA at the user-login layer (you authenticate to the dashboard with TOTP, then the dashboard issues VPN credentials). Defguard does MFA at the tunnel layer β€” every connection requires a second factor before traffic flows. The 1.5 release added biometric MFA via mobile clients, and external SSO/IdP MFA support reached the desktop client.

Practical implication: if a laptop with a valid Defguard client is stolen, the attacker still can't connect to the VPN without the second factor. Compare this to a Tailscale or NetBird setup where the device certificate alone is sufficient until you manually revoke it.

Defguard's downsides

Setup is the hardest of the three. You're standing up four components β€” core, gateway, proxy, and an enrollment service β€” usually via the official docker-compose, and you'll spend 45–60 minutes the first time. RSS sits around 250 MB combined.

The client ecosystem is younger. Windows uses WireGuardNT under the hood (good β€” that's the modern, performant kernel driver), and macOS now has a native Swift client published in the App Store. The Android and iOS clients exist but feel less polished than NetBird's. Linux is solid via the standard wg-quick tooling.

One practical gap: Device Posture Checks are still on the roadmap (planned for 2.1 in early Q2 2026 per the project's public timeline). If you specifically need to enforce "client must be on macOS 14.5 with FileVault enabled" today, NetBird wins this round.

Who should pick Defguard

Regulated industries β€” finance, healthcare, defense contractors β€” where the attack surface argument actually shows up in audit reports. Larger operations with dedicated security teams who can absorb the setup complexity. Anyone whose threat model includes a stolen-device scenario where session tokens alone shouldn't be enough to access the network.

Real-world deployment scenarios I've run

Scenario 1: Personal VPS fleet (Headscale)

Three VPS across Hetzner and Hostinger plus a NAS at home. Total nodes: 6. I run Headscale on the cheapest Hetzner CX11 (€3.79/month) co-located with a low-traffic blog. ACLs route SSH-only access to my admin laptop, allow web ports between web nodes, and give the NAS read-only access to backup destinations. Setup time: one Saturday morning. Ongoing maintenance: about ten minutes per quarter.

Scenario 2: Multi-blog aggregator cluster (NetBird)

Five web nodes serving the WordPress + Laravel stack behind cloudhostreview, cybershieldtips, and three other domains, plus two database boxes and an admin jumphost. Total nodes: 9. NetBird's reverse proxy gates a unified Grafana dashboard pulling Prometheus metrics from each node β€” a single login serves the whole observability stack. CrowdSec integration pre-filters bad IPs at the edge. RAM cost on the management VPS: a Hetzner CX21 at €5.83/month, well within budget.

Scenario 3: Client engagement with compliance constraint (Defguard)

I deployed Defguard once for a client where the auditor specifically called out "control plane must not be publicly accessible" as a finding. Defguard solved this in a day by placing the core component behind a private subnet and exposing only the proxy. The client cleared the audit two months later. Would I have reached for Defguard for a hobby project? No. For this engagement, the architecture was the entire point.

Performance: throughput and latency

All three are wrappers around WireGuard at the data plane, so raw throughput is essentially identical β€” kernel-mode WireGuard hits whatever your hardware can sustain. On a Hetzner CCX13 (dedicated AMD EPYC vCPUs), I measured roughly 4.8 Gbps peer-to-peer in iperf3 for all three, with CPU saturating one core before bandwidth became the limit.

Where they diverge is control-plane latency β€” how long it takes for a peer change to propagate. Headscale uses Tailscale's notification protocol and pushes updates within 1–2 seconds in my testing. NetBird's signal server is similar at 2–3 seconds. Defguard takes longer (5–8 seconds in my measurement) because it routes config changes through the segmented core. Not a dealbreaker for any normal use case, but worth knowing.

Cost: not just the VPS bill

Software cost is zero across the board β€” all three are open source. The hidden costs:

  • VPS for the control server: €3.79–7.99/month depending on which tool. Headscale's a CX11; NetBird needs a CX21; Defguard wants a CX31 (8 GB) for comfortable operation.
  • OIDC provider hosting (NetBird, optional for others): A bundled Zitadel adds 200–400 MB RAM. If you're already running Keycloak for other apps, free.
  • Operator time: the real cost. Headscale saves about 4 hours/month vs NetBird in admin overhead at small scale; NetBird saves about 6 hours/month vs Headscale at >10 users because of the dashboard. Defguard costs more setup time but saves time on audit prep.

Decision matrix: which one and when

If you...Pick...
Run a home lab or personal VPS fleet (less than 10 nodes)Headscale
Already use Tailscale clients and want to drop the SaaS dependencyHeadscale
Manage a multi-cloud production fleet with 10–50 nodesNetBird
Need a built-in reverse proxy with SSO gatingNetBird
Are an MSP managing client networksNetBird
Operate in a regulated industry (finance, healthcare, gov)Defguard
Need the control plane in a private network segmentDefguard
Require WireGuard-level MFA, not just login MFADefguard

Migration paths between the three

Migrating from one to another is straightforward but not invisible. WireGuard configs aren't directly portable because each tool generates its own keys and ACL semantics. Plan for a 30–60 minute outage per node when you switch β€” uninstall old client, install new client, register, verify ACLs.

The path I'd recommend: start with Headscale for any greenfield deployment under five nodes. Migrate to NetBird when you cross ten nodes or pick up a second admin. Move to Defguard only when a specific compliance or security requirement forces the architecture change. Don't pre-optimize for Defguard's complexity if you don't need its security model.

Common questions from the field

Can I run any of these on a 1 GB RAM VPS?

Headscale: yes, comfortably. NetBird: technically yes for the management/signal alone, but adding the bundled Zitadel pushes you to 2 GB minimum. Defguard: no, plan for at least 4 GB.

Do I need a domain name?

For all three, yes β€” clients connect to the control plane over TLS, and you need a real cert. Cloudflare-fronted DNS plus Caddy handles this in five minutes.

What about IPv6?

All three support IPv6 mesh networks. NetBird has the most polished IPv6 dashboard view; Headscale supports it via config but the CLI is the easier admin path; Defguard handles IPv6 cleanly in its 1.5 release.

Can I mix and match? Some nodes Headscale, some NetBird?

No β€” these are coordination protocols, not inter-operable peer formats. A node belongs to one mesh.

Which one has the best mobile experience?

NetBird's iOS and Android clients are the most polished today. Headscale leans on Tailscale's official mobile clients which are excellent. Defguard's mobile clients exist but lag in UX.

What I'd run today, by stack

For the seven aggregator sites I operate plus client work: NetBird across the board. The reverse proxy alone justifies it, and CrowdSec integration cuts a meaningful percentage of bot traffic before it ever hits Cloudflare.

For my personal infra: Headscale, because the operational simplicity is unbeatable for under ten nodes and I already had the Tailscale clients installed.

For a hypothetical fintech engagement: Defguard, every time. The audit story is too compelling to ignore.

The mesh VPN landscape is in a much better place than it was even 18 months ago. Pick the tool that matches your operational reality, not the one with the most GitHub stars. All three of these are production-grade in 2026 β€” you can't make a catastrophically wrong choice. You can, however, make a needlessly complicated one. Match tool to need, deploy, and get back to whatever you actually wanted to build.

Found this helpful?

Subscribe to our newsletter for more in-depth reviews and comparisons delivered to your inbox.