Ich betreibe Ubuntu 14.04-Instanzen auf AWS EC2 in einer VPC. Diese verwenden den von unserer VPC bereitgestellten Nameserver. Jeder DNS-Lookup eines Prozesses wird an den VPC-Nameserver gesendet. Unsere Prozesse führen viele Lookups durch und einige schlagen fehl, was zu blockierten Prozessen führt.
Ich möchte dies beheben, indem ich auf jedem Rechner einen lokalen DNS-Resolver mit Cache installiere. Dieser Resolver hört auf und 127.0.0.1:53
bedient lokale Prozesse. Der Resolver wird in aufgelistet /etc/resolv.conf
, d. h. ich verwende nameserver 127.0.0.1
stattdessen den dynamisch über DHCP bereitgestellten VPC-Nameserver.
Es gibt viele alternative Programme hierfür: bind9
, nscd
, dnsmasq
, dnscache
, usw. Es scheint aber auch viele Möglichkeiten zu geben, manuell zu verwalten /etc/resolv.conf
, z. B. die Datei als schreibgeschützt zu markieren oder zu bearbeiten /etc/network/interfaces
oder zu bearbeiten /etc/dhcp/dhclient.conf
. Was ist zu empfehlen?
Ich habe noch eine weitere Anforderung: Der lokale Resolver leitet Suchvorgänge an den VPC-Nameserver weiter, unsere vertrauenswürdige Autorität für DNS-Informationen. Die von mir aufgelisteten Programme scheinen sich jedoch nicht so zu verhalten. Stattdessen leiten sie ihre Suchvorgänge an vorkonfigurierte Root-Nameserver weiter.
Theoretisch könnte ich das zum Laufen bringen dhclient-script
, indem resolvconf
ich , oder etwas in der Art anpasse. Ich würde einen Hook hinzufügen, der die von DHCP bereitgestellte Nameserver-IP nimmt, sie in die Konfiguration meines lokalen DNS-Resolvers einfügt und dann den lokalen DNS-Resolver-Daemon neu startet. Aber das ist ziemlich haarig und ich möchte das vermeiden. (Die Standardskripte in Ubuntu 14.04 scheinen ein gewisses eingebautes Wissen über nscd
und zu haben dnscache
und tun möglicherweise, was ich will, aber das ist sehr unklar.)
Welches ist die „gesegnete“ Art, einen lokalen DNS-Resolver mit Cache unter Ubuntu 14.04 auszuführen? Insbesondere, wie bringe ich den lokalen Resolver dazu, an den Standard-DHCP-Nameserver weiterzuleiten?
Antwort1
Der einfachste Weg ist wahrscheinlich nscd.
Installieren Sie nscd unter Verwendung der Standardkonfiguration.
Aktualisieren Sie /etc/nsswitch.conf und fügen Sie cache
„before“ dns
zur Hosts-Zeile hinzu.(Bearbeiten: Dieser Teil ist nicht auf glibc anwendbar, wie es in den meisten Linux-Distributionen verwendet wird, wird aber auf fbsd benötigt.)
hosts: files cache dns
Prüfen
tcpdump -v -n 'port 53'
getent hosts superuser.com
Sie müssen /etc/resolve.conf nicht verstümmeln oder den DHCP-Resolver erfassen, um den Upstream von nscd zu aktualisieren. nsswitch leitet gethost*-Aufrufe korrekt über den Cache-Server weiter, da dieser Teil von glibc ist.