PowerDNS Split Horizon Resolver

PowerDNS Split Horizon Resolver

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 dqObjekt 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)

verwandte Informationen