Mode opératoire — Tailscale : accès distant sans port ouvert

Document autonome. Partie théorique, puis mise en œuvre appliquée au pare-feu pfSense du laboratoire. La méthode vaut pour tout réseau placé derrière un NAT que l’on ne maîtrise pas.

Dernière mise à jour : 02/10/2026 État au 12/11/2026 : la zone VISITEURS (VLAN 50, 10.0.50.0/24) existe depuis le 30/10 ; ce MO décrit les quatre réseaux de départ ; depuis le 12/11, fw-01 annonce les 5 réseaux : 10.0.10.0/24, 10.0.20.0/24, 10.0.30.0/24, 10.0.40.0/24 et 10.0.50.0/24 (VISITEURS), ajouté par Axel dans VPN → Tailscale → Settings → Advertised Routes puis approuvé dans la console (Edit route settings) ; vérifié depuis le poste d’Axel : poste-visiteur (10.0.50.200) joignable sur le port 22 par l’interface Tailscale (captures 271, 272).


Sommaire

§Contenu
1Le problème : on ne peut pas ouvrir de port
2Ce qu’est Tailscale — WireGuard, plan de contrôle, tailnet
3 Ce que Tailscale ne fait pas
4Les trois façons de l’installer — et laquelle choisir
5Préparer le tailnet : identité, clé d’authentification
6Installer et configurer le paquet sur pfSense
7Côté console : approuver les routes, désactiver l’expiration
8Côté poste de travail : le réglage que tout le monde oublie
9La règle de pare-feu — et pourquoi any en source
10Le DNS : pourquoi Accept DNS reste décoché, et le DNS fractionné
11Diagnostic : lire tailscale status
12 Ce que le tunnel coûte en sécurité, et comment le reprendre en main
13Pièges et checklists

1 · Le problème : on ne peut pas ouvrir de port

1.1 La situation de départ

Le laboratoire est hébergé derrière le routeur de l’établissement. Cette machine n’appartient pas au TP : on ne peut ni la configurer, ni y demander une redirection de port.

   Internet                 routeur de l'etablissement           le laboratoire
                            (non administre par le TP)
  ┌────────────┐            ┌──────────────────────┐            ┌─────────────┐
  │ ag-lenovo  │ ─────X────►│  NAT                 │            │  pfSense    │
  │ a distance │  impossible│  aucune redirection  │            │ 10.1.0.197  │
  └────────────┘            └──────────────────────┘            └─────────────┘
Solution classiquePourquoi elle échoue ici
Redirection de port vers pfSenseIl faudrait administrer le routeur de l’établissement
Serveur OpenVPN sur pfSenseExige un port entrant joignable depuis Internet
Serveur WireGuard sur pfSenseMême problème : un port UDP entrant
Exposer l’interface web sur le WANInterdit par l’architecture, et impossible sans redirection

Le point de blocage n’est pas le pare-feu du laboratoire — c’est celui d’au-dessus. Tant qu’on raisonne en « ouvrir une porte », on dépend de quelqu’un d’autre.

1.2 Le renversement

Un NAT laisse toujours sortir. Il mémorise la connexion sortante et laisse revenir les réponses : c’est le suivi d’état, exactement le mécanisme utilisé par le pare-feu du laboratoire.

L’idée est donc d’inverser le sens de l’initiative : plutôt que d’attendre une connexion entrante, la machine du laboratoire sort vers un point de rendez-vous, et maintient ce tunnel ouvert.

   ag-lenovo                point de rendez-vous               pfSense
       │                                                          │
       │  ──── connexion SORTANTE ────►  ◄──── connexion SORTANTE │
       │                                                          │
       └══════════ tunnel chiffre, dans les deux sens ════════════┘

   Les DEUX cotes sortent. Aucun des deux n'a besoin d'accepter une entree.

C’est le même principe que celui qui fait fonctionner un appel visio derrière deux box familiales : personne n’ouvre de port, les deux postes sortent vers un serveur qui les met en relation.


2 · Ce qu’est Tailscale

2.1 Deux couches qu’il faut distinguer

C’est la notion centrale, et la source de la plupart des malentendus.

CoucheRôleQui la fournit
Le transportChiffre et achemine les paquets entre deux machinesWireGuard — un protocole VPN libre et standard
Le plan de contrôleDistribue les clés publiques, tient la liste des machines, aide à l’établissement des liaisonsLes serveurs de coordination Tailscale
   PLAN DE CONTROLE  (serveurs Tailscale)
   ┌──────────────────────────────────────────────┐
   │  qui es-tu · voici les cles publiques des    │
   │  autres · voici leurs adresses du moment     │
   └───────▲──────────────────────────▲───────────┘
           │ metadonnees              │ metadonnees
           │                          │
   ┌───────┴───────┐          ┌───────┴───────┐
   │   ag-lenovo   │══════════│    pfSense    │
   └───────────────┘ WireGuard└───────────────┘
                     chiffre de bout en bout
                     LES DONNEES NE PASSENT PAS PAR TAILSCALE

Les clés privées ne quittent jamais les machines. Tailscale distribue les clés publiques et joue les entremetteurs ; il ne peut pas déchiffrer le trafic. C’est la réponse à la question « vous faites passer tout votre réseau par une société tierce ? » — non : les métadonnées, oui ; les données, non.

2.2 Le vocabulaire

TermeDéfinition
TailnetLe réseau privé formé par toutes les machines d’un même compte. Un tailnet = un périmètre de confiance
NœudUne machine enrôlée dans le tailnet
Adresse 100.x.x.xAdresse attribuée par Tailscale à chaque nœud, dans la plage 100.64.0.0/10
DERPServeur relais utilisé uniquement quand la liaison directe est impossible. Le trafic y reste chiffré
MagicDNSService DNS de Tailscale, qui résout les noms des nœuds du tailnet
Subnet routerUn nœud qui annonce au tailnet des réseaux entiers situés derrière lui
Exit nodeUn nœud qui sert de sortie Internet aux autres — non utilisé ici

Pourquoi 100.64.0.0/10 : c’est la plage CGNAT, réservée par la norme aux opérateurs pour leur NAT de grande échelle. Elle n’est ni publique, ni dans les plages privées habituelles (10., 172.16., 192.168.) — donc elle n’entre jamais en conflit avec un réseau local existant. C’est précisément pour cela qu’elle a été choisie.

2.3 Direct ou relayé

Deux nœuds essaient toujours de se parler directement. Le plan de contrôle leur communique mutuellement leurs adresses publiques et leurs ports, et chacun envoie un paquet vers l’autre au même moment : chaque NAT voit alors partir une connexion sortante, et accepte la réponse.

ModeCe qu’affiche tailscale statusPerformance
Directdirect 10.1.0.197:41641Pleine vitesse, latence minimale
Relayérelay "par" (un code de ville)Plus lent, mais fonctionnel
PortUsage
UDP 41641Liaison directe entre deux nœuds (sortant)
TCP 443Repli vers un relais DERP, et plan de contrôle (sortant)

Le repli sur 443 est ce qui rend Tailscale utilisable partout. Même un réseau qui ne laisse sortir que le web laisse passer le tunnel. C’est une qualité du point de vue de l’utilisateur — et, du point de vue de l’administrateur du réseau traversé, un contournement qu’il faut savoir nommer.


3 · Ce que Tailscale ne fait pas

Un mode opératoire qui n’énonce que les bénéfices produit un faux sentiment de sécurité.

Idée reçueRéalité
« Le tailnet est sécurisé, donc mon réseau l’est »Le tailnet sécurise le transport. Une fois le paquet sorti du tunnel, il circule dans le laboratoire comme n’importe quel autre
« Ça remplace le cloisonnement VLAN »Non : un nœud du tailnet peut joindre tout ce que le subnet router lui annonce. Le tunnel traverse la segmentation
« Je n’ai aucun port ouvert, donc rien n’est exposé »Rien n’est exposé à Internet. Tout est exposé au tailnet : la frontière s’est déplacée, elle n’a pas disparu
« Ça donne aussi la résolution de noms »Pas celle du laboratoire. MagicDNS ne résout que les noms des nœuds — voir §10
« C’est transparent pour les autres machines »Vrai depuis le tailnet. Mais un serveur du laboratoire ne sait pas qu’il parle à un nœud distant

La phrase à retenir, et à savoir défendre à l’oral. Tailscale ne supprime pas la surface d’attaque, il la déplace vers un compte. Qui prend le contrôle du compte du tailnet obtient l’accès que ce compte possède. Toute la sécurité du laboratoire repose alors sur cette authentification — c’est le sujet du §12.


4 · Les trois façons de l’installer

4.1 Le choix de topologie

TopologiePrincipeQuand la retenir
A · Un agent par machineChaque serveur est un nœud du tailnetPeu de machines, et on veut un contrôle fin machine par machine
B · Subnet routerUn seul nœud annonce des réseaux entiers situés derrière luiBeaucoup de machines, dont certaines ne peuvent pas recevoir d’agent
C · Exit nodeUn nœud sert de sortie Internet aux autresFaire passer sa navigation par un autre point — hors sujet ici

Topologie retenue : B — subnet router.

ArgumentDétail
Un seul nœud à enrôler, à mettre à jour et à surveillerAu lieu de neuf agents
Les machines du laboratoire restent inchangéesAucun agent, aucun paquet supplémentaire, aucune clé à gérer
Couvre les équipements qui ne peuvent pas recevoir d’agentL’interface d’administration de pfSense elle-même, et tout matériel futur

4.2 Et surtout : sur quelle machine ?

C’est la décision structurante de cette étape. Deux candidats existaient : le bastion srv-docker (10.0.30.12) et le pare-feu pfSense.

EmplacementConséquence technique
srv-dockerTailscale applique du SNAT : tout le trafic venu du tailnet ressortirait avec l’adresse 10.0.30.12. Aux yeux du pare-feu, ce serait le bastion qui parle — or la règle qui l’autorise ne couvre que 22 et 3389. Il faudrait l’élargir, et perdre la finesse du filtrage du bastion
pfSenseLe trafic entre directement dans le routeur, qui le distribue vers les VLAN selon ses propres règles. Une interface de plus, avec son propre onglet de règles, sans rien toucher d’existant
   SUR LE BASTION                          SUR LE PARE-FEU
   ──────────────                          ───────────────
   tailnet                                 tailnet
      │                                       │
      ▼                                       ▼
   srv-docker  ── SNAT ──► tout             pfSense ──► VLAN 10
   10.0.30.12   le trafic semble                    ──► VLAN 20
                venir de .12                        ──► VLAN 30
                                                    ──► VLAN 40
   le pare-feu ne distingue plus           chaque flux garde son
   l'origine reelle                        adresse source d'origine

Le principe général : placer le point d’entrée VPN sur le routeur, pas derrière lui. Derrière le routeur, le VPN doit masquer les adresses pour que les réponses lui reviennent — et ce masquage détruit l’information dont le pare-feu a besoin pour filtrer.

Pourquoi pfSense n’a besoin d’aucun réglage supplémentaire pour router : c’est déjà un routeur, le réacheminement de paquets y est actif par construction. Sur un Linux utilisé comme subnet router, il aurait fallu l’activer explicitement :

echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
sudo tailscale up --advertise-routes=10.0.10.0/24,10.0.20.0/24

C’est l’oubli classique : les routes apparaissent dans la console, elles sont approuvées, et rien ne passe, parce que le noyau refuse de faire transiter un paquet qui ne lui est pas destiné.


5 · Préparer le tailnet

5.1 Une identité = un tailnet

C’est le piège d’entrée, et il coûte du temps.

Se connecter avec un compte déjà utilisé ne crée pas un nouveau réseau — il ramène sur celui qui existe déjà. Un compte Google personnel déjà employé pour un tailnet domestique replacerait le pare-feu du laboratoire dans le réseau de la maison.

Un tailnet dédié au BTS a donc été créé, avec une identité distincte du réseau personnel.

Identité possibleRemarque
Adresse de l’établissementLe meilleur choix : le tailnet appartient au contexte du TP, se supprime en fin d’année sans toucher à rien d’autre
Second compte GoogleFonctionne, mais mélange vie privée et formation
GitHub, MicrosoftFonctionnent également

L’alternative aurait été un seul tailnet avec des tags et des ACL : plus souple — les deux réseaux visibles en même temps — mais il faut écrire une politique. Le compte séparé garantit l’isolation par construction, au prix d’une bascule de profil (tailscale switch).

Si une erreur 403 — session expired apparaît à la création du compte : le navigateur porte encore les cookies du tailnet précédent. Fenêtre de navigation privée, ou vider les cookies du site.

5.2 La clé d’authentification

Enrôler pfSense suppose de prouver son identité. Sur une machine sans navigateur — ou que l’on administre à distance — on ne peut pas suivre le lien d’authentification habituel : on génère donc une clé pré-authentifiée.

Admin console → Settings → Keys → Generate auth key

OptionValeur retenuePourquoi
ReusabledécochéLa clé sert une fois. Une clé réutilisable qui fuite enrôle autant de machines qu’on veut
EphemeraldécochéUn nœud éphémère disparaît du tailnet à sa déconnexion — l’inverse de ce qu’on veut pour un pare-feu
Pre-approvedselon le réglage d’approbationÀ cocher seulement si l’approbation manuelle des appareils est active (voir §12)
Expirationla plus courte possibleLa clé ne sert qu’au moment de l’enrôlement

Une clé tskey-auth-… est un secret de même niveau qu’un mot de passe d’administration. Elle ne se colle ni dans un document, ni dans un dépôt Git, ni dans un message. Une fois le nœud enrôlé, elle est consommée : on peut la révoquer dans la console.


6 · Installer et configurer le paquet sur pfSense

6.1 Installation

System → Package Manager → Available Packages → rechercher Tailscale → Install

Le menu VPN → Tailscale apparaît une fois l’installation terminée.

6.2 Onglet Authentication

ChampValeur
Login Serverhttps://controlplane.tailscale.com
Pre-authentication Keyla clé tskey-auth-… générée au §5.2

Le champ Login Server existe parce que Tailscale peut fonctionner avec un plan de contrôle auto-hébergé (headscale, une réimplémentation libre). On garde ici le serveur officiel : c’est la valeur par défaut.

6.3 Onglet Settings

ChampValeurJustification
Enable Tailscale
Accept DNSdécoché Sinon pfSense adopterait les serveurs DNS poussés par Tailscale, écrasant sa propre configuration de résolution. Détaillé au §10
Accept Subnet RoutespfSense n’a pas besoin des réseaux annoncés par d’autres nœuds — il n’y en a pas
Advertise Exit NodeFerait de pfSense une sortie Internet pour le tailnet. Hors besoin
Advertised Routesles quatre réseaux du laboratoireLe cœur du subnet router

Les routes annoncées :

RéseauVLANDescription
10.0.10.0/2410WEB
10.0.20.0/2420BDD
10.0.30.0/2430ADM
10.0.40.0/2440USERS

Pourquoi quatre lignes plutôt qu’un 10.0.0.0/16 global : annoncer exactement ce que l’on veut rendre joignable. Un /16 engloberait aussi les réseaux non créés — ce que l’on n’a pas décidé d’exposer, on ne l’annonce pas. Et chaque ligne porte sa description, donc la console reste lisible.

Ce que cette page ne fait pas : annoncer une route ne la rend pas utilisable. Il reste deux conditions, dans la console (§7) et sur le poste (§8). C’est la cause la plus fréquente de « ça ne marche pas ».


7 · Côté console d’administration

7.1 Approuver les routes

Admin console → Machines → le nœud pfSense → Edit route settings → approuver les quatre réseaux.

Pourquoi cette validation existe. Un nœud peut prétendre router n’importe quel réseau. Sans approbation, n’importe quelle machine enrôlée pourrait s’auto-déclarer routeur de 192.168.1.0/24 et intercepter le trafic que les autres destinent à ce réseau. L’approbation transforme une déclaration en autorisation : elle doit venir de l’administrateur du tailnet, pas du nœud lui-même.

Les routes approuvées s’affichent alors en clair sous le nœud dans la liste des machines.

7.2 Désactiver l’expiration de clé

Sur le nœud pfSense → Disable key expiry

Sans ce réglageAvec
Au bout d’environ 180 jours, la clé du nœud expireLe nœud reste enrôlé
Le nœud se déconnecte silencieusement—
Tout l’accès distant tombe, sans message, sans journal évident—

C’est une panne différée de six mois. Elle arrive au pire moment, et rien dans le symptôme ne désigne la cause : le laboratoire fonctionne, le tunnel n’existe plus. Sur un nœud d’infrastructure permanent, l’expiration se désactive le jour de l’enrôlement.

Noter que c’est un arbitrage assumé : une clé qui n’expire pas est une clé qu’il faut révoquer à la main le jour où la machine sort du périmètre.


8 · Côté poste de travail

Installation du client, puis connexion au tailnet du BTS — en vérifiant bien le profil actif si le poste appartient déjà à un autre tailnet (tailscale switch).

8.1 Le réglage que tout le monde oublie

Cocher « Use Tailscale subnets ».

Menu du client → Preferences → Use Tailscale subnets

SansAvec
Le nœud pfSense est visible, ping 100.84.62.27 répondLes quatre réseaux 10.0.x.0/24 deviennent joignables
Aucune adresse 10.0.x.x n’est joignable—

Pourquoi ce n’est pas activé par défaut. Accepter les routes d’un subnet router modifie la table de routage du poste. Si un nœud annonçait 192.168.1.0/24 et que le poste est chez lui sur ce réseau, son imprimante deviendrait inaccessible. Tailscale demande donc un consentement explicite : j’accepte que d’autres machines influencent mon routage.

8.2 Vérifier sans rien supposer

PS> tailscale status
100.84.62.27  sio2527-pfsense-axel  freebsd  active; direct 10.1.0.197:41641, tx 572 rx 156

PS> ping 10.0.30.12
Reponse de 10.0.30.12 : octets=32 temps=12 ms
Paquets : envoyes = 2, recus = 2, perdus = 0 (0% de perte)

PS> ssh [email protected]
Linux SRV-WEB 6.12.107+deb13-amd64

Validation — Le poste de travail joint l’intégralité du laboratoire : SSH direct, interfaces web, interface d’administration de pfSense — sans rebond, sans tunnel manuel, et sans aucun port ouvert sur le réseau de l’établissement.


9 · La règle de pare-feu

9.1 Une interface sans règle ne laisse rien passer

Le paquet crée une interface tailscale0 et la place dans un groupe pf nommé Tailscale. Un onglet dédié apparaît alors dans Firewall → Rules, sans qu’il faille assigner l’interface.

Ne pas chercher tailscale0 dans Interface Assignments — il n’y figure pas, et ce n’est pas un défaut. Le groupe pf suffit à pfSense pour créer l’onglet. L’interface existe bel et bien :

ifconfig tailscale0
tailscale0: flags=1008043<UP,BROADCAST,RUNNING,MULTICAST,LOWER_UP> mtu 1280
        inet 100.84.62.27 netmask 0xffffffff
        groups: tun Tailscale

La ligne groups: est la réponse : elle indique comment pf référence cette interface.

mtu 1280 est normal pour WireGuard, qui réduit la taille utile des trames pour loger son encapsulation.

À la création, l’onglet affiche « No rules are configured for this interface ». Rien ne passe — c’est le comportement par défaut de pfSense sur toute interface.

9.2 La règle

Firewall → Rules → onglet Tailscale → Add

ChampValeur
ActionPass
Address FamilyIPv4+IPv6
ProtocolAny
Sourceany
Destinationany
DescriptionAcces complet au lab depuis le tailnet BTS

9.3 Pourquoi any en source, et non la plage 100.64.0.0/10

Le réflexe serait de restreindre la source à la plage CGNAT. Trois raisons de ne pas le faire :

RaisonDétail
L’interface est elle-même la frontièreSur tailscale0, il n’arrive que du trafic sorti du tunnel WireGuard, donc que des machines authentifiées du tailnet. Restreindre la source n’exclurait rien de plus
Le filtrage réel a déjà eu lieuIl est assuré par Tailscale — clés, identités, appareils autorisés — pas par le pare-feu
100.64.0.0/10 casserait l’IPv6Tailscale attribue aussi une adresse fd7a:115c:a1e0::/48 à chaque nœud. Une source IPv4 seule laisserait tomber tout le trafic IPv6 du tailnet

La bonne granularité n’est pas toujours la plus fine. Une règle inutilement étroite donne l’illusion du contrôle tout en créant des pannes difficiles à diagnostiquer. Ici, la restriction utile se configure dans la console Tailscale, pas dans le pare-feu — voir §12.3.

Décision à assumer, pas à masquer. Cette règle fait du tailnet une zone de confiance disposant d’un accès complet au laboratoire. C’est l’objectif recherché, et c’est une entrée de plus dans la matrice de flux, au même titre que le WAN.

9.4 Le sens de lecture

   interface USERS                     interface tailscale0
   ───────────────                     ────────────────────
   les regles de l'onglet USERS        les regles de l'onglet Tailscale
   s'appliquent aux paquets qui        s'appliquent aux paquets qui
   ARRIVENT par USERS                  ARRIVENT par le tunnel

Les règles pfSense s’appliquent en entrée d’interface. Un paquet venu du tunnel n’est jamais évalué par les règles des onglets VLAN : il entre par tailscale0, et c’est cet onglet-là, et lui seul, qui décide. C’est pour cela que le tunnel traverse la segmentation sans la contredire techniquement — et c’est aussi pour cela qu’il faut le documenter comme une voie à part entière.


10 · Le DNS

10.1 Pourquoi Accept DNS reste décoché sur pfSense

Tailscale pousse sa propre configuration DNS aux nœuds qui l’acceptent. Sur un poste client, c’est pratique. Sur le résolveur du laboratoire, c’est destructeur :

   Accept DNS COCHE sur pfSense
   ────────────────────────────
   pfSense adopte les DNS de Tailscale
      └──► sa propre configuration de resolution est ECRASEE
             └──► les machines du laboratoire interrogent pfSense
                    └──► qui interroge desormais autre chose que prevu

Un nœud qui est lui-même serveur DNS ne doit pas accepter la configuration DNS d’un tiers. La règle vaut au-delà de Tailscale : elle vaut pour tout client DHCP, tout agent VPN, toute configuration automatique.

10.2 Ce que MagicDNS résout — et ce qu’il ne résout pas

NomRésolu par MagicDNS
sio2527-pfsense-axel (nom du nœud)
www.sio.internal (nom interne du laboratoire)
srv-web-01 (nom d’une machine du VLAN 10)

MagicDNS ne connaît que les nœuds du tailnet. Les machines situées derrière un subnet router lui sont invisibles — il ne voit qu’une route, pas les noms.

La conséquence concrète : le poste distant atteint 10.0.10.5 sans problème, mais ne sait pas que ce nom existe.

MachineDNS interrogéwww.sio.internal
poste-win11 (VLAN 40)10.0.40.1 = pfSense 10.0.10.5
Serveurs du laboratoire10.0.x.1 = pfSense 10.0.10.5
ag-lenovo par le tailnetson DNS habituel NXDOMAIN

Tailscale donne la connectivité réseau, pas le DNS du réseau joint. Les deux sont des services distincts, et c’est exactement le genre de confusion qui fait conclure à tort « le VPN ne marche pas » alors que ping 10.0.10.5 répond.

10.3 Le DNS fractionné — la réponse propre

Statut : procédure établie, non encore appliquée. Elle est décrite ici pour être exécutée telle quelle, et vérifiée au moment de l’application.

L’objectif : que le poste distant interroge pfSense pour *.sio.internal et uniquement pour ça, en conservant son DNS habituel pour tout le reste.

   ag-lenovo
      │
      ├── *.sio.internal  ──►  100.84.62.27  (pfSense sur le tailnet)
      │                              └──► Host Override → 10.0.10.5
      │
      └── tout le reste   ──►  DNS habituel de la machine

Deux côtés à configurer, dans cet ordre.

① Côté pfSense — autoriser le tailnet à interroger le résolveur

C’est l’étape que l’on oublie. Par défaut, le résolveur de pfSense n’accepte les requêtes que des réseaux directement connectés. La plage Tailscale n’en fait pas partie : les requêtes seraient refusées sans explication.

Services → DNS Resolver → Access Lists → Add

ChampValeur
Network100.64.0.0 / 10
ActionAllow
DescriptionTailnet — resolution des noms du laboratoire

Vérifier également, dans General Settings, que Network Interfaces vaut All — sinon le résolveur n’écoute pas du côté du tunnel.

② Côté Tailscale — déclarer le résolveur fractionné

Admin console → DNS → Nameservers → Add nameserver → Custom

ChampValeur
Nameserver100.84.62.27 (pfSense sur le tailnet)
Restrict to search domain— sio.internal

Pourquoi « restrict to search domain » est indispensable. Sans cette case, tout le trafic DNS de tous les nœuds du tailnet partirait vers pfSense — et chaque nœud perdrait la résolution de noms dès que le laboratoire serait éteint. Le DNS fractionné dit : « pour ce domaine-là, ce serveur-là ; pour le reste, ne change rien ».

Vérification :

Resolve-DnsName www.sio.internal

→ doit répondre 10.0.10.5.

Avantages Limites
Vaut pour tous les nœuds du tailnet, présents et futursDépend de Tailscale — c’est déjà le cas de tout l’accès distant
Une seule source de vérité : le Host Override de pfSenseÉlargit encore le rôle du tailnet

Le dépannage immédiat, si le besoin est ponctuel : une ligne dans le fichier hosts du poste, ou curl --resolve www.sio.internal:443:10.0.10.5 … le temps d’une commande. Utile, mais à ne pas confondre avec la solution — l’une se répète sur chaque poste, l’autre non.


11 · Diagnostic

11.1 tailscale status, la commande qui tranche

Une seule ligne répond à la question la plus coûteuse en temps : « le paquet n’arrive pas, ou il arrive et il est refusé ? »

PS> tailscale status
100.84.62.27  sio2527-pfsense-axel  freebsd  active; direct 10.1.0.197:41641, tx 572 rx 156
                                    ▲▲▲▲▲▲   ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲   ▲▲▲▲▲▲▲▲▲▲▲▲
                                      ①              ②                      ③
IndiceSignification
①activeLe tunnel WireGuard est établi
②direct 10.1.0.197:41641Liaison pair-à-pair, sans relais. Deviendrait relay "…" depuis l’extérieur de l’établissement
③tx 572 rx 156 Des octets circulent dans les deux sens

rx non nul est la preuve décisive. Si le réseau était en cause, le compteur de réception resterait à 0. Des octets reviennent : le tunnel fonctionne, donc le blocage est au-delà — dans le pare-feu, le routage ou le service visé. C’est exactement ce qui a permis d’écarter l’hypothèse réseau et de conclure à la règle de pare-feu manquante.

C’est l’équivalent, pour le tunnel, de la colonne States de pfSense.

11.2 Les autres commandes utiles

CommandeCe qu’elle apporte
tailscale ping <noeud>Teste par le tunnel, et indique en clair direct ou via DERP. À ne pas confondre avec ping, qui teste la couche IP
tailscale netcheckDiagnostic du réseau local : type de NAT, relais le plus proche, latences. Utile quand la liaison reste relayée
tailscale ip -4L’adresse 100.x du nœud local
tailscale switchBascule entre plusieurs tailnets sur un même poste
tailscale status --jsonSortie exploitable par script

Sur pfSense, ces commandes se lancent depuis Diagnostics → Command Prompt ou en SSH.

11.3 Tableau de panne

SymptômePremière vérificationCause la plus fréquente
Le nœud n’apparaît pas dans la consoleLa clé d’authentificationClé expirée ou déjà consommée
403 — session expired à la connexionLes cookies du navigateurSession d’un tailnet précédent → navigation privée
Le nœud répond en 100.x, mais rien en 10.0.x.xtailscale status sur le poste① Use Tailscale subnets décoché · ② routes non approuvées · ③ règle de pare-feu manquante
Tout fonctionnait, puis plus rien après des moisLa console : le nœud est-il listé ?Expiration de clé — voir §7.2
Les noms du laboratoire ne se résolvent pasResolve-DnsNameNormal : MagicDNS ne les connaît pas → §10.3
Le laboratoire a perdu sa résolution DNSAccept DNS sur pfSenseCase cochée par inadvertance → §10.1
Liaison toujours relay, lenteurstailscale netcheckNAT symétrique côté réseau traversé — fonctionnel mais dégradé

L’ordre de diagnostic qui fait gagner du temps, pour « le tunnel est monté mais rien ne répond » : tunnel → routes → pare-feu → service. Chaque étape a sa preuve propre (tailscale status, la console, le journal du pare-feu, un test local sur la machine cible), et on ne passe à la suivante qu’après avoir validé la précédente.


12 · Ce que le tunnel coûte en sécurité

12.1 Énoncer le compromis

Le tunnel donne au tailnet un accès complet aux quatre VLAN, sans passer par le filtrage inter-VLAN. La question en découle naturellement : « votre segmentation est-elle contournable ? »

La réponse honnête est oui — par le tailnet, et c’est un choix documenté.

ArgumentDétail
Périmètre fermé et nominatifLe tailnet ne compte que deux nœuds. Aucun appareil n’y entre sans être explicitement autorisé
Authentification par identitéL’appartenance repose sur un compte, pas sur une adresse IP ni une clé partagée. C’est un périmètre d’identité, pas de réseau
Équivalent fonctionnelCe chemin joue le rôle d’un accès d’administration hors-bande, comme la console de l’hyperviseur — elle aussi hors de portée du pare-feu
Chiffrement de bout en boutWireGuard, sans aucun port ouvert en entrée

Un accès hors-bande n’est pas une faille — c’est une catégorie reconnue. Ce qui serait une faille, c’est de ne pas l’identifier comme tel, de ne pas en restreindre le périmètre, et de ne pas le faire figurer dans la matrice de flux.

12.2 Les trois mesures qui conditionnent la validité de l’argument

La sécurité de tout le laboratoire repose désormais sur le compte du tailnet. Trois mesures, toutes gratuites :

#MesureOù
1Double authentification sur l’identité du tailnetChez le fournisseur d’identité
2Device approval — tout nouvel appareil doit être validé manuellementConsole → Settings → Device management
3Revue périodique de la liste des machinesConsole → Machines

Sans le point 2, quiconque obtiendrait l’identité pourrait inscrire une machine dans le tailnet et hériter aussitôt d’un accès complet aux quatre VLAN. L’approbation manuelle transforme un secret unique en double condition : il faut l’identité et l’action de l’administrateur.

12.3 L’évolution canonique : filtrer dans le tailnet

Trois niveaux de restriction sont possibles. Le troisième est la version canonique.

OptionPrincipeÉvaluation
A · Règle Pass any → anyLe tailnet est une zone de confiance totale Retenue aujourd’hui. Simple, et nécessaire pendant la construction : le diagnostic direct (mariadb -h, nc -zv) depuis le poste serait sinon impossible
B · Restreindre les ports côté pfSensePass TCP any → LAB_NETS : 22, 443, 3389…Restaure la segmentation, mais interdit le diagnostic direct. Trop contraignant tant que le laboratoire se construit
C · ACL et tags côté TailscaleLe filtrage remonte dans le tailnet, avant même d’atteindre le pare-feuLa version canonique. Identifiée comme piste d’amélioration

Le principe de l’option C. Le tailnet possède une politique d’accès — un fichier au format JSON commenté, éditable dans Admin console → Access Controls. Par défaut, elle autorise tout :

{
  "acls": [
    { "action": "accept", "src": ["*"], "dst": ["*:*"] },
  ],
}

Une politique restrictive s’appuierait sur des tags — des étiquettes posées sur les nœuds, qui remplacent le raisonnement par adresse IP :

{
  "tagOwners": {
    "tag:lab-routeur": ["autogroup:admin"],
    "tag:poste-admin": ["autogroup:admin"],
  },

  // les routes du laboratoire sont approuvees d'office
  // pour tout noeud portant le tag du routeur
  "autoApprovers": {
    "routes": { "10.0.0.0/16": ["tag:lab-routeur"] },
  },

  "acls": [
    {
      "action": "accept",
      "src":    ["tag:poste-admin"],
      "dst":    ["10.0.30.0/24:22,443", "10.0.40.1:443"],
    },
  ],
}

Esquisse à éprouver, pas à copier les yeux fermés. Une politique d’accès se teste avec un second accès ouvert — ici la console de l’hyperviseur — car une erreur de syntaxe ou de périmètre peut couper le tunnel que l’on est en train d’utiliser pour la corriger.

Ce que l’option C change vraiment. En A et B, le paquet traverse le tunnel puis est filtré à l’arrivée. En C, il n’entre jamais dans le tunnel : le filtrage a lieu à la source, dans le plan de contrôle. C’est la différence entre fermer une porte et ne pas donner la clé.


13 · Pièges et checklists

13.1 Les dix pièges

#PiègeConséquence
1Se reconnecter avec une identité déjà utiliséeOn rejoint le tailnet existant au lieu d’en créer un
2Oublier d’approuver les routes dans la consoleLe nœud est visible, aucun réseau n’est joignable
3Oublier « Use Tailscale subnets » sur le posteMême symptôme que le piège 2, cause différente
4Oublier la règle de pare-feu sur l’onglet TailscaleMême symptôme que les pièges 2 et 3, troisième cause
5Laisser l’expiration de clé activeDéconnexion silencieuse au bout d’environ 180 jours
6Cocher Accept DNS sur un nœud qui est serveur DNSÉcrase la configuration de résolution du laboratoire
7Chercher tailscale0 dans Interface AssignmentsPerte de temps : l’assignation n’est pas nécessaire
8Restreindre la source de la règle à 100.64.0.0/10Casse le trafic IPv6 du tailnet
9Placer le subnet router derrière le pare-feuLe SNAT masque les adresses sources et aveugle le filtrage
10Générer une clé réutilisable et la conserverUn secret durable qui enrôle autant de machines qu’on veut

Les pièges 2, 3 et 4 produisent exactement le même symptôme — le nœud répond en 100.x, rien ne répond en 10.0.x.x. Il faut donc les vérifier dans l’ordre, et non au hasard : console (route approuvée ?), poste (subnets acceptés ?), pare-feu (règle présente ?).

13.2 Checklist — mise en service d’un subnet router

  • Tailnet dédié, sur une identité qui ne sert à rien d’autre
  • Clé d’authentification non réutilisable, et révoquée après usage
  • Le nœud est le routeur, pas une machine derrière lui
  • Réacheminement de paquets actif (implicite sur pfSense, à activer sur Linux)
  • Routes annoncées : exactement les réseaux à exposer, chacune décrite
  • Accept DNS décoché si le nœud est lui-même serveur DNS
  • Routes approuvées dans la console
  • Expiration de clé désactivée sur le nœud
  • Use Tailscale subnets coché sur le poste
  • Règle de pare-feu créée sur l’onglet dédié, en IPv4+IPv6
  • Validation faite depuis l’extérieur du réseau, pas seulement sur place

13.3 Checklist — sécurité du tailnet

  • Double authentification active sur l’identité
  • Device approval activé
  • Liste des machines revue — aucun nœud inconnu ni obsolète
  • Aucune clé d’authentification valide qui traîne
  • L’accès par le tunnel figure dans la matrice de flux, comme toute autre voie d’entrée
  • La question « que peut faire quelqu’un qui obtient ce compte ? » a une réponse écrite

13.4 Checklist — avant de dire « Tailscale ne marche pas »

  • tailscale status : le nœud est-il active ?
  • tx et rx sont-ils tous les deux non nuls ?
  • Si oui → le tunnel fonctionne, chercher au-delà
  • La cible répond-elle depuis une machine du même VLAN ?
  • Le journal du pare-feu montre-t-il le paquet, et sur quelle interface ?
  • Le service visé écoute-t-il vraiment ? (ss -tlnp sur la cible)

Le réflexe à garder. Tailscale rend l’accès distant si simple qu’on oublie ce qu’il est : une voie d’entrée de plein droit dans l’infrastructure, qui ne doit rien au pare-feu. Elle mérite donc le même traitement que le WAN — figurer au schéma, figurer à la matrice de flux, et avoir un responsable identifié. Un accès que l’on ne documente pas est un accès que l’on ne révoque pas.