... pour compenser les serveurs DNS cassés qui sont hors de notre contrôle.
Notre problème: nous déployons des périphériques intégrés qui collectent les données de capteurs sur divers sites, principalement IPv4. Certains sites ont des réseaux mal entretenus, par exemple des caches DNS et / ou des pare-feu mal configurés ou autrement cassés qui ignorent complètement les requêtes AAAA ou leur répondent avec des réponses cassées (par exemple, une adresse IP source incorrecte!). En tant que fournisseur externe du département des installations, nous n’avons pratiquement aucune influence sur les départements informatiques (parfois réticents). Les chances qu’ils réparent leurs serveurs / pare-feu DNS dans un proche avenir sont infimes.
L'effet sur notre périphérique est que, avec chaque gethostbyname (), les processus doivent attendre que les requêtes AAAA expirent, moment auquel certains processus ont déjà dépassé leur délai de tentative de connexion.
Je cherche des solutions qui sont ...
- à l'échelle du système. Je ne peux pas reconfigurer des dizaines d'applications individuellement
- non permanent et configurable. Nous devons (réactiver) IPv6 où / quand il est corrigé / déployé. Le redémarrage est OK.
- Si une solution nécessite le remplacement d’une bibliothèque principale telle que glibc, le package de bibliothèque de remplacement doit être disponible à partir d’un référentiel dont la maintenance est assurée (par exemple, Debian Testing, univers Ubuntu, EPEL). L'auto-construction n'est pas une option pour tant de raisons que je ne sais même pas par où commencer, alors je ne les énumère pas du tout ...
La solution la plus évidente serait de configurer la bibliothèque de résolveur, par exemple via / etc / { resolv , nsswitch , gai } .conf pour ne pas interroger les enregistrements AAAA. Une option de resolv.conf no-inet6
telle que suggérée ici serait exactement ce que je recherche. Malheureusement, il n'est pas implémenté, 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 alors? On trouve les méthodes suivantes suggérées sur SF et ailleurs, mais aucune d'entre elles ne fonctionne:
- Désactiver complètement IPv6, par exemple en mettant en liste noire le LKM ipv6 dans /etc/modprobe.d/, ou
sysctl -w net.ipv6.conf.all.disable_ipv6=1
. ( Par curiosité: pourquoi le résolveur demande-t-il un AAAA lorsque IPv6 est désactivé? ) - Suppression
options inet6
de /etc/resolv.conf. Ce n'était pas là en premier lieu,inet6
est simplement activé par défaut ces jours-ci. - Configuration
options single-request
dans /etc/resolv.conf. Cela garantit uniquement que les requêtes A et AAAA sont effectuées de manière séquentielle plutôt qu'en parallèle - Changer
precedence
dans /etc/gai.conf. Cela n'affecte pas les requêtes DNS, mais seulement le traitement de plusieurs réponses. - L'utilisation de résolveurs externes (ou l'exécution d'un démon de résolveur local qui contourne les serveurs DNS cassés) serait utile, mais est généralement interdite par les stratégies de pare-feu de l'entreprise. Et cela peut rendre les ressources internes inaccessibles.
Idées alternatives laides:
- Exécuter un cache DNS sur localhost. Configurez-le pour transférer toutes les requêtes non-AAAA, mais pour répondre aux requêtes AAAA avec NOERROR ou NXDOMAIN (selon le résultat de la requête A correspondante). Je ne suis pas au courant d'un cache DNS capable de le faire cependant.
- Utilisez une correspondance intelligente iptables u32 ou le module DNS iptables d’ Ondrej Caletka pour faire correspondre les requêtes AAAA, afin de les rejeter par icmp (comment le résolver lib réagirait-il?) Ou de les rediriger vers un serveur DNS local qui répond tout avec un NOERROR vide.
Notez qu'il existe des questions similaires sur SE. Ma question diffère dans la mesure où elle élabore le problème que je tente de résoudre, car elle énonce des exigences explicites, une liste noire de solutions non fonctionnelles souvent proposées, et comme elle n'est pas spécifique à une seule application. Suite à cette discussion , j'ai posté ma question.