Frage Überschreiben einiger DNS-Einträge in BIND für interne Netzwerke


Ich habe ein internes Netzwerk mit einem DNS-Server, auf dem BIND läuft und über ein einziges Gateway mit dem Internet verbunden ist. Meine Domain "example.com" wird von einem externen DNS-Provider verwaltet. Einige Einträge in dieser Domäne, z. B. "host1.example.com" und "host2.example.com", sowie der Eintrag "example.com" auf oberster Ebene verweisen auf die öffentliche IP-Adresse des Gateways.

Ich möchte, dass Hosts, die sich im internen Netzwerk befinden, "host1.example.com", "host2.example.com" und "example.com" auf interne IP-Adressen anstatt auf die des Gateways auflösen. Andere Hosts wie "otherhost.example.com" sollten weiterhin vom externen DNS-Provider aufgelöst werden.

Das ist mir für die Einträge von host1 und host2 gelungen, indem ich in BIND zwei einzeilige Zonen für "host1.example.com" und "host2.example.com" definiert habe. Wenn ich jedoch eine Zone für "example.com" hinzufüge, werden alle Abfragen für diese Domäne von meinem lokalen DNS-Server aufgelöst und z. Das Abfragen von "otherhost.example.com" führt zu einem Fehler.

Ist es möglich, BIND so zu konfigurieren, dass nur überschrieben wird? etwas Einträge einer Domain, und um den Rest rekursiv aufzulösen?


33
2018-06-03 13:57


Ursprung


Ähnliche Frage: serverfault.com/questions/8694/ ... - MikeyB
"Ist es möglich, BIND so zu konfigurieren, dass nur einige Einträge einer Domain überschrieben werden?" Nein, nicht mit BIND. Verwenden Sie eine Sub-Domain. - bortzmeyer
Unbound scheint genau das zu tun, wonach ich gefragt habe, also setze ich Alnitaks Antwort als akzeptierte Antwort. Aber am Ende werde ich bortzmeyers Rat befolgen und nicht überschreiben Sie den Domain-Eintrag. Danke für alle Antworten! - Remy Blank
Bind kann das jetzt mit der Zone der Antwortrichtlinie tun. Siehe meine Antwort unten. Andere Lösungen wie Ungebunden können CNAMEs nicht überschreiben. Mit den Richtlinienbereichen in Bind müssen Sie keine Subdomains erstellen. Sie können einzelne Datensätze einfach überschreiben. - Florin Andrei


Antworten:


Die beste Methode ist über die Antwortrichtlinie in Bind 9.8.1 oder neuer. Sie können einzelne Datensätze in beliebigen Zonen überschreiben (Sie müssen dafür nicht nur eine ganze Subdomäne erstellen, sondern nur den einzelnen Datensatz). Sie können CNAMEs usw. überschreiben. Andere Lösungen wie Unbound können CNAMEs nicht überschreiben .

https://www.redpill-linpro.com/sysadvent/2015/12/08/dns-rpz.html


BEARBEITEN: Lass uns das dann richtig machen. Ich werde dokumentieren, was ich getan habe, basierend auf dem oben verlinkten Tutorial.

Mein Betriebssystem ist Raspbian 4.4 für Raspberry Pi, aber die Technik sollte ohne Änderungen auf Debian und Ubuntu oder mit minimalen Änderungen auf anderen Plattformen funktionieren.

Gehe dorthin, wo deine Bind-Konfigurationsdateien auf deinem System gespeichert sind - hier ist es drin /etc/bind. Erstellen Sie dort eine Datei namens db.rpz mit folgendem Inhalt:

$TTL 60
@            IN    SOA  localhost. root.localhost.  (
                          2015112501   ; serial
                          1h           ; refresh
                          30m          ; retry
                          1w           ; expiry
                          30m)         ; minimum
                   IN     NS    localhost.

localhost       A   127.0.0.1

www.some-website.com    A        127.0.0.1

www.other-website.com   CNAME    fake-hostname.com.

Was tut es?

  • Es überschreibt die IP-Adresse für www.some-website.com mit der falschen Adresse 127.0.0.1Dadurch wird der gesamte Datenverkehr für diese Site effektiv an die Loopback-Adresse gesendet
  • es sendet Verkehr für www.other-website.com zu einer anderen Website namens fake-hostname.com

Alles, was in eine Bind-Zonendatei passt, können Sie hier verwenden.

Um diese Änderungen zu aktivieren, gibt es noch einige weitere Schritte:

Bearbeiten named.conf.local und fügen Sie diesen Abschnitt hinzu:

zone "rpz" {
  type master;
  file "/etc/bind/db.rpz";
};

Das oben verlinkte Tutorial sagt dir, dass du mehr Sachen hinzufügen musst zone "rpz" { } aber das ist in einfachen Setups nicht notwendig - was ich hier gezeigt habe, ist das Minimum, damit es auf Ihrem lokalen Resolver funktioniert.

Bearbeiten named.conf.options und irgendwo in der options { } Abschnitt hinzufügen die response-policy Möglichkeit:

options {
  // bunch
  // of
  // stuff
  // please
  // ignore

  response-policy { zone "rpz"; };
}

Jetzt Bind neu starten:

service bind9 restart

Das ist es. Der Nameserver sollte jetzt beginnen, diese Datensätze zu überschreiben.

Wenn Sie Änderungen vornehmen müssen, bearbeiten Sie sie einfach db.rpz, dann Bind erneut starten.

Bonus: Wenn Sie DNS-Anfragen an Syslog protokollieren wollen, so können Sie die Vorgänge verfolgen, bearbeiten named.conf.localund stellen Sie sicher, dass es ein logging Abschnitt, der diese Anweisungen enthält:

logging {
    // stuff
    // already
    // there

    channel my_syslog {
        syslog daemon;
        severity info;
    };
    category queries { my_syslog; };
};

Starten Sie Bind erneut und das war's.

Testen Sie es auf der Maschine, die Bind ausführt:

dig @127.0.0.1 www.other-website.com. any

Wenn Sie dig auf einem anderen Computer ausführen, verwenden Sie einfach @ the-ip-address-of-Bind-Server anstelle von @ 127.0.0.1

Ich habe diese Technik mit großem Erfolg eingesetzt, um den CNAME für eine Website, an der ich gerade arbeitete, außer Kraft zu setzen und sie an einen neuen AWS-Lastenausgleicher zu senden, den ich gerade getestet habe. Ein Raspberry Pi wurde zum Ausführen von Bind verwendet, und der RPi wurde auch als WLAN-Router konfiguriert. Wenn Sie also Geräte mit der SSID verbinden, die auf dem RPi läuft, würde ich die DNS-Überschreibungen erhalten, die ich zum Testen benötigte.


10
2018-04-04 01:01



Bitte beachten Sie, dass BIND RPZ (noch) keine Datensätze für QTYPE (noch) überschreiben kann - es wird überschrieben alles der Datensätze für einen bestimmten Besitzernamen. Das bedeutet, wenn Sie den A-Eintrag für eine Domäne überschreiben möchten, jedoch nicht für z. die MX-Aufzeichnung, können Sie nicht. Sie müssen den MX-Eintrag ebenfalls in die RPZ-Zone einfügen und ihn mit der realen Zone synchronisieren. - Alnitak
Danke, dass du das gebrochen hast, wie du es getan hast. Sehr hilfreich. - sruffell
Gibt es irgendwelche Vorbehalte? Ich versuche, dies auf einem pfsense zu tun, aber ich kann keine Ergebnisse "fälschen", es meldet immer noch die reale Adresse. Ich glaube, ich habe die Anweisungen genauestens befolgt. - Lenne
@Lenne Es sollte einfach funktionieren. Ich habe den Beitrag bearbeitet und einen Vorschlag zum Testen der Änderungen hinzugefügt. - Florin Andrei


Das Nicht gebunden Der rekursive DNS-Server kann einzelne Ressourceneinträge überschreiben.

Schaue auf die local-zone und local-data Konfigurationseinstellungen in der Handbuch, z.B.:

local-zone: "example.com." transparent
local-data: "foo.example.com. IN A 192.168.1.1"

Das transparent Einstellung auf dem local-zone fordert sie auf, für alle Namen, die nicht mitgeliefert werden, normale rekursive Suchvorgänge durchzuführen local-data.


20
2018-06-03 15:31



Scheint genau das zu sein, was ich machen möchte, danke. Ich werde heute Abend Unbound nachlesen. - Remy Blank
Auf der anderen Seite ist die Weisheit davon sehr fraglich. Eine Domäne von internal.example.com wäre klarer. - bortzmeyer
@Bortzmeyer - du könntest recht haben, aber ich kann mir nicht vorstellen, dass Wouter es nur zum Spaß gemacht hat ;-) - Alnitak
@bortzmeyer, manchmal gibt es keine Wahl. Beispiel: SBS 2008 muss eine einzelne LAN-IP haben, muss jedoch von außen über eine externe IP-Adresse erreicht werden, die der Router weiterleitet. Microsoft lässt zwei Netzwerkkarten auf SBS nicht zu, noch zwei IPs, die auf derselben Karte konfiguriert werden. Wenn lokale Server den DNS-Namen auf die externe IP auflösen, muss der Router sowohl DNAT als auch SNAT für LAN-IPs ausführen, und dann zeigen die Protokolle auf der SBS, dass alle Zugriffe von der IP des Routers stammen, und das ist einfach falsch. Ich werde installieren unbound auf meinem eigenen Router finde ich die Lösung viel besser. - Cosmin Prund
Dies beantwortet die Frage nicht, da die Frage BIND spezifisch ist. - bzeaman


Vielleicht möchten Sie in "dnsmasq" schauen, was Ihnen einige ziemlich clevere Dinge mit optimaler Auflösung ermöglicht.


4
2018-06-03 14:00



Danke, guter Tipp. Schade, dass dnsmasq keine rekursive Auflösung durchführt, also muss ich BIND trotzdem auf einem anderen Port ausführen (die DNS-Server meines ISP sind flakey). - Remy Blank


Was Sie suchen, ist Split-DNS, die definiert ist durch Webopedia wie:

In einer geteilten DNS-Infrastruktur können Sie   Erstellen Sie zwei Zonen für die gleiche Domain,   eine, die vom internen benutzt wird   Netzwerk, das andere von der   externes Netzwerk DNS-Direkte teilen   interne Hosts zu einer internen Domäne   Nameserver zur Namensauflösung und   externe Hosts werden an ein gerichtet   externer Domain Name Server für Name   Auflösung.

Im Wesentlichen müssen Sie eine Kopie Ihrer externen Zonendatei erstellen und diese auf Ihrem internen DNS-Server bereitstellen und dann die für Ihr internes Netzwerk erforderlichen Datensätze ändern oder hinzufügen. Dies ist ein ziemlich übliches Setup, obwohl es sehr mühsam sein kann, die "externen" Datensätze zwischen den beiden DNS-Servern synchron zu halten. Wenn Sie einen Datensatz auf dem öffentlichen Server erstellen oder ändern, muss er auch auf dem privaten Server erstellt oder geändert werden.

Dies kann unabhängig von der verwendeten DNS-Serverimplementierung implementiert werden. In den meisten Konfigurationen haben Sie einen DNS-Server, der das externe Netzwerk bedient, und einen anderen, der das interne Netzwerk versorgt. Mit BIND können Sie, wie möglicherweise andere Implementierungen, beide Versionen der Zone auf demselben Server verwenden, indem Sie die Anweisung "allow-query" innerhalb des Bereichs zone der Datei named.conf verwenden.

Eine andere Möglichkeit auf BIND (und ich habe es noch nie versucht) wäre, Ihre example.com-Domain auf dem internen DNS-Server nur mit den Datensätzen zu setzen, die Sie intern verwenden. Setzen Sie dann eine "forward" -Anweisung mit dem "first" -Argument (in Verbindung mit "forwarders"). Theoretisch würde dies den externen DNS-Server fragen (wie in "Forwarders" für eine Antwort festgelegt, die Ihre internen Datensätze nicht haben und eine Fehlerantwort zurückgeben würde. Dann würde der interne Server sich selbst nach einer Antwort suchen. Nicht Sicher, ob das funktionieren würde, aber es ist ein Gedanke.


2
2018-06-03 14:48



Es ist kompliziert, die beiden Zonendateien synchron zu halten, da der externe über einen dynamischen DNS-Client aktualisiert wird. Ich werde jedoch die Vorwärtsaussage lesen. Danke für den Tipp. - Remy Blank
Nein, die BIND-Weiterleitung funktioniert nicht, es wird nur für unbekannte Domains funktionieren, aber der interne Nameserver wird über example.com Bescheid wissen, es wird autorisierend dafür sein. - bortzmeyer
Wenn ich die Dokumentation richtig lese, sollte die "Forward first" -Anweisung innerhalb eines Zonenabschnitts BIND sagen, dass er ausgehen soll und selbst bei einer autoritativen lokalen Domäne nach einer Antwort bei der Weiterleitung suchen soll. Verwenden Sie dann die lokalen Informationen nur, wenn es möglich ist. Ich bekomme eine Antwort vom Spediteur. - Justin Scott
Wenn Sie ein globales "forward first" angeben, sendet es die Abfragen an den Forwarder, und wenn es nicht beantwortet wird, versucht es die Abfrage zu beantworten (aus dem doc), aber wenn es eine Antwort erhält, versucht es nicht, sich selbst zu lösen. Es wäre großartig, wenn Sie die Auflösung erzwingen könnten, wenn die Antwort nicht autorisierend ist oder wenn es sich um eine NXDOMAIN handelt, aber Bind wird nicht versuchen, wenn es eine Antwort von der Weiterleitung erhält. - Pablo Martinez


In BIND komme ich zu diesen Ergebnissen, indem ich eine Zone mit dem gewünschten Hostnamen definiere. Der Ansatz ist in Ordnung, wenn Sie nur einige Hosts außer Kraft setzen möchten.

Meine Zonendeklaration sieht folgendermaßen aus:

zone "override.example.com" {
        type master;
        notify no;
        file "zone-config/override.example.com";
};

Meine Zonendefinition sieht folgendermaßen aus:

$TTL 4H
@       IN      SOA     ns.override.example.com.    root.override.example.com. (
                        2009072215      ; Serial
                        3600            ; Refresh
                        600             ; Retry
                        604800          ; Expire
                        3600    )       ; Minimum
;
                NS      ns
        IN      NS      ns.override.example.com.
        IN      A       192.168.1.100
ns      IN      A       192.168.1.100

Also, wenn ich example.com im Intranet-DNS und ISP-DNS abfrage, bekomme ich dieselbe IP, aber wenn ich override.example.com abfrage, erhalte ich unterschiedliche Ergebnisse, wenn Intranet-DNS (primär) zugänglich ist.


2
2017-09-24 10:02





Du bist schon auf dem richtigen Weg.

Auf Ihren internen DNS-Servern müssen Sie für jeden Ausnahme-Host unmittelbar unterhalb von "example.com" eine Zone definieren. Um diese Ausnahmen zu minimieren, ist es üblich, alle internen Maschinen "hosta.internal.example.com" zu nennen, wobei der DNS-Server die meisten Abfragen an externe DNS-Server sendet, aber für die Zone "internal.example.com" autorisierend ist. (Sobald Sie an einem kleinen Vorgang vorbeigekommen sind, gibt es normalerweise einen DNS-Server, an den die Clients weitergeleitet werden, und ein separater autorisierender DNS-Server, für den diese Server bestimmt sind, ist auf "internal.example.com" gerichtet.)

Normalerweise müssen die Ausnahmen, die Sie beschreiben, nur erstellt werden, wenn ein Host sowohl extern als auch intern erreichbar sein muss. Selbst dann sollten Sie "host1.example.com" von außen und "host1.internal.example.com" von innen verwenden. Interne Hosts werden so konfiguriert, dass sie nach Namen in "internal.example.com" suchen. Es gibt Situationen, in denen das, was Sie bereits tun, angemessen ist, z. B. wenn das Zertifikat für einen Server den Server als "host1.example.com" identifiziert. In diesem Fall soll dies der Name sein, mit dem Clients eine Verbindung herstellen.


1
2018-06-03 14:49



Ja, für die Hosts "host1.example.com" funktioniert es bereits gut. Der knifflige Teil ist der Umgang mit der Top-Level "example.com" auf die gleiche Weise ... - Remy Blank


Verwenden Sie dnsmasq macht es wirklich einfach. http://www.thekelleys.org.uk/dnsmasq/doc.html  Fungiert als DNS-Server, erhält aber Antworten vom lokalen DNS-Server. Eine nette Sache ist, dass Sie einzelne Domain-Datensätze überschreiben können, ohne mit den Zonendateien zu stören


1
2018-04-16 16:38





In der Tat gibt es einen anderen, wenn auch vielleicht etwas anderen Weg, dies zu tun. Ich habe die gleiche Situation, ich habe eine Domäne, die extern und intern verwendet wird, und ich habe externe statische und dynamische Hosts. Die einzigen wirklich schmerzhaften sind die externen dynamischen. Die Lösung ist möglicherweise nicht die eleganteste, aber mit einem kleinen Skript umsetzbar. Meistens mache ich mein eigenes dynamisches DNS-Skript mit der API meines dynamischen DNS-Providers, ich führe dieses Skript alle 5 Minuten nach cron aus:

1) bekomme meine externe IP. hat es sich geändert? Kein Ausgang.

2) geänderte IP, Aufruf-API von dyndns-provider, mit der neuen IP-Adresse,

3) sed die db.mydomain.com mit der externen IP

4) Binde neu starten.

Funktioniert sehr zuverlässig für mein Heimnetzwerk


0
2017-10-13 19:00