Konfigurieren Sie BIND mit Datenbank-Backend und DLZ-Unterstützung


7

Beschlossen, meine Windows-basierten DNS-Server auf Linux zu verschieben. Das Problem ist, dass ich in der Lage sein muss, Zonendateien dynamisch zu aktualisieren, ohne die Bindung neu starten zu müssen. Es scheint, dass die beliebteste Lösung darin besteht, Bindetreiber für einen Datenbankserver (postgresql, sqlite, mysql) zu installieren und dann die Zonendatei zu aktualisieren. Scheint einfach genug, aber ich kann es nicht dazu bringen, für mein Leben zu arbeiten.

Ich verwende derzeit die Amazon Linux-Distribution, habe aber auch alles in RHEL 6.2 ausprobiert, ohne mehr Glück.

Ich habe ein paar verschiedene Methoden ausprobiert. Die erste bestand darin, die Bindung mit den Quellcodeänderungen für die MySQL-Unterstützung zu kompilieren . Http://pbraun.nethence.com/doc/net/bind-mysql.html . Dies lässt sich gut mit den Änderungen kompilieren und ich erhalte keine Fehler, aber nach dem Ausführen werden make installalle Binärdateien nach / usr / local / sbin kopiert, aber ich kann den von mir ausgeführten Daemon-Prozess scheinbar nicht starten service named startund es wird mir nur mitgeteilt, dass es keinen Dienst mit dem Namen "(" gibt. kein Wortspiel beabsichtigt ). Zweitens wird keine der Konfigurationsdateien generiert. Also habe ich eine Datei mit dem Namen.conf erstellt und in /etc/named.conf abgelegt. Dann wurde sie ausgeführt /usr/local/sbin/named-checkconfund es wurde mir mitgeteilt, dass die Datei /etc/named.conf nicht gefunden werden konnte, sodass ich keine Ahnung habe.

Als nächstes habe ich versucht, das Paket bind-sdb zu installieren und postgresql zu verwenden. Installierte Pakete Befolgen Sie yum -qy bind bind-sdb bind-utils postgresql postgresql-server die Schritte auf http://bind-dlz.sourceforge.net/postgresql_example.html. Ich habe eine neue Postgre-Datenbank und -Tabelle usw. erstellt. Nachfolgend finden Sie meine aktuelle namens.conf

//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
    listen-on port 53 { 127.0.0.1; };
    listen-on-v6 port 53 { ::1; };
    directory       "/var/named";
    dump-file       "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    allow-query     { localhost; };
    recursion yes;

    dnssec-enable yes;
    dnssec-validation yes;
    dnssec-lookaside auto;

    /* Path to ISC DLV key */
    bindkeys-file "/etc/named.iscdlv.key";
};

logging {
    channel default_debug {
            file "data/named.run";
            severity dynamic;
    };
};

zone "." IN {
    type hint;
    file "named.ca";
};

dlz "my.zone" {
   database "postgres 1
   {host=localhost port=5432 dbname=bind user=postgre password=****}
   {select zone from dns_records where zone = '%zone%'}
   {select ttl, type, mx_priority, case when lower(type)='txt' then '\"'
         || data || '\"' when lower(type)='soa' then data || ' ' || resp_person || ' '
         || serial || ' ' || refresh || ' ' || retry || ' ' || expire || ' ' || minimum
         else data end from dns_records where zone = '%zone%' and host = '%record%'}";
};

include "/etc/named.rfc1912.zones";

Ausgabe aus meiner Datenbanktabelle

    Zone | Host | ttl | Typ | mx_priority | Daten | resp_person | seriell | aktualisieren | verfallen | Minimum
------------ + ------------- + -------- + ------ + ------- ------ + ------------------------ + ------------------ ---- + -------- + --------- + -------- + ---------
 my.cloud | meine Wolke. | 259200 | SOA | 0 | dns01.my.cloud. | it.cloud.com. | 1 | 28800 | 86400 | 28800
 my.cloud | meine Wolke. | 259200 | NS | 0 | dns01.my.cloud. | | 0 | 0 | 0 | 0
 my.cloud | dns01 | 259200 | A | 0 | 127.0.0.1 | | 0 | 0 | 0 | 0
(3 Reihen)

Offen für alle Lösungen, wenn mich jemand in die richtige Richtung weisen könnte. Ich würde es vorziehen, MySQL als Datenbank zu verwenden, da ich keine Erfahrung mit Postgresql oder SQLite habe.


Ich bemerkte, dass in der Datenbanktabelle die Spalte RETRY fehlte, also fügte ich das hinzu, aber immer noch das gleiche Ergebnis. Ich versuche den Dienst zu starten und er schlägt ohne Fehler fehl.
Bwight

Antworten:


10

Vielleicht nicht wirklich eine Antwort auf Ihre Frage, aber trotzdem. (Ich habe dieses Problem kürzlich ebenfalls untersucht, und hier sind meine Schlussfolgerungen):

Die DLZ-Unterstützung in BIND9 ähnelt eher einem "Patch". Es ist nicht gut dokumentiert - kein einziges Wort darüber in BIND ARM. Es scheint nicht weit verbreitet zu sein. Die Abfrageleistung ist schrecklich - laut diesem Benchmark wird PostgreSQL 30-mal (!) Langsamer sein als der normale In-Memory-Betrieb. (Der Benchmark ist alt, aber es gibt keinen Grund anzunehmen, dass sich die Dinge drastisch verbessert haben).

Ich denke nicht, dass es eine "beliebteste Lösung" ist.

Andere Optionen:

BIND9 unterstützt dynamische Updates. Es ist gut dokumentiert, weit verbreitet und einfach zu implementieren. Keine Leistungseinbußen - alle Anfragen werden noch aus dem Speicher beantwortet . Die Einrichtung ist einfacher, da keine Datenbank erforderlich ist. Sie führen Aktualisierungen programmgesteuert mithilfe von DNS-Protokollbibliotheken (die wahrscheinlich für die meisten Sprachen vorhanden sind, ich selbst verwende PHP) oder über das Befehlszeilentool durch nsupdate. Dies ist die Lösung, die ich empfehlen würde.

Wenn Sie wirklich eine Datenbank möchten - PowerDNS scheint für die Verwendung mit dem Datenbank-Backend ausgelegt zu sein. Es verfügt über Funktionen, die dazu beitragen können, die Leistung bei der Verwendung von Datenbanken nicht vollständig zu beeinträchtigen, z. B. können Datenbankabfragen für einige Zeit zwischengespeichert werden, anstatt jedes Mal die Datenbank abzufragen. Einige anständige DNS-Hostings verwenden PowerDNS.

Exotischere Option - BIND10 ist zwar noch in Arbeit, aber Entwickler behaupten, dass die Leute es tatsächlich in der Produktion verwenden. Derzeit verwendet BIND10 das SQLITE-Backend.


Ich werde einige dieser Optionen untersuchen. Wirklich Leistung ist kein großes Problem für mein Szenario. Ich habe 2 Zonen mit vielleicht 20 Hosts, wenn das so ist. Ich benötige eine Datenbank oder eine gute API zum Hinzufügen / Entfernen von Datensätzen, da die Umgebung dynamisch ist und jeder Server für die Aktualisierung des DNS-Servers beim Erstellen verantwortlich ist. Ich hatte eine andere Lösung, die die Textdateien bearbeitet, aber das wird nur chaotisch. Ich würde es vorziehen, sie in einer Datenbank zu speichern oder einen API-Befehl zu haben, den ich remote ausführen kann.
Bwight

Können Sie mich mit der Stelle verknüpfen, an der Sie die PHP-API gefunden haben, um diese Updates programmgesteuert durchzuführen? Das könnte das Problem für mich lösen, da ich vorhabe, einen PHP-Webservice zu haben, der für die Aktualisierung der DNS verantwortlich ist. Der ursprüngliche Plan war, die Datenbank zu aktualisieren, aber wenn ich die Bindung direkt mit einer API aktualisieren kann, funktioniert das auch.
Bwight

Es ist auf PEAR. NET_DNS und NET_DNS2. Ich benutze 2.
Sandman4

1
Ich denke, all diese Lösungen würden funktionieren, aber ich konnte powerDNS gestern ohne Probleme mit einer MySQL-Datenbank zum Laufen bringen. Danke für Ihre Hilfe.
Bwight

BIND10 wurde übrigens von ISC aufgegeben.
Thomas Ward

5

Um der Vollständigkeit halber die ursprüngliche Anforderung zu erfüllen ("Zonendateien dynamisch aktualisieren, ohne die Bindung neu starten zu müssen"): Bearbeiten Sie die Zonendateien, und senden Sie SIGHUP an named. Der Dämon liest die Zonendateien erneut.


2

Es ist etwas spät, aber ich habe hier ein Tutorial gemacht .

Die DLZ-Unterstützung ist vollständig in bind9 integriert. Sie müssen sie nur beim Ausführen aktivieren ./configure.
Es ist nicht schwierig, in der Tat ist es ziemlich einfach, aber es ist sehr schlecht dokumentiert.
Mein Tutorial ändert das.
Jetzt sollten Sie nicht länger als 30 Minuten (einschließlich Kompilierungszeit) brauchen, um es in Betrieb zu nehmen.

Leider kann ich das Tutorial hier nicht kopieren, es ist zu groß.


1

Sie können das bind-sdb-Modul verwenden, aber leider unterstützt es nur ldap und pgsql

# yum install -y bind bind-sdb

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.