Aller au contenu
Sécurité medium

ZeroTier : réseau virtuel self-hosted sur Linux

12 min de lecture

ZeroTier relie des machines dispersées dans un réseau virtuel où elles se comportent comme si elles étaient sur le même switch Ethernet, même derrière des NAT. Ce guide montre comment l'installer depuis un dépôt signé, rejoindre un réseau, puis auto-héberger son controller pour ne pas dépendre du service de ZeroTier, et valider la connectivité. Il s'adresse aux administrateurs débutants à intermédiaires. Il dit aussi, sans détour, quand ZeroTier est le bon choix et quand Tailscale ou WireGuard font mieux. Les commandes et sorties proviennent d'un lab réel à trois nœuds.

  • Comprendre ce qui distingue ZeroTier (couche 2) de Tailscale et WireGuard (couche 3).
  • Installer ZeroTier par dépôt signé, sans script exécuté à l'aveugle.
  • Rejoindre un réseau et lire l'état avec zerotier-cli.
  • Auto-héberger le controller via son API REST locale.
  • Diagnostiquer un nœud bloqué ou une connexion coincée en relais.
  • un ou plusieurs hôtes Linux (le guide vaut aussi pour Windows, macOS, mobile, seul le client change) ;
  • un accès sudo ;
  • la sortie UDP 9993 autorisée sur le pare-feu (le port de transport de ZeroTier) ;
  • pour l'auto-hébergement du controller : une machine toujours allumée avec une IP stable.

ZeroTier se présente comme un switch Ethernet programmable planétaire. Là où un VPN classique route de l'IP entre deux points, ZeroTier émule un réseau Ethernet virtuel : vos machines partagent un segment de niveau 2, avec broadcast, multicast et découverte de services, comme sur un vrai LAN.

Son architecture tient en deux couches. VL1 est le réseau pair-à-pair chiffré qui sert de transport : chaque nœud reçoit une adresse ZeroTier de 10 caractères hexadécimaux, dérivée de sa clé publique. VL2 est la couche d'Ethernet virtuel avec ses règles d'accès. Le chiffrement est de bout en bout (Curve25519/Ed25519 pour les clés, Salsa20/Poly1305 pour les données) : les clés privées ne quittent jamais la machine.

Deux rôles à ne pas confondre. Le controller est l'autorité qui configure un réseau (membres autorisés, plan d'adressage, routes) ; il ne voit pas passer le trafic. Les roots (le planet), eux, aident les nœuds à se découvrir et servent de relais de secours. Par défaut, ces roots sont opérés par ZeroTier, Inc., un point sur lequel nous reviendrons.

C'est la vraie question, et la réponse est nuancée. Les trois créent un réseau privé chiffré, mais ne jouent pas dans la même catégorie.

CritèreZeroTierTailscaleWireGuard nu
Couche réseauL2 (Ethernet)L3 (IP)L3 (IP)
Broadcast / multicastOuiNonNon
DébitPlus faible (userspace)Élevé (noyau)Le plus élevé
ProtocolePropriétaireWireGuardWireGuard (standard)
LicenceMPL 2.0Client BSDGPLv2
Self-hostController oui, roots difficilesHeadscaleTotal

Le point décisif est L2 contre L3. ZeroTier gagne franchement quand vous avez besoin de la couche 2 : jeux en réseau local, découverte par broadcast (Bonjour, mDNS), bridging vers un LAN physique, protocoles industriels, ou une flotte hétérogène d'appareils exotiques où WireGuard n'est pas disponible.

Partout ailleurs, soyez lucide. ZeroTier chiffre en espace utilisateur, ce qui plafonne son débit : des mesures indépendantes donnent WireGuard près de deux fois plus rapide. Pour un accès distant IP classique, WireGuard ou Tailscale sont plus rapides et plus simples à rendre pleinement souverains.

ZeroTier propose un dépôt APT/DNF signé GPG. On l'utilise plutôt que le script curl ... | bash de la page d'accueil : télécharger la clé de signature dans un trousseau puis installer un paquet vérifié est une pratique saine, alors qu'exécuter un script distant à l'aveugle ne l'est pas.

Fenêtre de terminal
curl -fsSL 'https://download.zerotier.com/contact%40zerotier.com.gpg' \
| sudo gpg --dearmor -o /usr/share/keyrings/zerotier.gpg
echo "deb [signed-by=/usr/share/keyrings/zerotier.gpg] https://download.zerotier.com/debian/bookworm bookworm main" \
| sudo tee /etc/apt/sources.list.d/zerotier.list
sudo apt update
sudo apt install zerotier-one

Remplacez bookworm par le nom de code de votre distribution (jammy, noble, etc.).

Vérifiez l'installation et notez l'adresse de ce nœud, une empreinte de 10 caractères :

Fenêtre de terminal
sudo zerotier-cli info
# 200 info 3c729e5e16 1.16.2 ONLINE

Le statut ONLINE confirme que le nœud a joint le réseau ZeroTier. OFFLINE signale en général un port UDP 9993 bloqué en sortie.

Pour se connecter, un nœud rejoint un réseau par son Network ID (16 caractères), fourni par un controller (le vôtre, voir plus bas, ou ZeroTier Central).

Fenêtre de terminal
sudo zerotier-cli join 3a54a442ef8aa568
# 200 join OK

Le nœud apparaît alors comme en attente d'autorisation côté controller. Un réseau privé n'admet une machine qu'après validation explicite : c'est une sécurité, pas un bug. Une fois autorisé, il reçoit une IP :

Fenêtre de terminal
sudo zerotier-cli listnetworks
# 200 listnetworks 3a54a442ef8aa568 lab-zt 6a:99:f8:71:1c:b2 OK PRIVATE ztpc5s5z4h 10.147.20.98/24

Le statut OK et l'IP attribuée (10.147.20.98/24) signent un rattachement réussi. Pour quitter un réseau : sudo zerotier-cli leave 3a54a442ef8aa568.

Point clé pour la souveraineté : le daemon zerotier-one contient déjà un controller. Vous n'avez rien à installer de plus. Une machine devient controller de tout réseau dont l'ID commence par sa propre adresse. L'administration se fait via une API REST locale sur le port 9993, authentifiée par un jeton.

  1. Récupérer le jeton et l'adresse du controller :

    Fenêtre de terminal
    TOKEN=$(sudo cat /var/lib/zerotier-one/authtoken.secret)
    CTRL=$(sudo zerotier-cli info | awk '{print $3}')
  2. Créer un réseau. Les six underscores demandent au controller de choisir le numéro. On définit le plan d'adressage et la route du segment :

    Fenêtre de terminal
    curl -s -X POST --header "X-ZT1-AUTH: $TOKEN" \
    -d '{"name":"reseau-interne","private":true,"v4AssignMode":{"zt":true},
    "ipAssignmentPools":[{"ipRangeStart":"10.147.20.10","ipRangeEnd":"10.147.20.100"}],
    "routes":[{"target":"10.147.20.0/24"}]}' \
    "http://localhost:9993/controller/network/${CTRL}______"

    La réponse contient le Network ID (champ id) à distribuer aux clients.

  3. Autoriser un membre une fois qu'il a fait join, en passant son adresse de nœud :

    Fenêtre de terminal
    curl -s -X POST --header "X-ZT1-AUTH: $TOKEN" \
    -d '{"authorized":true}' \
    "http://localhost:9993/controller/network/<NWID>/member/<ADRESSE_NOEUD>"

Piloter le controller en curl convient pour automatiser, mais devient vite fastidieux à la main. Une interface web tierce comme ztncui (open source, GPLv3) se branche sur ce même controller local et offre une gestion visuelle des réseaux et des membres, sans jamais dépendre d'un service externe.

Un ping sur l'IP ZeroTier d'un autre nœud confirme l'overlay. Le premier paquet est lent (le temps que les nœuds se découvrent), puis la latence s'effondre une fois la liaison directe établie :

Fenêtre de terminal
ping -c 3 10.147.20.74
# 64 bytes from 10.147.20.74: icmp_seq=1 ttl=64 time=128 ms
# 64 bytes from 10.147.20.74: icmp_seq=2 ttl=64 time=0.464 ms

La commande zerotier-cli peers révèle comment vos nœuds se parlent, et c'est instructif :

Fenêtre de terminal
sudo zerotier-cli peers
# <ztaddr> <ver> <role> <lat> <link>
# 3a54a442ef 1.16.2 LEAF 0 DIRECT 172.30.0.3/46856
# bc982e420a 1.16.2 LEAF 4 DIRECT 172.30.0.4/9993
# cafe04eba9 - PLANET 31 DIRECT 84.17.53.155/9993

Vos machines (LEAF) communiquent en DIRECT, en pair-à-pair. Mais on voit aussi des PLANET : ce sont les roots de ZeroTier, Inc., présents même avec un controller local. C'est la nuance de souveraineté à connaître.

Auto-héberger le controller rend votre plan de contrôle indépendant : autorisations, IP et routes sont chez vous, sans appel à ZeroTier Central. C'est déjà beaucoup.

Mais ce n'est pas une indépendance totale. La découverte des pairs et le relais de secours passent, par défaut, par les roots de ZeroTier, Inc. Pour couper complètement le cordon, il faut définir vos propres moons (des roots personnels, sur des machines toujours allumées à IP fixe), voire régénérer votre propre planet. Cette étape est réputée pénible, mal documentée, et non prise en charge par les applications mobiles officielles. À l'inverse, un serveur WireGuard est souverain de bout en bout dès la première configuration.

SymptômeCause probableCorrectif
Nœud bloqué REQUESTING_CONFIGURATIONMembre pas autorisé sur le controllerAutoriser le membre (API ou ztncui)
Statut ONLINE mais réseau ACCESS_DENIEDRéseau privé, autorisation manquanteIdem : valider le nœud côté controller
Nœud OFFLINEUDP 9993 bloqué en sortieOuvrir le port sur le pare-feu
Pair en RELAY au lieu de DIRECTNAT strict, UDP 9993 filtréAutoriser l'UDP 9993, éviter le double NAT
Débit faible, latence élevéeTrafic relayé par les rootsRétablir le P2P direct ou poser un moon

Le passage en RELAY est le piège le plus courant : quand le hole punching UDP échoue, le trafic transite par les roots de ZeroTier, Inc. en TCP, ce qui ajoute de la latence et une dépendance externe. La cause est presque toujours un UDP 9993 filtré sans message d'erreur ICMP, ou un NAT symétrique. Vérifiez que le port sort librement des deux côtés.

  • ZeroTier émule un réseau Ethernet de niveau 2 : son atout unique est le broadcast/multicast et le bridging, absents de Tailscale et WireGuard.
  • Pour un usage IP classique, WireGuard et Tailscale sont plus rapides (noyau contre espace utilisateur) et plus simples à rendre souverains.
  • L'installation passe par un dépôt signé, pas par un script exécuté à l'aveugle.
  • Le daemon contient son propre controller : on auto-héberge le plan de contrôle via l'API REST locale sur le port 9993.
  • Un controller local ne coupe pas la dépendance aux roots de ZeroTier, Inc. : il faut des moons pour l'autonomie totale.
  • ZeroTier One est aujourd'hui sous MPL 2.0 (open source), la BSL étant un épisode passé.
  • Diagnostic : un nœud en attente s'autorise sur le controller ; un pair en RELAY signale un UDP 9993 filtré.

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