Aller au contenu
Sécurité medium

NetBird : VPN mesh WireGuard auto-hébergé et souverain

12 min de lecture

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é.

Cartographie du réseau mesh NetBird dans le Control Center

  • 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).

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 80 et 443 (dashboard, API, relais, Let's Encrypt) et UDP 3478 (STUN/TURN, ne passe pas par le reverse proxy) ;
  • Docker avec le plugin compose v2, plus jq et curl.

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.

Les trois reposent sur WireGuard, mais ne se positionnent pas pareil.

TailscaleHeadscaleNetBird
Control planeSaaS propriétaireself-host (BSD-3)self-host (BSD-3)
ClientsTailscaleclients Tailscaleagents NetBird propres
Interface weboui (SaaS)non (CLI)oui, intégrée
RelaisDERP TailscaleDERP Tailscalerelais 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.

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).

  1. Créer l'enregistrement DNS : un A de netbird.exemple.fr vers l'IP publique de la VM. Vérifiez la propagation :

    Fenêtre de terminal
    dig +short netbird.exemple.fr
  2. 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.sh
    less getting-started.sh # on inspecte avant d'exécuter
  3. Lancer le déploiement en lui passant le domaine :

    Fenêtre de terminal
    export NETBIRD_DOMAIN=netbird.exemple.fr
    bash getting-started.sh

    Le script pose deux questions : le reverse proxy (choisissez 0 Traefik, qui gère le TLS Let's Encrypt automatiquement) et un email pour Let's Encrypt.

Trois conteneurs doivent tourner, et le dashboard doit répondre en HTTPS avec un certificat valide.

Fenêtre de terminal
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 :

Fenêtre de terminal
curl -sS -o /dev/null -w "HTTP %{http_code}\n" https://netbird.exemple.fr/
# HTTP 200

Ouvrez ensuite https://netbird.exemple.fr dans un navigateur : l'IdP embarqué vous fait créer le compte administrateur au premier accès.

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.

Fenêtre de terminal
# 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 update
sudo apt-get install netbird

Créez ensuite une clé d'enrôlement dans le dashboard : SettingsSetup KeysCreate Setup Key, type Reusable.

Création d'une setup key réutilisable dans les paramètres de NetBird

Connectez la machine à votre management :

Fenêtre de terminal
sudo netbird up --management-url https://netbird.exemple.fr --setup-key <VOTRE_CLE>

Sur chaque machine, netbird status confirme l'état des connexions :

Fenêtre de terminal
sudo netbird status --detail

Vous 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).

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 :

Fenêtre de terminal
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).

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.

SolutionPlan d'adressagePersonnalisable ?
Tailscale100.64.0.0/10 (CGNAT)non, client hardcodé
Headscalesous-ensemble du CGNATnon, réutilise le client Tailscale
NetBirdCGNAT par défaut, tout CIDR au choixoui (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.

  • 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) puis netbird 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.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn