Sous macOS 26, les configurations DNS personnalisées comme `.internal` ne fonctionnent plus
(gist.github.com/adamamyl)- Sous macOS 26.3.1, les configurations DNS par domaine basées sur
/etc/resolver/sont neutralisées pour les TLD non standard, ce qui interrompt les environnements de développement locaux existants mDNSRespondertraite toutes les requêtes vers des TLD personnalisés uniquement via mDNS et ne consulte jamais les serveurs de noms unicast configurés.internal,.test,.home.arpa,.lanet, plus largement, l’ensemble des TLD absents de la zone racine de l’IANA échouent, alors que les domaines standard (google.com, etc.) continuent de fonctionner- La seule solution temporaire consiste à enregistrer manuellement les entrées dans
/etc/hosts, mais cela reste peu réaliste dans des environnements dynamiques (Docker, Kubernetes, etc.) - C’est tout le workflow DNS local utilisé de longue date par la communauté des développeurs macOS qui se retrouve cassé, avec un impact étendu sur les outils de développement et les intégrations VPN
Régression DNS apparue dans macOS 26
-
Sous macOS 26.3.1 (Darwin 25.3.0, Build 25D771280a), la fonctionnalité de configuration DNS par domaine via
/etc/resolver/est cassée- Elle fonctionnait normalement jusqu’à macOS 25.x, puis a cessé de marcher après la mise à jour vers la version 26
- Bien qu’il s’agisse d’une fonctionnalité documentée officiellement par Apple (
man 5 resolver), elle ne fonctionne plus avec les TLD non standard
-
mDNSResponderintercepte toutes les requêtes vers les TLD personnalisés via mDNS et ignore les serveurs de noms unicast configurés- Toutes les applications utilisant
getaddrinfo()(ping,curl,python3 socket) renvoient une erreur « Unknown host » - D’après
tcpdump, aucun trafic n’est émis vers le DNS local (127.0.0.1:53) - La commande
dns-sd -G v4affiche une réponse « No Such Record » avec un TTL anormalement long (environ 108 002 secondes)
- Toutes les applications utilisant
Tests et procédure de reproduction
-
Configuration de
dnsmasqinstallé via Homebrew comme résolveur DNS local, avec mappage des domaines*.internalou*.example-privatevers 127.0.0.1- Le fichier
/etc/resolver/example-privatecontientnameserver 127.0.0.1 - La commande
scutil --dnsmontre bien que ce résolveur est enregistré - Pourtant,
ping probe.example-privaterenvoie l’erreur « Unknown host »
- Le fichier
-
dig @127.0.0.1et la commandehostrépondent correctement, mais toutes les applications qui utilisent le résolveur système échouent- Cela montre que
mDNSResponderbloque les requêtes en interne et n’appelle pas le DNS unicast
- Cela montre que
Liste des TLD affectés
| TLD | État | Remarque |
|---|---|---|
.internal |
Échec | TLD à usage spécial d’un draft IETF, fonctionnait sous macOS 25 |
.test |
Échec | Réservé aux tests locaux selon la RFC 6761 §6.2 |
.home.arpa |
Échec | Réservé aux réseaux domestiques selon la RFC 8375 |
.lan |
Échec | Non officiel mais largement utilisé |
| Autres TLD non enregistrés | Échec | Tous les TLD absents de la zone racine de l’IANA |
- Dans le cas de
.test, alors qu’il devrait être résolu via le DNS normal conformément à la RFC 6761, macOS 26 le traite comme du mDNS uniquement - En revanche, les domaines enregistrés auprès de l’IANA comme
google.comoubbc.co.ukcontinuent de fonctionner normalement
Impact sur les environnements et outils de développement
-
L’ensemble du workflow DNS de développement local est cassé
- Les développeurs qui utilisent
dnsmasq+/etc/resolver/avec*.test,*.internal, etc. - La résolution des noms de conteneurs dans Docker Desktop et autres outils similaires
- Vagrant, Tailscale et les clients VPN qui génèrent automatiquement des fichiers
/etc/resolver/ - Les outils de développement local Kubernetes (
minikube,kind,k3d, etc.) pour la résolution de*.cluster.local
- Les développeurs qui utilisent
-
Comme le système affiche une configuration de résolveur correcte dans
scutil --dns, les utilisateurs ont du mal à identifier le problème et il n’y a ni logs ni messages d’erreur explicites
Solution temporaire et limites
- La seule méthode qui fonctionne consiste à ajouter manuellement les correspondances de domaines dans
/etc/hosts- Cette méthode contourne complètement
mDNSResponder - Mais elle reste peu réaliste avec Docker ou dans des environnements DNS dynamiques, et nécessite des droits
sudoà chaque modification
- Cette méthode contourne complètement
Caractéristiques techniques et environnement de validation
- macOS 26.3.1 (Build 25D771280a), Apple Silicon (arm64)
dnsmasqest installé via Homebrew et écoute sur 127.0.0.1:53- Les commandes
digethostrépondent correctement, tandis queping,curletpython3 socket.getaddrinfoéchouent - Documentation et standards associés :
man 5 resolver— documentation du mécanisme/etc/resolver/sur macOS- RFC 6761 — définition des domaines à usage spécial comme
.test,.localhost,.invalid,.example - RFC 8375 — définition du domaine
home.arpa - IETF draft-ietf-dnsop-interneti-mdn — draft sur le domaine à usage spécial
.internal
3 commentaires
À cause de ça, je ne peux plus utiliser Tailscale MagicDNS depuis plusieurs jours..
J’espère que Tailscale contournera ce problème.
Réactions sur Hacker News
C’est à cause de ce genre de petites irritations (papercuts) que j’ai quitté macOS
Rédiger un bug report avec un LLM, pourquoi pas si c’est relu, mais laisser passer tel quel une erreur évidente comme « ça marchait sur macOS 25 » fait perdre en crédibilité
Si ce type de rapports se multiplie, j’ai l’impression que les gens finiront par jeter les rapports écrits par l’IA à cause de la charge de vérification
Faire écrire un texte par une IA à mon nom donne l’impression que mon temps vaut plus que le tien, ce qui est impoli
Si déclarer publiquement l’usage de l’IA pose problème, alors il faut sans doute reconsidérer l’objectif de cet usage
On peut écrire des exemples tout aussi pénibles sur Linux ou Windows. Au fond, c’est une question de « choisir son poison »
Microsoft était connu pour préserver la rétrocompatibilité, Apple pour casser sans hésiter les fonctionnalités existantes
Aujourd’hui, Microsoft semble moins conservateur qu’avant, et Apple paraît au contraire plus stable qu’autrefois
Avec NixOS, il suffit de choisir la version précédente au démarrage pour restaurer tout le système
J’utilise macOS sur mon portable, mais dans la pratique je travaille surtout dans des conteneurs Linux
macOS 26 est jusqu’ici la version la plus cassante côté compatibilité
Plusieurs changements intentionnels ont rendu le développement d’apps très difficile
Par exemple, l’app Lunar ne peut plus définir arbitrairement la valeur SDR en nits, ce qui bloque le contrôle de luminosité,
et l’app YellowDot ne peut plus ajuster la luminosité de l’indicateur micro, ce qui la rend inutilisable
Il y a aussi plusieurs bugs, comme les événements souris sur les fenêtres sans titre, l’impossibilité d’appliquer des tables gamma,
ou la perte du chemin du fichier source lors d’un glisser-déposer dans des apps comme Clop
J’espère que macOS 27 suivra la même voie (source)
La philosophie de macOS est trop rigide et unilatérale, c’est frustrant
Je n’utilise pas macOS directement, mais en théorie ça semble possible
Je vais sans doute laisser tomber pour le moment
L’idée est d’empêcher les malwares de masquer l’accès à la caméra ou au micro
Et la limite sur la luminosité SDR pourrait aussi servir à anticiper les problèmes de batterie des futurs écrans OLED
J’attends toujours le jour où Apple séparera le matériel et le logiciel
Je veux l’Apple Silicon, mais pas leur OS
Si je ne peux pas exécuter mon propre noyau et mes propres modules, alors ce n’est pas mon matériel
Le portable à côté démarre avec coreboot, et ça résume bien ma philosophie
Pour le développement web local, j’utilise
*.localhostTous les navigateurs modernes le résolvent automatiquement vers 127.0.0.1, donc pas besoin de configurer le DNS ni de modifier le fichier hosts
En revanche, cela ne s’applique pas aux programmes hors navigateur (python, wget, etc.)
*.*.localhostest aussi pris en charge, ce qui permet désormais de reproduire en local la structure de domaine de productionArchiveBox utilise cette fonction pour isoler les domaines par snapshot et réduire les risques de sécurité
.localhostun peu longAvant, j’utilisais
.local, mais il y avait trop de conflitsdev.our-root-domain.com, mappé vers 127.0.0.1 dans le DNS publicSur une vieille machine Yosemite, j’utilisais depuis longtemps une configuration fournissant plusieurs TLD locaux
La méthode
/etc/resolverétait déjà annoncée comme obsolète vers 2014, et elle semble cette fois avoir été complètement suppriméeLa voie correcte consiste désormais à enregistrer la configuration directement avec
scutilscutilseul ne suffit pasCertaines résolutions sous macOS passent encore par mDNSResponder, qui ignore ou écrase ces réglages
Au final, utiliser unbound ou dnsmasq reste plus simple
J’utilise moi aussi plusieurs TLD avec la combinaison
/etc/resolver/X+ dnsmasq, et je n’ai aucun problèmeJ’inclus toujours la directive
domaindans le fichier de configurationEn pratique, cette option m’a presque toujours été nécessaire
Ajouter l’entrée
domainpourrait peut-être résoudre le problèmeJ’utilise surtout Linux, mais je comprends mal pourquoi certains disent que le design de macOS est mauvais
Côté UX, macOS m’a toujours semblé assez soigné
Même parmi les thèmes Gnome populaires, beaucoup imitent le style macOS
J’ai l’impression que c’est encore plus vrai sur HN
Le redimensionnement par les coins de fenêtre est pénible, mais dans l’ensemble j’en suis satisfait
Au final, tous les OS ont des bugs
Les boîtes de dialogue de notification en sont un bon exemple
C’est surtout le manque de personnalisation qui me gêne
Regretter les anciennes interfaces comme Windows 98 relève peut-être aussi d’une question de génération
La façon de passer en plein écran est particulière, mais une fois qu’on s’y habitue, c’est pratique
En revanche, l’absence de tiling des fenêtres est gênante
Malgré ça, je préfère toujours Linux, même si la mise en veille et la gestion de l’alimentation y posent problème depuis 8 ans
Apple avait déjà, à une époque, bloqué les certificats auto-signés sur iOS, ce qui rendait le développement HTTPS local presque impossible
Difficile de comprendre pourquoi ils ont touché à ça
J’aime bien macOS
zsh est fourni par défaut, et je peux faire sur mon ordinateur personnel presque tout ce que je faisais sous Linux
*.localhostfonctionne par défautMême sans dnsmasq, on peut faire pointer plusieurs noms d’hôte vers 127.0.0.1
*.example-privatesont utiles pour distinguer plusieurs appareils via des IP privéesSi c’est juste pour localhost, autant utiliser directement 127.0.0.1
Personnellement, j’utilise plutôt
*.localvia mDNS pour profiter de la configuration automatique basée sur DHCP