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.