Configuration de Netbird
Contexte
Pour rappel, l'idée de départ est d'utiliser Netbird pour proposer Paperless-NGX en SaaS à différentes entités. Chaque entité aura donc une infra dédiée.
Chaque infrastructure bénéficiera de son propre domaine. Exemple : l'entité 01 aura comme NDD "int01.quercylibre.fr". Il ne sera pas pour autant résolvable sur le net pour éviter les accès en direct et les énumérations DNS. Cela permet surtout de pouvoir générer des certificats HTTPS par le biais du DNS Challenge du protocole ACME.
Chaque infra aura la stack suivante sur Proxmox VE :
- VM Docker :
- Traefik
- Paperless-NGX
- VM routing peer : ce peer nous permettra d'accéder aux ressources locales. J'aurai pu également l'installer directement sur la VM Docker.
La passerelle OPNSense en tête des infras (Netbird et les services SaaS) fera office de serveur DNS local. C'est lui qui sera poussé aux clients pour leur permettre de résoudre les NDD non déclarés chez le registrar.
La configuration suivante concerne l'entité01 qui aura accès à l'infra int01.quercylibre.fr.
Installation des clients
Client Windows
Créez un utilisateur sur Keycloak (dans le realm Netbird).
Sur le poste Windows, rendez-vous sur l'URL du dashboard de Netbird et authentifiez-vous avec les creds de l'utilisateur créé précédemment. Vous devriez alors arriver sur cette interface vous proposant l'installation du client Netbird.
Téléchargez le logiciel et installez-le. Une fois installée, un icône apparrait dans la barre des tâches. Faites un clic droit sur l'icône en question et cliquez sur "Connect". Si tout se passe bien, une coche verte apparait sur celui-ci.
On peut vérifier également le statut du client en mode CLI. Ouvrez une console PowerShell :
PS C:\ netbird status --detail
Peers detail:
srv-inter01-peer.netbird.selfhosted:
NetBird IP: 100.85.31.120
Public key: PUBLIC_KEY
Status: Connected
-- detail --
Connection type: Relayed
ICE candidate (Local/Remote): -/-
ICE candidate endpoints (Local/Remote): -/-
Relay server address: rels://netbird.dev.quercylibre.fr:443/relay
Last connection update: 3 minutes ago
Last WireGuard handshake: 1 minute, 7 seconds ago
Transfer status (received/sent) 1.0 KiB/1.4 KiB
Quantum resistance: false
Networks: 192.168.100.9/32, ged.int01.quercylibre.fr
Latency: 0s
Events:
OS: windows/amd64
Daemon version: 0.38.2
CLI version: 0.38.2
Management: Connected to https://netbird.dev.quercylibre.fr:443
Signal: Connected to https://netbird.dev.quercylibre.fr:443
Relays:
[stun:netbird.dev.quercylibre.fr:3478] is Available
[turn:netbird.dev.quercylibre.fr:3478?transport=udp] is Available
[rels://netbird.dev.quercylibre.fr:443/relay] is Available
Nameservers:
[192.168.100.9:53] for [int01.quercylibre.fr] is Available
FQDN: labwin11-01.netbird.selfhosted
NetBird IP: 100.85.194.253/16
Interface type: Userspace
Quantum resistance: false
Networks: -
Forwarding rules: 0
Peers count: 1/1 Connected
Dans cet extrait, nous pouvons constater la présence du serveur DNS "192.168.100.9" qui est la patte IP locale de OPNSense pour cette infra. Nous verrons plus tard comment configurer cela depuis le dashboard de Netbird.
En tant qu'admin sur le Dashboard de Netbird, ajoutez le client au groupe : "int01-clients". Pour cela, cliquez sur le peer en question et ajoutez le groupe à la volée dans la case "Assigned groups".
Client routing-peer
Le routing-peer est un client offrant une ou plusieurs routes pour accéder par exemple à des ressources internes. Dans mon cas, c'est une VM Debian tournant sur l'infra int01. Il va permettre aux clients distants d'accéder aux ressources internes telles que le serveur DNS et l'application.
Rendez-vous sur le dashboard de Netbird en tant qu'admin et cliquez sur "Setup keys". Cliquez sur le bouton "Create Setup Key" et renseignez le nom de la clé.

Terminez en cliquant sur "Create Setup Key". Netbird vous affiche la clé et vous propose son installation. Cliquez sur "Intall Netbird" et utilisez les commandes affichées pour installer Netbird sur le routing peer.

Configuration des accès
Maintenant que nos clients sont installés, il nous faut paramétrer Netbird pour pusher le serveur DNS local et définir les accès à nos ressources.
Configuration du DNS
Depuis le dashboard Netbird, rendez-vous sur DNS > Nameservers puis cliquez sur "Add Nameserver"

Sélectionnez "Custom DNS" puis :
- Namerservers :
- Spécifiez l'IP locale du DNS et le port
- Précisez le groupe de peers qui recevra ce serveur DNS (int01-clients dans mon cas, contenant le PC Windows)
- Domains :
- Le domaine sur lequel ce serveur fait authorité.
- Name & Description :
- Finissez en renseignant le nom et une description
Configuration des accès
Jusqu'à la version 0.35, il fallait passer par Network routes. Ce dernier est depuis déprécié et remplacé par Networks.
Nous allons ici créer un "réseau" autorisant notre client à requêter le serveur DNS et à se connecter à Paperless-NGX.
Cliquez sur Add Network :
- Renseignez le nom. Par exemple : entité01
- Ajoutez une ressource en cliquant sur "Add Ressource" proposé dans la foulée :
- Name : Local DNS
- Description
- Address : renseignez l'IP locale du serveur DNS
- Assigned groups : saisissez "DNS" et ajoutez le à la voléee
- Laissez coché la case "Enable Ressource"
- Cliquez sur "Add Ressource"
- Ajoutez une stratégie en cliquant sur Create Policy proposé dans la foulée :
- Protocol : Sélectionner UDP
- Source : sélectionnez le groupe du client (int01-clients)
- Destination : par défaut le groupe DNS créé juste avant
- Ports : 53
- Enable Policy : laissez coché puis cliquez sur "Continue"
- Posture check : laissez tel quel et cliquez sur "Continue"
- Name & Description : Renseignez le nom de la stratégie et la description
- Terminez en cliquant sur "Add policy"
- Renseignez le routing peer comme proposé dans la foulée :
- Sélectionnez le serveur GNU/Linux où nous avons installé précédemment le client Netbird.
- Laissez le options suivantes cochées puis terminez en cliquant sur "Add Routing Peer"
Au final, un "réseau" est composé :
- d'une ou plusieurs ressources auxquelles sont attribuées des stratégies (policy)
- d'un routing peer pouvant contenir un ou plusieurs peers.

Nous allons maintenant une nouvelle ressource dans le network "Entité 01" permettant d'accéder à l'application web Paperless-NGX.

Dans ce cas, la ressource fera parti du groupe "web" ajouté dans la foulée et l'adresse sera l'IP locale du reverse-proxy de l'infra.
Une fois la ressource crée, ajoutez une stratégie en cliquant sur "Add policy" :

Et voilà ! Il nous reste plus qu'à tester cela depuis notre client Windows. Sur ce dernier, déconnectez-vous et reconnectez-vous sur Netbird.
Filtrage sur les domaines
Il est possible de filtrer sur les domaines ou les ndd mais en fait cela se résume à une résolution IP. Si l'accès à vos applications locales passent par un reverse-proxy, alors tous les NDD sont accessibles même si vous filtrez sur un NDD en particulier.
Afin de vérifier si les ressources ont bien été poussée, ouvrez une console PowerShell et exécutez la commande : netbird networks ls
et vérifiez également le status du client :
PS C:\ netbird networks ls
Available Networks:
- ID: Accès web
Network: 192.168.100.10/32
Status: Selected
- ID: Local DNS
Network: 192.168.100.9/32
Status: Selected
PS C:\ netbird status --detail
Peers detail:
srv-inter01-peer.netbird.selfhosted:
NetBird IP: 100.85.31.120
(...)
OS: windows/amd64
Daemon version: 0.38.2
CLI version: 0.38.2
Management: Connected to https://netbird.dev.quercylibre.fr:443
Signal: Connected to https://netbird.dev.quercylibre.fr:443
Relays:
[stun:netbird.dev.quercylibre.fr:3478] is Available
[turn:netbird.dev.quercylibre.fr:3478?transport=udp] is Available
[rels://netbird.dev.quercylibre.fr:443/relay] is Available
Nameservers:
[192.168.100.9:53] for [int01.quercylibre.fr] is Available
FQDN: labwin11-01.netbird.selfhosted
NetBird IP: 100.85.194.253/16
Interface type: Userspace
Quantum resistance: false
Networks: -
Forwarding rules: 0
Peers count: 1/1 Connected
Ouvrez votre navigateur web et rendez-vous sur votre application web locale. Et ça marche ! Enfin presque... Je ne sais pas si c'est lié à ma méconnaissance de Keycloak mais je dois authentifier l'utilisateur en passant par Keycloak, alors que celui-ci l'a déjà été lors de la connexion au dashboard de Netbird. Cependant si je m'authentifie sur Paperless-NGX en premier, je le suis automatiquement sur Netbird.
Conclusion
Comme indiqué en introduction, Netbird est plus adapté pour mettre en place un bastion que du VPN classique. Je pense que c'est une très bonne solution pour exposer des applications sensibles sans pour autant les rendre visible sur Internet et trop compliqué pour y accéder pour les utilisateurs finaux.
Le projet est relativement jeune, très actif et donc évolue régulièrement ce qui peut légèrement refroidir pour de la mise en production.
On pourrait lui préférer l'application Teleport qui n'implique aucune installation de logiciel côté client mais il faudra alors passer par la version payante pour bénéficier du SSO.