DNS64 mit PowerDNS

Ja, DNS64 ist böse, weil es DNSSEC kaputtmacht. Dennoch ist NAT64 eine halbwegs brauchbare Brückenlösung, wenn man ein IPv6-only Netzwerk betreiben will. Manche Geräte können ja 464XLAT und alles wird wieder gut. ™

BIND9 bringt zwar eine eingebaute DNS64 mit, allerdings musste ich mit dem Holzhammer so hart draufhauen, damit auch A-Einträge verschwinden, weil node.js den getaddrinfo-connect-Tanz nicht richtig implementiert.

Die Herausforderung:

  • A-Einträge entfernen.
  • AAAA-Einträge synthetisch herstellen.

Die Lösung:

PowerDNS Recursor mit Lua-Engine.

Als erstes erstellt man ein Lua-Script namens /etc/pdns-recursor/dns64.lua, was bestimmte Schnittstellen bereitstellt. Die Vorlage dazu habe ich aus der offiziellen PowerDNS-Anleitung entnommen.

prefix = "64:ff9b::"

function nodata ( dq )
  if dq.qtype ~= pdns.AAAA then
    return false
  end  --  only AAAA records

  -- don't fake AAAA records if DNSSEC validation failed
  if dq.validationState == pdns.validationstates.Bogus then
     return false
  end

  dq.followupFunction = "getFakeAAAARecords"
  dq.followupPrefix = prefix
  dq.followupName = dq.qname
  return true
end

-- the ip6.arpa address is the reverse of the prefix address above
function preresolve ( dq )
  if dq.qtype == pdns.PTR and dq.qname:isPartOf(newDN("0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.")) then
    dq.followupFunction = "getFakePTRRecords"
    dq.followupPrefix = prefix
    dq.followupName = dq.qname
    return true
  end
  return false
end

-- remove A records
function postresolve ( dq )
  local records = dq:getRecords()
  local newRecords = {}

  for k,v in pairs(records) do
    if v.type ~= pdns.A then
      newRecords[k] = v
    end
  end

  dq:setRecords(newRecords)

  return true
end

Der postresolve-Hook ist im Wesentlichen meine geringe Wertschöpfung. Es entfernt alle A-Einträge, da sie durch AAAA-Einträge ersetzt worden sind.

Der nächste Schritt ist die Einbindung im PowerDNS Recursor:

lua-dns-script=/etc/pdns-recursor/dns64.lua

Warum ich diesen Aufwand betrieben habe, werde ich irgendwann später mal im Detail erklären.