Access to internal systems over WireGuard, granted by the groups in your directory, with the control plane run in Switzerland, the EU or your own datacentre. Pilae runs it on your own servers, or in Zurich, Switzerland, and eleven other Pilae Cloud regions.
- Licence
- BSD-3-Clause (clients), AGPL-3.0-only (servers)
- Runs on
- Your own hardware, or any of twelve Pilae regions — six of them in Switzerland and the EU
- Upgrades
- Pinned, tested against your configuration, applied in your window
- Upstream
- netbird.io
Running NetBird in production: what it takes
Deploy the control plane on PostgreSQL
Management, signal and relay, pinned to a version we have run, on PostgreSQL rather than the default SQLite files, audit log included. The relay runs as its own service. The control plane is published through the gate on port 443, with UDP 3478 open for STUN.
Sign-on and groups from your directory
People sign in only through Keycloak or Entra ID, with groups read from the token. Peer session expiration makes each laptop enrolled through sign-on re-authenticate on a schedule, so a disabled account stops connecting at the next expiry.
Keep policies in Git
Groups, policies, routes, DNS and posture checks are Terraform in your repository. We never create a group by hand with the name of a directory group, because NetBird will not sync a group whose name is already taken.
Restore under the same hostname
The database, the data directory and config.yaml, which holds the store encryption key, go offsite daily, encrypted. Once a month we restore them into a scratch environment under the same hostname and check that peers, policies and setup keys are there.
Upgrade without dropping tunnels
Direct connections do not pass through the server, so they survive its restart, and the separate relay keeps relayed ones up. An upgrade is tried on a copy first and applied by the Pilae Agent in your window once you approve it. Client updates roll out separately, through your MDM or package repository.
What NetBird is, and who runs it
Self-hosted NetBird for zero-trust access to internal systems
NetBird connects laptops, phones and servers with WireGuard tunnels and decides who reaches what from the groups in your identity provider. A management server holds the peers, groups and policies. A signal service helps two devices find each other, and a relay carries the connections that cannot go direct. Traffic runs directly between the devices, not through the server, and is encrypted with keys that never leave them. The project is developed by NetBird GmbH in Berlin.
It is for organisations replacing a VPN that opens the whole network once someone is in, or a hosted service such as Tailscale or Zscaler Private Access where someone else runs the policy layer. Access is granted per group and per application. Posture checks can require an operating system version or a country before a policy lets a device through. Routing peers give access to subnets whose machines cannot run a client, and private DNS gives each system a name. This is separate from the private network Pilae runs for the apps it operates. NetBird is the network your own staff use to reach your own systems, under policies you write.
NetBird in production: sign-on, policies as code and upgrades
We run the control plane on PostgreSQL instead of the default SQLite file, on a dedicated machine on your premises or in a Pilae Cloud region, one of six in Switzerland and the EU or six further afield. Unlike most of the apps we run, it has to be reachable from outside, because a laptop talks to it before it is on any private network. It is published through the gate on port 443, with UDP 3478 open for STUN, and the relay runs as its own service. Sign-in goes through Keycloak or Entra ID, and groups arrive in the token. Policies, routes, DNS and posture checks are Terraform in your repository.
The database, the configuration and the encryption key are backed up daily, encrypted, to an offsite location in your chosen country. Every month we restore them into a scratch environment that answers to the same name, because clients only find a restored server under the name they enrolled with. Probes check it every 60 seconds, and a failure alerts an engineer. The Pilae Agent tries each upgrade on a copy and applies it in your window once you approve it. Connections already established keep working while the management server restarts; enrolment and policy changes wait until it is back.
NetBird licence and editions
The clients and the servers are both under open-source licences, set out below. Because a licensed server has to reach the NetBird licence service, the paid features need a connection out of an air-gapped site. We price our operation on request. Talk to us about the access you want to move.
NetBird system requirements
Before anything is deployed, this is what has to exist. We size it with you in the first session, and we say so when your own hardware is already enough.
- CPU and memory
- 2 vCPU · 4 GBUpstream asks for one CPU and 2 GB at least. Management and signal carry no user traffic, so they grow with peers and policy changes rather than bandwidth. The relay carries only the connections that cannot go direct.
- Database
- PostgreSQLHolds peers, groups, policies and setup keys. We point the audit log at it too, which otherwise stays in a SQLite file of its own. SQLite cannot be shared by a second management instance and is backed up by stopping the server.
- Public ports
- TCP 443 · UDP 3478Laptops and phones reach the management server before they are on any private network, so it is published through the gate on 443. The gate passes the client address on, so country checks see the device and not the gate. STUN needs UDP 3478, which no HTTP proxy can carry.
- Identity provider
- OIDCKeycloak, Entra ID or any OIDC provider, with groups in the token. Entra ID sends group object IDs rather than names, and drops the claim for a user in more than 200 groups, so only the groups NetBird needs are assigned to it. SCIM provisioning needs the commercial licence.
- DNS and TLS
- 2 hostnamesOne for the management server, kept for life: every client is enrolled against it, and a restored server is only found again under the same name. One for the relay, whose address clients learn from the server.
Migrating from Tailscale to NetBird
Tailscale and NetBird are built the same way: WireGuard tunnels between devices, a coordination service that hands out public keys and policy, and relays for the connections that cannot go direct. The move changes who runs the coordination service. Nothing carries across on its own. Every device gets the NetBird client and enrols again, which for laptops is a software deployment through your MDM rather than a visit to each desk. NetBird has no official importer for the tailnet policy file, so each rule, tag, subnet router and exit node is rewritten as NetBird groups, policies and routes. That rewrite is where the time goes, and it is where rules nobody can explain any more are removed rather than copied.
Rewrite the policy file as code
ACLs or grants, tags, subnet routers and exit nodes become NetBird groups, policies, routing peers and exit nodes in Terraform, reviewed rule by rule against what the old policy actually allowed.
Check the address range, then connect sign-on
Tailscale and NetBird both draw addresses from 100.64.0.0/10. We check the NetBird range against the addresses in use before the first device joins, because changing it later re-addresses every peer. Then we connect Keycloak or Entra ID.
Enrol servers, then people
Servers join with one-off setup keys that place them in their groups. Laptops get the client and your management URL through your MDM on Windows and macOS. Phones are pointed at your server from the app settings and sign in through your IdP.
Take Tailscale off each machine
On Linux, a leftover Tailscale firewall rule can drop traffic from the shared address block that arrives on any other interface, NetBird traffic included. So the old client is removed and its rules checked machine by machine. The subscription ends when the last device has moved.
NetBird access policy, written as Terraform
# access/finance.tf in the acme repository (excerpt)
data "netbird_group" "finance" {
# Entra ID sends the group's object ID in the groups claim, not its name
name = "5d3c9a8e-1f2b-4c7d-9e6a-0b8f2d4c1a37"
}
resource "netbird_group" "erp" {
name = "erp"
}
resource "netbird_network_resource" "erp_web" {
network_id = netbird_network.datacentre.id
name = "erp-web"
address = "erp.acme.internal"
groups = [netbird_group.erp.id]
enabled = true
}
resource "netbird_posture_check" "managed_laptop" {
name = "managed-laptop"
os_version_check {
darwin_min_version = "14.0"
windows_min_kernel_version = "10.0.22631"
}
geo_location_check {
action = "allow"
locations = [{ country_code = "CH" }, { country_code = "FR" }]
}
}
resource "netbird_policy" "finance_to_erp" {
name = "finance to erp"
enabled = true
source_posture_checks = [netbird_posture_check.managed_laptop.id]
rule {
name = "https only"
action = "accept"
bidirectional = false
enabled = true
protocol = "tcp"
ports = ["443"]
sources = [data.netbird_group.finance.id]
destinations = [netbird_group.erp.id]
}
}
What Pilae is responsible for
A pinned version
A version we have run, not whatever latest resolves to that day.
A runbook
What it depends on, how it fails, what to do about it. In your repository.
A restore drill
Backups restored on a schedule. A backup nobody has restored is a file.
A patch window
Security updates in a window you agreed, with a rollback ready.
Someone watching
Every endpoint probed on the minute. An alert reaches a person, not a dashboard nobody opens.
- Where it runs
- zur1, fra1, fal1, gra1, ams1, hel1, lon1, ash1, hil1, sin1, tok1, syd1, on-premZurich, Frankfurt, Falkenstein, Gravelines, Amsterdam, Helsinki, London, Ashburn, Hillsboro, Singapore, Tokyo, Sydney, Your own hardware
- Who holds the credentials
- You do. Ours are separate, named, logged and revocable with one command. We ask before anything changes outside an agreed window.
- If you leave
- The machine, the data, the compose files and the runbook are already yours. Nothing stops when our access does.
What drives the price of running NetBird
Pricing is on request: a fixed price for onboarding, then a monthly price for NetBird, quoted in writing within five business days. The plans set what every deployment includes; these are the inputs the quote is built from.
- Instance size
- The CPU, memory and, where a model runs, the GPUs the app needs for your users and your data.
- High availability
- One machine with tested restores, or a replicated setup that keeps serving when a node fails.
- Storage and backups
- How much data it holds, how long backups are kept, and point-in-time recovery for its database.
- Plan and support
- Essential, Business or Enterprise: support hours, response times in the contract and how often we review the service with you.
- Region
- Your own hardware, where the infrastructure is already yours, or a Pilae Cloud region, where it is passed through at cost plus a fixed margin.
- Sign-on and integrations
- Single sign-on, directory sync, mail relays and the other systems the app has to reach.
NetBird: common questions
Is NetBird open source?
Does our traffic pass through the NetBird server?
Where does the control plane run?
Can NetBird replace Zscaler Private Access?
What happens if the NetBird server is down?
Also in engineering and security
Forgejo
Git hosting, code review, issues, packages and CI in one service, run in Switzerland, the EU or your own datacentre, with CI runners on machines of their own.
Replaces GitHub, GitLab.com, Bitbucket
GitLab
Git repositories, merge requests, CI/CD pipelines and registries in one application, run on your own hardware or in Swiss and EU regions, with runners on machines you place.
Replaces GitHub Enterprise Cloud, GitLab.com, Azure DevOps
Harbor
A private container registry that scans and replicates your images and caches Docker Hub, run in Switzerland, the EU or your own datacentre.
Replaces Docker Hub, Amazon ECR, Azure Container Registry
Bring us your NetBird. We will tell you what it takes.
Thirty minutes on the deployment you already have, or the one you are about to start.