... pour compenser les serveurs DNS défaillants qui sont hors de notre contrôle.
Notre problème : nous déployons des appareils embarqués qui collectent des données de capteurs sur divers sites, principalement en IPv4. Certains sites ont des réseaux mal entretenus, par exemple des caches DNS mal configurés ou cassés et/ou des pare-feu qui ignorent complètement les requêtes AAAA, ou y répondent par des réponses erronées (par exemple, mauvaise adresse IP source!). En tant que fournisseur externe au département des installations, nous n'avons presque aucun impact sur les (parfois réticents) départements informatiques. Les chances qu'ils corrigent leurs serveurs DNS/pare-feu dans un avenir proche sont minuscules.
L'effet sur notre appareil est qu'à chaque appel à gethostbyname(), les processus doivent attendre que les requêtes AAAA expirent, à ce moment-là certains processus ont déjà dépassé le délai de leurs tentatives de connexion.
Je recherche des solutions qui sont ...
- à l'échelle du système. Je ne peux pas reconfigurer des dizaines d'applications individuellement
- non permanente et configurable. Nous devons (ré)activer l'IPv6 là où/quand il est réparé/déployé. Un redémarrage est acceptable.
- Si une solution nécessite le remplacement d'une bibliothèque de base comme glibc, le package de bibliothèque de remplacement doit être disponible depuis un référentiel bien entretenu (par exemple, Debian Testing, Ubuntu universe, EPEL). L'autoconstruction n'est pas une option pour de nombreuses raisons que je ne sais même pas par où commencer, donc je ne les énumère même pas...
La solution la plus évidente serait de configurer la bibliothèque de résolution par exemple via /etc/{resolv,nsswitch,gai}.conf pour ne pas interroger les enregistrements AAAA. Une option resolv.conf no-inet6
comme suggéré ici serait exactement ce que je recherche. Malheureusement, elle n'est pas implémentée, du moins pas sur nos systèmes (libc6-2.13-38+deb7u4 sur Debian 7; libc6-2.19-0ubuntu6.3 sur Ubuntu 14.04)
Alors, comment faire alors ? Voici les méthodes suggérées sur SF et ailleurs, mais aucune d'entre elles ne fonctionne :
- Désactiver complètement l'IPv6, par exemple en mettant l'ipv6 LKM sur liste noire dans /etc/modprobe.d/, ou
sysctl -w net.ipv6.conf.all.disable_ipv6=1
. (Par curiosité : Pourquoi le résolveur demande-t-il des AAAA alors que l'IPv6 est désactivé ?) - Supprimer
options inet6
de /etc/resolv.conf. Il n'était pas là en premier lieu,inet6
est simplement activé par défaut de nos jours. - Définir
options single-request
dans /etc/resolv.conf. Cela garantit uniquement que les requêtes A et AAAA sont effectuées séquentiellement plutôt qu'en parallèle - Changer
precedence
dans /etc/gai.conf. Cela n'affecte pas les requêtes DNS, seulement comment les réponses multiples sont traitées. - Utiliser des résolveurs externes (ou exécuter un démon de résolution local qui contourne les serveurs DNS défaillants) serait utile, mais est généralement interdit par les politiques de pare-feu de l'entreprise. Et cela peut rendre les ressources internes inaccessibles.
Idées alternatives moches :
- Exécuter un cache DNS en local. Le configurer pour transférer toutes les requêtes non-AAAA, mais pour répondre aux requêtes AAAA avec NOERROR ou NXDOMAIN (en fonction du résultat de la requête A correspondante). Je ne connais aucun cache DNS capable de faire cela cependant.
- Utiliser une correspondance iptables u32 intelligente, ou le module DNS iptables d'Ondrej Caletka iptables DNS module pour correspondre aux requêtes AAAA, afin de les refuser en ICMP (comment la bibliothèque résolveur réagirait-elle à cela ?), ou pour les rediriger vers un serveur DNS local qui répond à tout par un NOERROR vide.
Remarquez qu'il existe des questions similaires et connexes sur SE. Ma question diffère en ce sens qu'elle développe le problème réel que j'essaie de résoudre, qu'elle énumère des exigences explicites, qu'elle met en liste noire certaines solutions souvent suggérées qui ne fonctionnent pas, et qu'elle n'est pas spécifique à une seule application. Suivant cette discussion, j'ai posté ma question.