Ich habe im Internet nach einer Lösung gesucht und zahlreiche Threads mit unterschiedlichen Vorschlägen gefunden. Die meisten davon, die ich gefunden habe, verwenden LUA auf dem Resolver, um Datensätze zurückzugeben. Andere Beiträge schlagen vor, GEO-IP- oder Pipe-Backends zu verwenden. Alle Inhalte, die ich gelesen habe, verwenden
Ich bin gespannt, ob es möglich ist, über LUA den Forwarder basierend auf dem Netzwerkbereich zu ändern, anstatt LUA zum Speichern von Zoneninformationen zu verwenden.
Wenn ich eine Logik wie die folgende zum Laufen bekomme, sollte alles gut gehen:
if sourceip comes from (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) {
forwarder = 192.168.0.1;
}else{
forwarder = 8.8.8.8;
}
Ich sehe keine LUA-Beispiele von PDNS, die das Ändern von Einstellungen innerhalb von PDNS selbst demonstrieren, und bin gespannt, ob das überhaupt möglich ist.
Antwort1
Weder PowerDNS Server noch Recursor unterstützen die Split-Horizon-Setups auf die gleiche Weise wie BIND.
Sie können dies umgehen, indem Sie beispielsweise Lua-Code in Ihrem Rekursor ausführen, der direkt die Antworten liefert, die Sie beispielsweise für ein bestimmtes Subnetz bereitstellen möchten. Wie Sie jedoch bereits herausgefunden haben, können Sie nicht manipulieren, wohin Abfragen von Lua weitergeleitet werden.
Eine relativ neue Ergänzung der PowerDNS-Codefamilie ist ein DNS-Loadbalancer, der in Lua programmierbar ist und es Ihnen ermöglicht, Anfragen an verschiedene Nameserver zu senden, basierend auf praktisch allem, was das DNS-Protokoll zulässt. Siehehttp://dnsdist.org/Undhttps://github.com/PowerDNS/pdns/blob/master/pdns/README-dnsdist.md. Das Split Horizon-Beispiel dort teilt rekursive und nicht rekursive Abfragen auf, aber Sie können es genauso gut abhängig von der Quelladresse aufteilen, zum Beispiel über die Funktion addPoolRule(netmask, pool).
Übrigens mögen es die Lua-Leute nicht, wenn man alles in Großbuchstaben schreibt. Siehehttp://www.lua.org/about.html"Was ist in einem Namen" ;-)
Antwort2
Diese Antwort unterstützt den Vorschlag von @ZaphodB,DNS-Verteilung. Hier ist eine Beispieldatei dnsdist.conf
, die ein Split Horizon-Setup durchführt und den Datenverkehr je nach Ziel-FQDN entweder an die DNS-Server von Google oder an DNS-Server in Ihrem lokalen Netzwerk weiterleitet. Das dq
Objekt ist einDNS-Frage; Ihre Lua-Funktion kann jede Eigenschaft dieses Objekts testen.
-- bind to port 53 (default) on local machine.
-- setLocal clears existing, addLocal appends to existing
setLocal("127.0.0.1")
addLocal("10.22.222.222")
-- set up dns server pools
newServer({address="8.8.8.8",name="google8888",pool="google"})
newServer({address="8.8.4.4",name="google8844",pool="google"})
newServer({address="10.22.222.1",name="localdns1",pool="local"})
newServer({address="10.22.222.2",name="localdns2",pool="local"})
-- define split horizon policy
function splitHorizon(servers, dq)
if (string.find(dq.qname:toString(),'example.com.?$')) then
print("local address")
return leastOutstanding.policy(getPoolServers("local"), dq)
else
print("other address")
return leastOutstanding.policy(getPoolServers("google"), dq)
end
end
-- apply split horizon policy
setServerPolicyLua("splitHorizon", splitHorizon)