Post

Headscale Tailscale Technitium - Résolution DNS home.arpa

Headscale Tailscale Technitium - Résolution DNS home.arpa

Informations

cwwk

Serveur Debian qui héberge Technitium :

1
2
3
4
5
6
hostname
ip -br addr
ip addr show tailscale0
tailscale status
tailscale ip -4
tailscale ip -6

Vous devez confirmer :

1
2
3
4
LAN        : 192.168.0.205
Tailscale : 100.64.0.2
Tailscale : fd7a:115c:a1e0::2
Zone DNS   : home.arpa

VPS sxb

Sauvegardez les configurations :

1
2
3
sudo cp -a /etc/headscale /etc/headscale.backup-$(date +%F) 2>/dev/null || true
sudo cp -a /etc/ufw /etc/ufw.backup-$(date +%F)
sudo cp -a /etc/resolv.conf /etc/resolv.conf.backup-$(date +%F)

Technitium

Dans Technitium, exportez également la zone home.arpa ou sauvegardez sa configuration depuis l’interface d’administration.

Serveur Debian cwwk

Parefeu UFW

Commencez par afficher les règles numérotées :

1
sudo ufw status numbered

Supprimez les règles trop ouvertes :

1
2
DNS ALLOW Anywhere
DNS (v6) ALLOW Anywhere (v6)

Utilisez leur numéro :

1
sudo ufw delete NUMERO

Ajoutez les autorisations DNS limitées au LAN :

1
2
3
4
5
sudo ufw allow from 192.168.0.0/24 to any port 53 proto udp
sudo ufw allow from 192.168.0.0/24 to any port 53 proto tcp

sudo ufw allow from 192.168.10.0/24 to any port 53 proto udp
sudo ufw allow from 192.168.10.0/24 to any port 53 proto tcp

Ajoutez ensuite l’accès DNS par Tailscale :

1
2
sudo ufw allow in on tailscale0 to any port 53 proto udp
sudo ufw allow in on tailscale0 to any port 53 proto tcp

VOIR si régle précédente ne suffit pas
Pour IPv6 Tailscale :

1
2
sudo ufw allow from fd7a:115c:a1e0::/48 to any port 53 proto udp
sudo ufw allow from fd7a:115c:a1e0::/48 to any port 53 proto tcp

Vérifiez :

1
sudo ufw status verbose

L’objectif est d’avoir :

1
2
3
4
DNS depuis 192.168.0.0/24       ALLOW
DNS depuis 192.168.10.0/24      ALLOW
DNS via tailscale0               ALLOW
DNS depuis Internet              DENY

Vos règles NFS restent séparées :

1
2
2049/tcp on tailscale0 ALLOW
2049/tcp               DENY

Ne les modifiez pas dans le cadre de cette migration DNS.

Client tailscale

Sur le serveur Debian qui héberge Technitium, gardez :

1
sudo tailscale set --accept-dns=false

Cela évite que Tailscale remplace le résolveur DNS local du serveur DNS.

Technitium

zone home.arpa

Dans Technitium, créez ou vérifiez une zone primaire :

1
home.arpa

Ajoutez au minimum :

@           IN SOA  dns.home.arpa. hostadmin.home.arpa. (
                    52
                    900
                    300
                    604800
                    900 )

@           IN NS   dns.home.arpa.
dns         IN A    192.168.0.205

Vos enregistrements locaux :

cwwk        IN A     192.168.0.205
ged         IN A     192.168.0.205
link        IN A     192.168.0.205
lldap       IN A     192.168.0.205
portainer   IN A     192.168.0.205
pve         IN A     192.168.0.215
site        IN A     192.168.0.205

Ajoutez votre wildcard :

*           IN A     192.168.0.205

Si vous utilisez réellement IPv6 pour cwwk, conservez son enregistrement AAAA. Sinon, retirez-le pour éviter que certains clients tentent une connexion IPv6 non fonctionnelle.

Testez immédiatement depuis le serveur Debian :

1
2
dig @192.168.0.205 cwwk.home.arpa
dig @192.168.0.205 test.home.arpa

Résultat attendu :

1
2
cwwk.home.arpa.  IN A 192.168.0.205
test.home.arpa.  IN A 192.168.0.205

ACL Technitium

Dans les paramètres du résolveur Technitium, autorisez les réseaux suivants :

1
2
3
4
5
127.0.0.0/8
192.168.0.0/24
192.168.10.0/24
100.64.0.0/10
fd7a:115c:a1e0::/48

Dans l’interface Web :

  1. Ouvrez Settings
  2. Allez dans la section Recursion
  3. Recherchez le champ Allowed Networks / Allowed Recursive Name Server Clients (le libellé peut varier légèrement selon la version)
  4. Ajoutez les CIDR, à raison d’un réseau par ligne :
  5. Cliquez sur Save Settings.

Cette liste contrôle les sources qui peuvent utiliser Technitium en tant que résolveur récursif. Les hôtes hors de ces plages ne doivent pas recevoir de résolution récursive, ce qui évite de transformer le serveur en open resolver exploitable. L’interface d’administration est normalement accessible sur le port 5380 (http://<IP-du-serveur>:5380/).[technitium][blog.technitium]

Vérifiez aussi Settings → General → DNS Server Local End Points :

  • Cette option définit sur quelles adresses et quels ports Technitium écoute les requêtes DNS.
  • Pour servir plusieurs interfaces IPv4 et IPv6, une configuration courante est :
  • L’autorisation effective des clients demeure ensuite limitée par la liste Allowed Networks dans les réglages de récursion.

Technitium documente par exemple 0.0.0.0:53,[::]:53 comme endpoints locaux DNS dans sa configuration d’API.[github]

Attention aux réseaux indiqués

  • 127.0.0.0/8 : loopback IPv4 local.
  • 192.168.0.0/24 et 192.168.10.0/24 : vos deux LAN IPv4.
  • 100.64.0.0/10 : espace CGNAT ; pertinent notamment pour des clients Tailscale utilisant des adresses 100.x.y.z.
  • fd7a:115c:a1e0::/48 : préfixe IPv6 ULA ; assurez-vous qu’il correspond bien au préfixe effectivement attribué à vos clients.

Si votre objectif est aussi d’autoriser l’accès à la console Web depuis ces réseaux, c’est un réglage distinct : Settings → Web Service, avec les adresses d’écoute du service Web et, au besoin, les règles pare-feu/reverse proxy. Technitium expose habituellement la console HTTP sur le port 5380 et HTTPS sur 53443.[blog.technitium] Le réseau Tailscale est important :

1
100.64.0.0/10

Il contient l’adresse du serveur Technitium :

1
100.64.0.2

N’autorisez pas la récursion DNS depuis Internet.

Dans les points d’écoute DNS Technitium, utilisez de préférence :

1
2
0.0.0.0:53
[::]:53

Puis vérifiez sur Debian :

1
sudo ss -lunpt | grep ':53'

Technitium doit écouter en UDP et TCP.

Tester Technitium via Tailscale

Depuis le serveur Debian lui-même :

1
2
dig @100.64.0.2 cwwk.home.arpa
dig @100.64.0.2 test.home.arpa

Ces tests vérifient simultanément :

  • l’écoute de Technitium sur tailscale0 ;
  • le pare-feu UFW ;
  • les ACL Technitium ;
  • la zone home.arpa.

Le résultat doit être positif avant de modifier Headscale.

Vous pouvez également tester en IPv6 :

1
dig @fd7a:115c:a1e0::2 cwwk.home.arpa

Si IPv6 échoue, utilisez uniquement 100.64.0.2 dans la configuration Headscale dans un premier temps.

VPS Headscale

Section dns - /etc/headscale/config.yaml

Sur le VPS :

1
2
sudo cp -a /etc/headscale/config.yaml \
  /etc/headscale/config.yaml.backup-$(date +%F)

Modification configuration /etc/headscale/config.yaml

Vous pouvez remplacer example.com par un sous-domaine qui vous appartient :

1
base_domain: tailscale.xoyize.xyz

à condition que ce nom ne crée pas de conflit avec votre usage DNS actuel.

Votre section DNS doit devenir :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
dns:
  magic_dns: true
  base_domain: tailscale.xoyize.xyz
  # Utiliser le DNS de l'hébergeur (ou le vôtre) et ne garder Tailscale que pour le tailnet
  # override_local_dns: false
  override_local_dns: false

  nameservers:
    global:
      - 1.1.1.1
      - 1.0.0.1
      - 2606:4700:4700::1111
      - 2606:4700:4700::1001

    split:
      home.arpa:
        - 100.64.0.2
        - fd7a:115c:a1e0::2

  search_domains: []
  extra_records: []

Vous pouvez commencer avec IPv4 seulement :

1
2
3
    split:
      home.arpa:
        - 100.64.0.2

Puis ajouter :

1
        - fd7a:115c:a1e0::2

après validation d’IPv6.

base_domain: example.com est le domaine MagicDNS de Headscale. Il est distinct de :

1
home.arpa

Ne définissez pas :

1
base_domain: home.arpa

home.arpa doit rester réservé à Technitium.

Politique - /etc/headscale/policy.hujson

La règle NFS ne change pas. Vous conservez exactement :

1
2
3
4
5
{
  "action": "accept",
  "src": ["tag:nfs-client"],
  "dst": ["tag:nfs-server:2049"]
}

Sur alder, vous ajoutez simplement tag:dns-server en plus de ses tags actuels. Un nœud peut porter plusieurs tags, et chaque tag peut être utilisé indépendamment dans les ACL.[tailscale][headscale]

Modifier le fichier /etc/headscale/policy.hujson

Ajoutez l’autorisation pour un nouveau tag :

1
"tag:dns-server": ["group:mesh-admin"],

Puis gardez votre ACL NFS et faites viser le DNS exclusivement vers tag:dns-server :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
{
  "groups": {
    "group:mesh-admin": ["yann@"]
  },

  "tagOwners": {
    "tag:admin": ["group:mesh-admin"],
    "tag:server": ["group:mesh-admin"],
    "tag:nfs-server": ["group:mesh-admin"],
    "tag:nfs-client": ["group:mesh-admin"],
    "tag:dns-server": ["group:mesh-admin"],
    "tag:mobile": ["group:mesh-admin"],
    "tag:control-plane": ["group:mesh-admin"]
  },

  "acls": [
    {
      "action": "accept",
      "src": ["tag:admin"],
      "dst": [
        "tag:server:51002",
        "tag:server:55045",
        "tag:server:55134",
        "tag:server:55149",
        "tag:server:55215",
        "tag:server:55229",
        "tag:server:55240",
        "tag:server:56230",
        "tag:nfs-server:55205"
      ]
    },

    {
      "action": "accept",
      "src": ["tag:nfs-client"],
      "dst": ["tag:nfs-server:2049"]
    },

    {
      "action": "accept",
      "src": ["*"],
      "proto": "udp",
      "dst": ["tag:dns-server:53"]
    },
    {
      "action": "accept",
      "src": ["*"],
      "proto": "tcp",
      "dst": ["tag:dns-server:53"]
    }
  ]
}

Après adoption de la solution recommandée, le nœud alder doit conserver son rôle NFS et recevoir le rôle DNS :

1
2
3
4
alder
├── tag:server
├── tag:nfs-server
└── tag:dns-server

Ainsi :

Service sur alder Tag ciblé par l’ACL Port autorisé Clients autorisés
NFS tag:nfs-server TCP 2049 tag:nfs-client
Technitium DNS tag:dns-server UDP 53 + TCP 53 Tous les nœuds (*)
Administration existante tag:server / tag:nfs-server Vos ports listés tag:admin

Le sélecteur tag:nfs-server reste donc associé au rôle NFS, même si le même hôte porte aussi tag:dns-server. Un tag cible tous les appareils portant ce tag, et les tags multiples s’additionnent pour l’identité de l’appareil.[tailscale][tailscale]

Vérification et redémarrage headscale

Vérifier puis redémarrer Headscale

1
sudo headscale configtest

Redémarrez directement et surveillez les journaux :

1
2
3
sudo systemctl restart headscale
sudo systemctl status headscale
sudo journalctl -u headscale -n 100 --no-pager

Le VPS Headscale n’a pas besoin d’être un serveur DNS pour les clients. Il distribue uniquement la configuration indiquant que :

1
home.arpa → 100.64.0.2

Ne configurez pas 192.168.0.205 dans Headscale : cette adresse LAN n’est pas directement accessible par les clients Tailscale, sauf si vous mettez en place du subnet routing.

Vérifier pare-feu

Le VPS doit autoriser les ports nécessaires à Headscale, notamment :

1
2
443/tcp
3478/udp

Le port 53 n’est pas nécessaire sur le VPS pour cette architecture.

Le DNS est fourni par le serveur Technitium à travers le réseau Tailscale :

1
Client Tailscale → 100.64.0.2:53

Ajout tag sur alder

Avec l’ID Headscale 2, définissez tous les tags explicitement, sans retirer les existants :

1
2
sudo headscale nodes tag -i 2 \
  -t tag:server,tag:nfs-server,tag:dns-server

Headscale permet d’affecter plusieurs tags, séparés par des virgules, via headscale nodes tag. Attention : la commande définit la liste fournie ; c’est pourquoi il faut répéter tag:server et tag:nfs-server, pas seulement ajouter tag:dns-server.[headscale]

Vérifiez ensuite :

1
sudo headscale nodes list

Vous devez voir pour alder dans la colonne Tags :

1
2
3
tag:server
tag:nfs-server
tag:dns-server

Avec cette séparation :

1
2
tag:nfs-client ── TCP/2049 ──> tag:nfs-server
tous les clients ── UDP/TCP 53 ──> tag:dns-server

Si, plus tard, vous étiquetez pve ou un autre hôte avec tag:nfs-server, les clients NFS pourront atteindre son port 2049, comme prévu. En revanche, cet hôte ne sera pas automatiquement exposé comme résolveur DNS : seul un nœud ayant explicitement tag:dns-server recevra le trafic DNS.

Ajout tag pc1 e6230

1
2
3
4
# 3  | pc1
sudo headscale nodes tag -i 3 \
  -t tag:nfs-client,tag:server
# 4  | e6230

Clients Tailscale

Activer acceptation DNS Tailscale

Sur chaque client Tailscale qui doit recevoir la configuration Headscale :

Vérifier si dns true

1
sudo tailscale get accept-dns

Si false, l’activer

1
sudo tailscale set --accept-dns=true

Sur les clients Linux, vérifiez ensuite :

1
resolvectl status

Suivant paramètre VPS /etc/headscale/config.yaml
override_local_dns: false (choix actuel)

1
2
3
4
5
6
7
8
9
10
Global
         Protocols: +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
  resolv.conf mode: stub

Link 2 (ens3)
    Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 213.186.33.99
       DNS Servers: 213.186.33.99
     Default Route: yes

override_local_dns: true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Global
         Protocols: +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
  resolv.conf mode: stub

Link 2 (ens3)
    Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 213.186.33.99
       DNS Servers: 213.186.33.99
     Default Route: yes

Link 6 (tailscale0)
    Current Scopes: DNS
         Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 100.100.100.100
       DNS Servers: 100.100.100.100 fd7a:115c:a1e0::53
        DNS Domain: tailscale.xoyize.xyz ~0.e.1.a.c.5.1.1.a.7.d.f.ip6.arpa ~100.100.in-addr.arpa
                    ~101.100.in-addr.arpa ~102.100.in-addr.arpa ~103.100.in-addr.arpa ~104.100.in-addr.arpa
                    ~105.100.in-addr.arpa ~106.100.in-addr.arpa ~107.100.in-addr.arpa ~108.100.in-addr.arpa
                    ~109.100.in-addr.arpa ~110.100.in-addr.arpa ~111.100.in-addr.arpa ~112.100.in-addr.arpa
                    ~113.100.in-addr.arpa ~114.100.in-addr.arpa ~115.100.in-addr.arpa ~116.100.in-addr.arpa
                    ~117.100.in-addr.arpa ~118.100.in-addr.arpa ~119.100.in-addr.arpa ~120.100.in-addr.arpa
                    ~121.100.in-addr.arpa ~122.100.in-addr.arpa ~123.100.in-addr.arpa ~124.100.in-addr.arpa
                    ~125.100.in-addr.arpa ~126.100.in-addr.arpa ~127.100.in-addr.arpa ~64.100.in-addr.arpa
                    ~65.100.in-addr.arpa ~66.100.in-addr.arpa ~67.100.in-addr.arpa ~68.100.in-addr.arpa
                    ~69.100.in-addr.arpa ~70.100.in-addr.arpa ~71.100.in-addr.arpa ~72.100.in-addr.arpa
                    ~73.100.in-addr.arpa ~74.100.in-addr.arpa ~75.100.in-addr.arpa ~76.100.in-addr.arpa
                    ~77.100.in-addr.arpa ~78.100.in-addr.arpa ~79.100.in-addr.arpa ~80.100.in-addr.arpa
                    ~81.100.in-addr.arpa ~82.100.in-addr.arpa ~83.100.in-addr.arpa ~84.100.in-addr.arpa
                    ~85.100.in-addr.arpa ~86.100.in-addr.arpa ~87.100.in-addr.arpa ~88.100.in-addr.arpa
                    ~89.100.in-addr.arpa ~90.100.in-addr.arpa ~91.100.in-addr.arpa ~92.100.in-addr.arpa
                    ~93.100.in-addr.arpa ~94.100.in-addr.arpa ~95.100.in-addr.arpa ~96.100.in-addr.arpa
                    ~97.100.in-addr.arpa ~98.100.in-addr.arpa ~99.100.in-addr.arpa ~home.arpa
     Default Route: no

Sur un client Linux, /etc/resolv.conf peut afficher :

1
nameserver 100.100.100.100

Ce n’est pas forcément un problème. Cette adresse est le proxy DNS local de Tailscale. Le proxy doit transférer les requêtes de home.arpa vers 100.64.0.2.

Tester depuis un client Tailscale

Commencez par un test direct :

1
dig @100.64.0.2 cwwk.home.arpa

Puis testez la résolution normale :

1
2
3
dig cwwk.home.arpa
dig test.home.arpa
dig pve.home.arpa

Vérifiez également le serveur indiqué par dig :

1
SERVER: 100.100.100.100#53

Cette valeur peut être normale avec Tailscale. Pour confirmer le chemin réel, contrôlez les journaux ou statistiques de requêtes dans Technitium.

Testez enfin l’accès aux services :

1
2
curl -I https://cwwk.home.arpa
curl -I https://test.home.arpa

Les certificats wildcard doivent correspondre aux noms utilisés :

1
2
cwwk.home.arpa
test.home.arpa

Un certificat *.home.arpa couvre ces noms, mais pas nécessairement le nom racine :

1
home.arpa

Vérifier plusieurs types de clients

À tester depuis :

Client Test attendu
Serveur Technitium dig @192.168.0.205 cwwk.home.arpa
Serveur Technitium via Tailscale dig @100.64.0.2 cwwk.home.arpa
Client LAN 192.168.0.0/24 dig cwwk.home.arpa
Client LAN 192.168.10.0/24 dig cwwk.home.arpa
Client Tailscale IPv4 dig cwwk.home.arpa
Client Tailscale IPv6 dig cwwk.home.arpa

Résultat attendu dans tous les cas :

1
cwwk.home.arpa. IN A 192.168.0.205

État final recherché

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LAN
 │
 │ 192.168.0.205:53
 ▼
Technitium
 │
 ├── home.arpa
 ├── *.home.arpa
 └── résolution récursive
 ▲
 │ 100.64.0.2:53
 │
Réseau Tailscale
 ▲
 │ DNS split home.arpa
 │
Headscale VPS

Configuration finale essentielle :

1
2
3
4
5
6
Technitium LAN       192.168.0.205
Technitium Tailscale 100.64.0.2
Zone locale          home.arpa
Réseau Tailscale     100.64.0.0/10
Réseau Tailscale v6  fd7a:115c:a1e0::/48
Headscale split DNS  home.arpa → 100.64.0.2

Ne modifiez pas encore le DNS des clients tant que ce test ne fonctionne pas :

1
dig @100.64.0.2 cwwk.home.arpa

Erreurs

Diagnostiquer

Sur le serveur Technitium :

1
2
3
sudo ss -lunpt | grep ':53'
sudo ufw status verbose
sudo journalctl -f

Tester directement :

1
dig @100.64.0.2 cwwk.home.arpa

Depuis le client Tailscale :

1
2
3
tailscale ping 100.64.0.2
ping 100.64.0.2
dig @100.64.0.2 cwwk.home.arpa

Interprétation :

  • tailscale ping échoue : problème Headscale/Tailscale ou connectivité mesh ;
  • tailscale ping fonctionne mais dig @100.64.0.2 échoue : UFW, Technitium ou ACL ;
  • dig @100.64.0.2 fonctionne mais dig cwwk.home.arpa échoue : configuration DNS Headscale ou client n’acceptant pas le DNS ;
  • le nom résout mais HTTPS échoue : problème de reverse proxy, certificat ou routage ;
  • la requête arrive dans Technitium mais retourne NXDOMAIN : problème de zone ou d’enregistrement.

VPS contourne systemd-resolved

Pourquoi la résolution DNS home.arpa ne fonctionne pas sur yannir ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
yair@yannir:~$ dig cwwk.home.arpa

; <<>> DiG 9.20.29-1~deb13u1-Debian <<>> cwwk.home.arpa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 39630
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;cwwk.home.arpa.			IN	A

;; AUTHORITY SECTION:
home.arpa.		3600	IN	SOA	prisoner.iana.org. hostmaster.root-servers.org. 1 604800 60 604800 604800

;; Query time: 23 msec
;; SERVER: 213.136.95.10#53(213.136.95.10) (UDP)
;; WHEN: Mon Sep 28 17:18:31 CEST 2026
;; MSG SIZE  rcvd: 120

yair@yannir:~$ resolvectl status
Global
         Protocols: +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
  resolv.conf mode: uplink

Link 2 (eth0)
    Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 213.136.95.10
       DNS Servers: 213.136.95.10 213.136.95.11 2a02:c207::1:53
     Default Route: yes

Link 10 (tailscale0)
    Current Scopes: DNS
         Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 100.100.100.100
       DNS Servers: 100.100.100.100 fd7a:115c:a1e0::53
        DNS Domain: tailscale.xoyize.xyz ~0.e.1.a.c.5.1.1.a.7.d.f.ip6.arpa ~100.100.in-addr.arpa
                    ~101.100.in-addr.arpa ~102.100.in-addr.arpa ~103.100.in-addr.arpa ~104.100.in-addr.arpa
                    ~105.100.in-addr.arpa ~106.100.in-addr.arpa ~107.100.in-addr.arpa ~108.100.in-addr.arpa
                    ~109.100.in-addr.arpa ~110.100.in-addr.arpa ~111.100.in-addr.arpa ~112.100.in-addr.arpa
                    ~113.100.in-addr.arpa ~114.100.in-addr.arpa ~115.100.in-addr.arpa ~116.100.in-addr.arpa
                    ~117.100.in-addr.arpa ~118.100.in-addr.arpa ~119.100.in-addr.arpa ~120.100.in-addr.arpa
                    ~121.100.in-addr.arpa ~122.100.in-addr.arpa ~123.100.in-addr.arpa ~124.100.in-addr.arpa
                    ~125.100.in-addr.arpa ~126.100.in-addr.arpa ~127.100.in-addr.arpa ~64.100.in-addr.arpa
                    ~65.100.in-addr.arpa ~66.100.in-addr.arpa ~67.100.in-addr.arpa ~68.100.in-addr.arpa
                    ~69.100.in-addr.arpa ~70.100.in-addr.arpa ~71.100.in-addr.arpa ~72.100.in-addr.arpa
                    ~73.100.in-addr.arpa ~74.100.in-addr.arpa ~75.100.in-addr.arpa ~76.100.in-addr.arpa
                    ~77.100.in-addr.arpa ~78.100.in-addr.arpa ~79.100.in-addr.arpa ~80.100.in-addr.arpa
                    ~81.100.in-addr.arpa ~82.100.in-addr.arpa ~83.100.in-addr.arpa ~84.100.in-addr.arpa
                    ~85.100.in-addr.arpa ~86.100.in-addr.arpa ~87.100.in-addr.arpa ~88.100.in-addr.arpa
                    ~89.100.in-addr.arpa ~90.100.in-addr.arpa ~91.100.in-addr.arpa ~92.100.in-addr.arpa
                    ~93.100.in-addr.arpa ~94.100.in-addr.arpa ~95.100.in-addr.arpa ~96.100.in-addr.arpa
                    ~97.100.in-addr.arpa ~98.100.in-addr.arpa ~99.100.in-addr.arpa ~home.arpa
     Default Route: no

yann@yannig:~$ dig cwwk.home.arpa

; <<>> DiG 9.20.29-1~deb13u1-Debian <<>> cwwk.home.arpa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48641
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;cwwk.home.arpa.			IN	A

;; ANSWER SECTION:
cwwk.home.arpa.		86400	IN	A	192.168.0.205

;; Query time: 36 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Mon Sep 28 17:18:10 CEST 2026
;; MSG SIZE  rcvd: 59

---

yann@yannig:~$ resolvectl status
Global
         Protocols: +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
  resolv.conf mode: stub

Link 2 (ens3)
    Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 213.186.33.99
       DNS Servers: 213.186.33.99
     Default Route: yes

Link 6 (tailscale0)
    Current Scopes: DNS
         Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 100.100.100.100
       DNS Servers: 100.100.100.100 fd7a:115c:a1e0::53
        DNS Domain: tailscale.xoyize.xyz ~0.e.1.a.c.5.1.1.a.7.d.f.ip6.arpa ~100.100.in-addr.arpa
                    ~101.100.in-addr.arpa ~102.100.in-addr.arpa ~103.100.in-addr.arpa ~104.100.in-addr.arpa
                    ~105.100.in-addr.arpa ~106.100.in-addr.arpa ~107.100.in-addr.arpa ~108.100.in-addr.arpa
                    ~109.100.in-addr.arpa ~110.100.in-addr.arpa ~111.100.in-addr.arpa ~112.100.in-addr.arpa
                    ~113.100.in-addr.arpa ~114.100.in-addr.arpa ~115.100.in-addr.arpa ~116.100.in-addr.arpa
                    ~117.100.in-addr.arpa ~118.100.in-addr.arpa ~119.100.in-addr.arpa ~120.100.in-addr.arpa
                    ~121.100.in-addr.arpa ~122.100.in-addr.arpa ~123.100.in-addr.arpa ~124.100.in-addr.arpa
                    ~125.100.in-addr.arpa ~126.100.in-addr.arpa ~127.100.in-addr.arpa ~64.100.in-addr.arpa
                    ~65.100.in-addr.arpa ~66.100.in-addr.arpa ~67.100.in-addr.arpa ~68.100.in-addr.arpa
                    ~69.100.in-addr.arpa ~70.100.in-addr.arpa ~71.100.in-addr.arpa ~72.100.in-addr.arpa
                    ~73.100.in-addr.arpa ~74.100.in-addr.arpa ~75.100.in-addr.arpa ~76.100.in-addr.arpa
                    ~77.100.in-addr.arpa ~78.100.in-addr.arpa ~79.100.in-addr.arpa ~80.100.in-addr.arpa
                    ~81.100.in-addr.arpa ~82.100.in-addr.arpa ~83.100.in-addr.arpa ~84.100.in-addr.arpa
                    ~85.100.in-addr.arpa ~86.100.in-addr.arpa ~87.100.in-addr.arpa ~88.100.in-addr.arpa
                    ~89.100.in-addr.arpa ~90.100.in-addr.arpa ~91.100.in-addr.arpa ~92.100.in-addr.arpa
                    ~93.100.in-addr.arpa ~94.100.in-addr.arpa ~95.100.in-addr.arpa ~96.100.in-addr.arpa
                    ~97.100.in-addr.arpa ~98.100.in-addr.arpa ~99.100.in-addr.arpa ~home.arpa
     Default Route: no

La différence est dans la ligne resolv.conf mode :

  yannig (fonctionne) yannir (échoue)
resolv.conf mode stub uplink
Serveur interrogé par dig 127.0.0.53 (le stub de resolved) 213.136.95.10 (DNS de l’hébergeur, en direct)

Sur yannir, /etc/resolv.conf pointe vers /run/systemd/resolve/resolv.conf (mode uplink). Ce fichier liste directement les DNS des interfaces (ici ceux de l’hébergeur), sans passer par le stub. Les applications interrogent donc l’hébergeur, qui ne connaît pas cwwk.home.arpa et répond NXDOMAIN.

Le routage par domaine (~home.arpa vers Tailscale, 100.100.100.100) est bien présent sur les deux machines, mais il n’est appliqué que si les requêtes passent par resolved. Votre config Tailscale et resolved est correcte sur les deux, seul le lien symbolique diffère.

Vérification préalable (facultative). Pour confirmer que resolved fait bien son travail avant de changer quoi que ce soit :

1
resolvectl query cwwk.home.arpa

Résultat

1
2
3
4
5
6
cwwk.home.arpa: 192.168.0.205                  -- link: tailscale0
                2a01:e0a:95a:e2f0:aab8:e0ff:fe04:ec45 -- link: tailscale0

-- Information acquired via protocol DNS in 61.8ms.
-- Data is authenticated: no; Data was acquired via local or encrypted transport: no
-- Data from: network

Cette commande passe par resolved et doit fonctionner même en mode uplink. Si c’est le cas, le diagnostic est confirmé.

Correction sur yannir

1
2
3
4
ls -l /etc/resolv.conf     # confirmer : ... -> /run/systemd/resolve/resolv.conf
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
resolvectl status | head -4   # doit afficher "resolv.conf mode: stub"
dig cwwk.home.arpa

Le dig doit maintenant interroger 127.0.0.53 et retourner 192.168.0.205.

Pourquoi c’est arrivé

Sur un VPS, cloud-init, un script de l’hébergeur ou un paquet (resolvconf, openresolv) peut recréer le lien vers resolv.conf (uplink), ou l’installation de Tailscale peut ne pas l’avoir modifié. Si le lien revient après un redémarrage, cherchez qui le réécrit :

1
2
dpkg -l | grep -E 'resolvconf|openresolv'
grep -r resolv /etc/cloud/ 2>/dev/null | head

home.arpa est routé uniquement vers Tailscale (~home.arpa). Cela suppose qu’un subnet router ou un split DNS est défini dans la console Tailscale pour ce domaine. C’est déjà le cas puisque yannig résout correctement.

Cet article est sous licence CC BY 4.0 par l'auteur.