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.