... um kaputte DNS-Server zu kompensieren, die außerhalb unserer Kontrolle liegen.
Unser Problem: Wir setzen eingebettete Geräte ein, die Sensordaten an verschiedenen, meist nur IPv4-fähigen Standorten erfassen. Einige Sites haben schlecht gewartete Netzwerke, z. B. falsch konfigurierte oder anderweitig defekte DNS-Caches und / oder Firewalls, die AAAA-Abfragen entweder vollständig ignorieren oder mit defekten Antworten antworten (z. B. falsche Quell-IP!). Als externer Zulieferer der Facility-Abteilung haben wir nahezu keinen Einfluss auf die (teilweise widerstrebenden) IT-Abteilungen. Die Wahrscheinlichkeit, dass sie bald ihre DNS-Server / Firewalls reparieren, ist gering.
Der Effekt auf unserem Gerät ist, dass die Prozesse mit jedem gethostbyname () warten müssen, bis die AAAA-Abfragen abgelaufen sind. Zu diesem Zeitpunkt haben einige Prozesse ihre Verbindungsversuche bereits vollständig abgelaufen.
Ich suche nach Lösungen, die ...
- systemweit. Ich kann Dutzende von Anwendungen nicht einzeln konfigurieren
- nicht permanent und konfigurierbar. Wir müssen IPv6 (wieder) aktivieren, wo / wann es repariert / eingeführt wird. Neustart ist OK.
- Wenn eine Lösung das Ersetzen einer Kernbibliothek wie glibc erfordert, sollte das Ersatzbibliothekspaket in einem bekanntermaßen gut gewarteten Repository verfügbar sein (z. B. Debian Testing, Ubuntu-Universum, EPEL). Selfbuilding ist aus so vielen Gründen keine Option, dass ich gar nicht weiß, wo ich anfangen soll, also liste ich sie überhaupt nicht auf ...
Die naheliegendste Lösung wäre, die Resolver-Bibliothek zB über / etc / { resolv , nsswitch , gai } .conf so zu konfigurieren, dass AAAA-Datensätze nicht abgefragt werden. Eine resolv.conf-Option, no-inet6
wie hier vorgeschlagen , wäre genau das , wonach ich suche. Leider ist es nicht implementiert, zumindest nicht auf unseren Systemen (libc6-2.13-38 + deb7u4 unter Debian 7; libc6-2.19-0ubuntu6.3 unter Ubuntu 14.04)
Wie also? Man findet die folgenden Methoden vorgeschlagen auf SF und anderswo, aber nicht von ihnen funktionieren:
- Vollständiges Deaktivieren von IPv6, z. B. durch Sperren des IPv6-LKM in /etc/modprobe.d/ oder
sysctl -w net.ipv6.conf.all.disable_ipv6=1
. ( Aus Neugier: Warum fragt der Resolver nach AAAA, wenn IPv6 deaktiviert ist? ) - Entfernen
options inet6
aus /etc/resolv.conf. Es war gar nicht da,inet6
ist heutzutage einfach standardmäßig aktiviert. - Einstellung
options single-request
in /etc/resolv.conf. Dies stellt nur sicher, dass die A- und AAAA-Abfragen nacheinander und nicht parallel ausgeführt werden - Änderung
precedence
in /etc/gai.conf. Dies betrifft nicht die DNS-Abfragen, sondern nur die Art und Weise, wie mehrere Antworten verarbeitet werden. - Die Verwendung externer Resolver (oder die Ausführung eines lokalen Resolver-Daemons, der die defekten DNS-Server umgeht) würde helfen, wird jedoch in der Regel von den Firewall-Richtlinien des Unternehmens nicht zugelassen. Und es kann interne Ressourcen unzugänglich machen.
Alternative hässliche Ideen:
- Führen Sie auf localhost einen DNS-Cache aus. Konfigurieren Sie es, um alle Nicht-AAAA-Abfragen weiterzuleiten, aber um auf AAAA-Abfragen mit NOERROR oder NXDOMAIN zu antworten (abhängig vom Ergebnis der entsprechenden A-Abfrage). Mir ist jedoch kein DNS-Cache bekannt, der dies ermöglicht.
- Verwenden Sie einige clevere iptables u32-Übereinstimmungen oder das iptables-DNS-Modul von Ondrej Caletka , um AAAA-Abfragen abzugleichen, um sie entweder per ICMP abzulehnen (wie würde die Resolver-Bibliothek darauf reagieren?) Oder um sie an einen lokalen DNS-Server weiterzuleiten, der darauf antwortet alles mit einem leeren NOERROR.
Beachten Sie, dass es ähnliche, verwandte Fragen zu SE gibt. Meine Frage unterscheidet sich insofern, als sie das eigentliche Problem beschreibt, das ich zu lösen versuche, da sie explizite Anforderungen auflistet, einige häufig vorgeschlagene nicht funktionierende Lösungen auflistet und nicht spezifisch für eine einzelne Anwendung ist. Nach dieser Diskussion habe ich meine Frage gepostet.