Es ist jetzt knappe sieben Jahre her, dass ich die DNS-Server meiner privaten Infrastruktur für DNSSEC bereit gemacht habe. Trotz der etwas höheren Komplexität hat das leidlich funktioniert, ich bin nur bei ca. jeder zweiten Umstellung über die Besonderheiten dieses Setups gestolpert.

Heute hatte ich dann genug und habe das Setup auseinander gerissen: Authoritative DNS macht nach wie vor ein bind9-Setup, aber eben ohne Views. Dadurch, dass der Server nun keine Doppelfunktion mehr hat hat sich die Konfiguration auch auf ca. die Hälfte verringert.

Für rekursive Anfragen lauscht am loopback-Interface sowie auf allen virtuellen Netzwerk-Interfaces jetzt ein Unbound. Die Konfiguration, die ich dabei aus Puppet heraus rendern lasse, ist denkbar einfach:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# managed by Class['unbound']'
server:
  # The following line will configure unbound to perform cryptographic
  # DNSSEC validation using the root trust anchor.
  auto-trust-anchor-file: "<%= @unbound_key_dir -%>/<%= @unbound_key_name -%>"
  # allow snooping from localhost for debugging
  access-control: 127.0.0.0/8 allow_snoop
  access-control: ::1 allow_snoop
  # allow queries from all our client networks
<%- @mynetworks.each do |n| -%>
  access-control: <%= n -%> allow
<%- end -%>
  # listen on loopback
  interface: 127.0.0.1
  interface: ::1
  # listen on additional interfaces (for e.g. virtualization)
<%- @interfaces.each do |i| -%>
  interface: <%= i %>
<%- end -%>
  # enhance privacy
  qname-minimisation: yes

Der Trust-Anchor wird dabei von Puppet bei der Installation einmalig erzeugt (und die Location unterscheidet sich je nach Distribution, deswegen ist sie hier parametrisiert).

Die Variable @mynetworks in Puppet beschreibt dabei die Gesamtheit der von mir verwendeten Subnetze, es macht also Sinn, dass die alle auf den Server zugreifen dürfen (sofern denn Routing und Paketfilter es erlauben). Die Variable @interfaces enthält dabei alle Interfaces, an denen bind9 nicht lauscht.

Wie man sieht verwende ich mal wieder nur eine recht minimale Konfiguration, insbesondere fasse ich weder das Threading noch Memory an - aber ich hab bisher halt auch einfach noch gar keine Performance-Probleme bemerkt, von daher erschien mir das nicht notwendig.

Es mag komisch erscheinen, wenn jemand, der seit über einem halben Jahrzehnt Puppet verwendet, Euch jetzt sagt: “Weniger Konfiguration ist besser”, aber eigentlich ist das genau die Lehre, die ich aus den vergangenen Jahren mitgenommen habe :-)