NetBird est un VPN mesh WireGuard open source (licence BSD-3) qui, contrairement à Headscale, fournit sa propre stack complète : agents, control plane, interface web et relais. Vous l'hébergez de bout en bout, sans dépendre d'aucun service tiers. Ce guide montre comment déployer le serveur (combined setup avec TLS automatique), enrôler des machines par paquet signé, accéder en SSH via le mesh, garder un accès de secours, et comprendre le plan d'adressage. Le tout testé sur une VM cloud réelle. Pour administrateurs et profils DevSecOps soucieux de souveraineté.

Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Déployer un serveur NetBird auto-hébergé avec TLS Let's Encrypt automatique.
- Enrôler des machines proprement (dépôt de paquets signé, pas de script piped).
- Vérifier le mesh et accéder en SSH à un serveur via le tunnel.
- Garder un accès de secours pour ne pas vous verrouiller dehors.
- Personnaliser le plan d'adressage (CIDR au choix, hors CGNAT).
Prérequis
Section intitulée « Prérequis »NetBird en self-hosted impose une contrainte ferme : le serveur doit être joignable depuis Internet pour émettre son certificat.
- une VM publique (1 vCPU / 2 Go suffisent d'après la doc) sous Linux ;
- un nom de domaine qui résout vers l'IP publique de la VM (ex.
netbird.exemple.fr) ; - les ports ouverts :
TCP 80et443(dashboard, API, relais, Let's Encrypt) etUDP 3478(STUN/TURN, ne passe pas par le reverse proxy) ; - Docker avec le plugin compose v2, plus
jqetcurl.
Qu'est-ce que NetBird ?
Section intitulée « Qu'est-ce que NetBird ? »NetBird crée un réseau maillé où chaque machine (un peer) reçoit une IP privée stable et parle aux autres en pair-à-pair chiffré par WireGuard, sans ouvrir de port entrant sur chaque machine. La traversée des NAT se fait par hole punching (via le service Signal et le STUN), avec repli sur un relais quand la connexion directe échoue.
Le combined setup (recommandé pour débuter) regroupe tout dans un conteneur unifié netbird-server :
- Management : le control plane (inventaire, ACL, configuration) ;
- Signal : l'échange des informations de connexion entre pairs ;
- Relay et Coturn : le relayage chiffré et le STUN/TURN ;
- un fournisseur d'identité (IdP) embarqué pour les comptes.
Un conteneur Traefik gère le TLS, un conteneur dashboard sert l'interface web.
NetBird, Tailscale ou Headscale ?
Section intitulée « NetBird, Tailscale ou Headscale ? »Les trois reposent sur WireGuard, mais ne se positionnent pas pareil.
| Tailscale | Headscale | NetBird | |
|---|---|---|---|
| Control plane | SaaS propriétaire | self-host (BSD-3) | self-host (BSD-3) |
| Clients | Tailscale | clients Tailscale | agents NetBird propres |
| Interface web | oui (SaaS) | non (CLI) | oui, intégrée |
| Relais | DERP Tailscale | DERP Tailscale | relais maison |
Là où Headscale réutilise les clients Tailscale (et reste dépendant de leur écosystème), NetBird apporte une stack 100 % indépendante avec son interface de gestion et son SSO intégré. C'est l'option la plus souveraine quand on veut tout garder en interne. Pour le control plane qui garde l'écosystème Tailscale, voir le guide Tailscale et Headscale.
Déployer le serveur NetBird
Section intitulée « Déployer le serveur NetBird »Le script officiel getting-started.sh génère les secrets, écrit le docker-compose.yml et démarre la pile. On le télécharge et on l'inspecte avant de l'exécuter (jamais en curl | bash à l'aveugle).
-
Créer l'enregistrement DNS : un
Adenetbird.exemple.frvers l'IP publique de la VM. Vérifiez la propagation :Fenêtre de terminal dig +short netbird.exemple.fr -
Récupérer et lire le script :
Fenêtre de terminal curl -fsSL https://github.com/netbirdio/netbird/releases/latest/download/getting-started.sh -o getting-started.shless getting-started.sh # on inspecte avant d'exécuter -
Lancer le déploiement en lui passant le domaine :
Fenêtre de terminal export NETBIRD_DOMAIN=netbird.exemple.frbash getting-started.shLe script pose deux questions : le reverse proxy (choisissez
0Traefik, qui gère le TLS Let's Encrypt automatiquement) et un email pour Let's Encrypt.
Vérifier le déploiement
Section intitulée « Vérifier le déploiement »Trois conteneurs doivent tourner, et le dashboard doit répondre en HTTPS avec un certificat valide.
docker ps --format "{{.Names}} {{.Status}}"# netbird-traefik Up ...# netbird-dashboard Up ...# netbird-server Up ...Testez l'accès et le certificat depuis l'extérieur :
curl -sS -o /dev/null -w "HTTP %{http_code}\n" https://netbird.exemple.fr/# HTTP 200Ouvrez ensuite https://netbird.exemple.fr dans un navigateur : l'IdP embarqué vous fait créer le compte administrateur au premier accès.
Enrôler une machine (peer)
Section intitulée « Enrôler une machine (peer) »L'erreur classique serait d'installer le client par un script piped. On utilise le dépôt de paquets signé (clé GPG vérifiée), seule méthode propre qui installe aussi le service systemd.
# clé GPG signée (import de clé, pas un script exécuté)curl -sSL https://pkgs.netbird.io/debian/public.key | sudo gpg --dearmor --output /usr/share/keyrings/netbird-archive-keyring.gpg
# dépôt signéecho 'deb [signed-by=/usr/share/keyrings/netbird-archive-keyring.gpg] https://pkgs.netbird.io/debian stable main' | sudo tee /etc/apt/sources.list.d/netbird.list
sudo apt-get updatesudo apt-get install netbirdsudo tee /etc/yum.repos.d/netbird.repo <<'EOF'[netbird]name=netbirdbaseurl=https://pkgs.netbird.io/yum/enabled=1gpgcheck=1gpgkey=https://pkgs.netbird.io/yum/repodata/repomd.xml.keyrepo_gpgcheck=1EOFsudo dnf install netbirdCréez ensuite une clé d'enrôlement dans le dashboard : Settings → Setup Keys → Create Setup Key, type Reusable.

Connectez la machine à votre management :
sudo netbird up --management-url https://netbird.exemple.fr --setup-key <VOTRE_CLE>Vérifier le mesh
Section intitulée « Vérifier le mesh »Sur chaque machine, netbird status confirme l'état des connexions :
sudo netbird status --detailVous y lisez l'IP NetBird de la machine (dans 100.x), l'état Management: Connected, et la liste des pairs avec leur statut. Un Peers count: 1/1 Connected signale que le tunnel est établi. Validez le transit avec un test applicatif entre deux pairs (un service qui écoute d'un côté, une connexion de l'autre via l'IP NetBird).
Accéder en SSH à un serveur via le mesh
Section intitulée « Accéder en SSH à un serveur via le mesh »C'est le cas d'usage roi : joindre un serveur sans exposer son port 22 sur Internet. Une fois le serveur enrôlé comme peer, son sshd répond aussi sur l'interface NetBird (wt0). Depuis une autre machine du réseau :
ssh utilisateur@<IP-NetBird-du-serveur>Le trafic passe par le tunnel chiffré : le serveur voit la connexion arriver depuis l'IP NetBird du client, route via wt0. Vous pouvez alors fermer le port 22 public, à condition de garder un accès de secours (voir ci-dessous).
Sécurité : toujours un accès de secours
Section intitulée « Sécurité : toujours un accès de secours »Ne faites jamais du mesh votre unique porte d'entrée, surtout sur du cloud. Si NetBird tombe (service en panne, ACL mal configurée qui vous coupe, clé révoquée, mise à jour ratée), vous vous verrouillez dehors.
Gardez un chemin de reprise indépendant du mesh :
- un SSH out-of-band en liste blanche : port 22 ouvert uniquement à votre IP d'administration ou un bastion, jamais au monde entier. Il ne dépend pas de NetBird ;
- l'accès console du fournisseur cloud, filet ultime si SSH et NetBird tombent (vous coupez le réseau par erreur).
L'anti-pattern « zero-trust » serait de fermer le 22 public et de tout faire passer par NetBird : un incident sur le mesh devient alors un blocage total. Le bon compromis : 22 fermé au monde mais ouvert à votre IP en secours, NetBird pour l'usage courant.
Choisir son plan d'adressage : un vrai atout de NetBird
Section intitulée « Choisir son plan d'adressage : un vrai atout de NetBird »Par défaut, NetBird attribue à chaque réseau un sous-réseau /16 tiré dans 100.64.0.0/10, le bloc CGNAT (RFC 6598) ; vos machines reçoivent donc des adresses comme 100.98.x.x.
Mais contrairement à Tailscale et Headscale, vous n'êtes pas prisonnier de ce range. Dans Settings → Networks → Network Range, vous saisissez votre propre CIDR (par exemple 10.9.1.0/24) : les IP des peers sont réallouées au changement. Vous pouvez aussi définir un DNS Domain interne personnalisé dans la même page.
| Solution | Plan d'adressage | Personnalisable ? |
|---|---|---|
| Tailscale | 100.64.0.0/10 (CGNAT) | non, client hardcodé |
| Headscale | sous-ensemble du CGNAT | non, réutilise le client Tailscale |
| NetBird | CGNAT par défaut, tout CIDR au choix | oui (Settings → Networks) |
Là où le client Tailscale impose le CGNAT (et donc Headscale aussi, puisqu'il réutilise ce client), NetBird gère sa propre stack et accepte n'importe quel CIDR privé. Si votre infrastructure utilise déjà du 100.64.x, ou si vous voulez aligner le mesh sur votre plan d'adressage maison, NetBird est le seul des trois à le permettre. C'est un argument décisif côté souveraineté de l'adressage.
Ce réglage est aussi disponible via l'API (PUT /api/accounts/{id}, champ network_range), pratique pour l'industrialiser en IaC. Voir la référence API NetBird.
À retenir
Section intitulée « À retenir »- NetBird est un VPN mesh WireGuard BSD-3, à stack complète et auto-hébergeable de bout en bout.
- Le serveur exige une VM publique, un domaine, et les ports 80/443 TCP + 3478 UDP.
- Le combined setup (
getting-started.sh, reverse proxy Traefik) gère le TLS Let's Encrypt seul. - Enrôlez les machines par dépôt de paquets signé (jamais
curl | sh, le binaire seul ne pose pas le service). - Une setup key (
Settings → Setup Keys, Reusable) puisnetbird up --management-url … --setup-key …. - Le SSH via le mesh évite d'exposer le port 22, mais gardez toujours un accès de secours out-of-band.
- Le plan d'adressage est personnalisable (
Settings → Networks → Network Range, tout CIDR), un atout face à Tailscale et Headscale verrouillés sur le CGNAT.
FAQ : questions fréquentes sur NetBird
Section intitulée « FAQ : questions fréquentes sur NetBird »Un VPN mesh souverain
NetBird est un VPN mesh basé sur WireGuard, open source sous licence BSD-3 et entièrement auto-hébergeable.Sa particularité : une stack complète et indépendante, là où Headscale se contente de remplacer le control plane de Tailscale.- agents NetBird propres (pas les clients Tailscale) ;
- control plane (Management), Signal, Relay et Coturn ;
- une interface web de gestion et un SSO intégrés.
SaaS contre self-host complet
| Tailscale | NetBird | |
|---|---|---|
| Control plane | SaaS propriétaire | self-host (BSD-3) |
| Clients | Tailscale | agents NetBird |
| Interface web | oui (SaaS) | oui, intégrée |
| Relais | DERP Tailscale | relais maison |
Dépôt de paquets signé
La méthode propre passe par le dépôt signé (clé GPG vérifiée), qui installe aussi le service :# Debian / Ubuntu
curl -sSL https://pkgs.netbird.io/debian/public.key | sudo gpg --dearmor --output /usr/share/keyrings/netbird-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/netbird-archive-keyring.gpg] https://pkgs.netbird.io/debian stable main' | sudo tee /etc/apt/sources.list.d/netbird.list
sudo apt-get update && sudo apt-get install netbird
Évitez les installations curl … | sh et les simples binaires : sans le service systemd, netbird up échoue (config error: --config is required). Connectez ensuite la machine :sudo netbird up --management-url https://netbird.exemple.fr --setup-key <CLE>
80, 443 et 3478
| Port | Protocole | Usage |
|---|---|---|
| 80 | TCP | Let's Encrypt + redirection HTTPS |
| 443 | TCP | dashboard, API/gRPC, signal, relais |
| 3478 | UDP | Coturn STUN/TURN |
Oui, via Settings puis Networks
Par défaut, NetBird attribue un /16 dans100.64.0.0/10 (CGNAT), d'où des adresses en 100.x. Mais contrairement à Tailscale et Headscale, vous pouvez le changer dans le dashboard :Settings → Networks → **Network Range**: votre propre CIDR (ex.10.9.1.0/24), les IP des peers sont réallouées au changement ;Settings → Networks → **DNS Domain**: un domaine DNS interne personnalisé.
PUT /api/accounts, champ network_range). C'est un vrai atout pour aligner le mesh sur un plan d'adressage existant.