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


39

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

Ich möchte, dass Hosts im internen Netzwerk "host1.example.com", "host2.example.com" und "example.com" in interne IP-Adressen anstelle der des Gateways auflösen. Andere Hosts wie "otherhost.example.com" sollten weiterhin vom externen DNS-Anbieter aufgelöst werden.

Das ist mir für die Einträge host1 und host2 gelungen, indem ich in BIND zwei Zonen mit einem Eintrag 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 Domain von meinem lokalen DNS-Server gelöst, und z. B. die Abfrage von "otherhost.example.com" führt zu einem Fehler.

Ist es möglich, BIND so zu konfigurieren, dass nur einige Einträge einer Domäne außer Kraft gesetzt werden und der Rest rekursiv aufgelöst wird?



1
Msgstr "Ist es möglich, BIND so zu konfigurieren, dass nur einige Einträge einer Domain überschrieben werden?" Nein, nicht bei BIND. Verwenden Sie eine Unterdomäne.
Bortzmeyer

1
Ungebunden scheint genau das zu tun, wonach ich gefragt habe, und deshalb setze ich Alnitaks Antwort als akzeptierte Antwort. Aber am Ende werde ich dem Rat von Bortzmeyer folgen und den Domain-Eintrag nicht überschreiben. Danke für all die Antworten!
Remy Blank

1
Bind kann dies jetzt mit der Antwortrichtlinienzone tun. Siehe meine Antwort unten. Andere Lösungen wie Ungebunden können CNAMEs nicht überschreiben. Mit Richtlinienzonen in "Binden" müssen Sie keine Unterdomänen erstellen. Sie können einzelne Datensätze einfach nach Belieben überschreiben.
Florin Andrei

Antworten:


18

Die beste Methode ist über die Antwortrichtlinienzone in Bind 9.8.1 oder höher. Sie können einzelne Datensätze in beliebigen Zonen überschreiben (und es ist nicht erforderlich, eine ganze Unterdomäne dafür zu erstellen, nur den einzelnen Datensatz, den Sie ändern möchten). 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


EDIT: Dann machen wir das richtig. Ich werde anhand des oben verlinkten Tutorials dokumentieren, was ich getan habe.

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

Gehen Sie zu dem Ort, an dem sich Ihre Bind-Konfigurationsdateien auf Ihrem System befinden - hier ist es /etc/bind. Erstellen Sie dort eine Datei db.rpzmit 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.commit der gefälschten Adresse 127.0.0.1und sendet den gesamten Datenverkehr für diese Site effektiv an die Loopback-Adresse
  • Es sendet Datenverkehr www.other-website.coman eine andere Site mit dem Namenfake-hostname.com

Alles, was in eine Bindezonendatei passen könnte, können Sie hier verwenden.

Um diese Änderungen zu aktivieren, sind einige weitere Schritte erforderlich:

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

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

In dem oben verlinkten Tutorial werden Sie aufgefordert, weitere Elemente hinzuzufügen zone "rpz" { }, dies ist jedoch in einfachen Setups nicht erforderlich. Ich habe hier gezeigt, dass dies mindestens auf Ihrem lokalen Resolver funktioniert.

Bearbeiten named.conf.optionsund irgendwo im options { }Abschnitt die response-policyOption hinzufügen :

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

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

Nun starte Bind neu:

service bind9 restart

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

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

Bonus: Wenn Sie DNS-Abfragen in Syslog protokollieren möchten, können Sie den Vorgang im Auge behalten, bearbeiten named.conf.localund sicherstellen, dass ein loggingAbschnitt mit den folgenden Anweisungen vorhanden ist:

logging {
    // stuff
    // already
    // there

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

Bind erneut starten und fertig.

Testen Sie es auf der laufenden Maschine.

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

Wenn Sie dig auf einem anderen Computer ausführen, verwenden Sie einfach @ die-IP-Adresse-des-Bindungsservers anstelle von @ 127.0.0.1

Ich habe diese Technik mit großem Erfolg verwendet, um den CNAME für eine Website, an der ich gearbeitet habe, zu überschreiben und an einen neuen AWS Load Balancer zu senden, den ich gerade getestet habe. Ein Raspberry Pi wurde verwendet, um Bind auszuführen, und das RPi wurde auch so konfiguriert, dass es als WLAN-Router fungiert. Wenn ich also Geräte mit der SSID verbinde, die auf dem RPi ausgeführt wird, erhalte ich die DNS-Überschreibungen, die ich zum Testen benötige.


1
Bitte beachten Sie, dass BIND RPZ einzelne Datensätze (noch) nicht pro QTYPE überschreiben kann - es werden alle Datensätze für einen bestimmten Besitzernamen überschrieben . Das heißt, wenn Sie den A-Eintrag für eine Domain überschreiben möchten, aber nicht z. B. den MX-Eintrag, können Sie dies nicht. Sie müssen den MX-Datensatz auch in der RPZ-Zone ablegen und ihn mit der realen Zone synchronisieren.
Alnitak

2
Vielen Dank, dass Sie dies so aufgeschlüsselt haben. Sehr hilfreich.
Sruffell

Gibt es irgendwelche Vorbehalte? Ich versuche dies auf einem Pfsense zu tun, aber ich kann keine Ergebnisse "fälschen", es gibt immer noch die wahre Adresse an. Ich glaube, ich habe die Anweisungen auf den Brief befolgt.
Lenne

@Lenne Es sollte einfach funktionieren. Ich habe den Beitrag bearbeitet und einen Vorschlag zum Testen der Änderungen hinzugefügt.
Florin Andrei

@Lenne das pfSense BIND-Paket hat dies seit ungefähr einem Jahr in der GUI eingebaut, so dass es nicht nötig sein sollte, mit Configs herumzuspielen. OP: Erwähnen Sie vielleicht einige andere Dinge, die Sie mit einer RPZ tun können, z. B. mit NXDOMAIN antworten oder die Antwort einfach fallen lassen.
miken32

21

Der nicht gebundene rekursive DNS-Server kann einzelne Ressourceneinträge überschreiben.

Schauen Sie sich die local-zoneund local-dataKonfigurationseinstellungen im Handbuch an , zB:

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

Die transparentEinstellung in local-zoneweist es an, normale rekursive Suchen für alle Namen durchzuführen, die nicht mit geliefert werden local-data.


1
Scheint genau das zu sein, was ich tun möchte, danke. Ich werde heute Abend über Unbound nachlesen.
Remy Blank

Andererseits ist die Weisheit davon ziemlich fraglich. Eine internal.example.com Domain zu haben wäre klarer.
Bortzmeyer

@Bortzmeyer - Sie könnten Recht haben, aber ich kann mir nicht vorstellen, dass Wouter es nur zum Spaß reingesteckt hat ;-)
Alnitak

3
@bortzmeyer, manchmal gibt es keine andere Wahl. Beispiel: SBS 2008 muss über eine einzige LAN-IP verfügen, muss jedoch von außen über eine externe IP-Adresse erreichbar sein, die der Router weiterleitet. Microsoft lässt nicht zu, dass zwei Netzwerkkarten in SBS oder zwei IP-Adressen auf derselben Karte konfiguriert sind. Wenn lokale Server den DNS-Namen in die externe IP-Adresse auflösen, muss der Router sowohl DNAT als auch SNAT für LAN-IP-Adressen ausführen. In den Protokollen auf dem SBS wird dann der gesamte Zugriff von der IP-Adresse des Routers aus angezeigt, und das ist einfach falsch. Ich werde unboundauf meinem eigenen Router installieren , ich denke die Lösung ist viel besser.
Cosmin Prund

Dies beantwortet die Frage nicht, da die Frage spezifisch für BIND ist.
bzeaman

4

Vielleicht möchten Sie sich mit "dnsmasq" befassen, mit dem Sie einige ziemlich clevere Dinge mit optimierter Auflösung tun können.


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

4

Was Sie suchen, ist aufgeteiltes DNS, das von Webopedia definiert wird als:

In einer geteilten DNS-Infrastruktur erstellen Sie zwei Zonen für dieselbe Domäne, eine für das interne Netzwerk und eine für das externe Netzwerk. Split DNS leitet interne Hosts zur Namensauflösung an einen internen Domain Name Server und externe Hosts zur Namensauflösung an einen externen Domain Name Server.

Im Wesentlichen müssen Sie eine Kopie Ihrer externen Zonendatei erstellen und auf Ihrem internen DNS-Server ablegen. Anschließend müssen Sie die speziell für Ihr internes Netzwerk erforderlichen Datensätze ändern oder hinzufügen. Dies ist eine ziemlich häufige Einrichtung, obwohl es schwierig 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 Setups haben Sie einen DNS-Server, der das externe Netzwerk bedient, und einen anderen, der das interne Netzwerk bedient. Mit BIND können Sie als möglicherweise andere Implementierungen beide Versionen der Zone auf demselben Server haben, indem Sie die Anweisung "allow-query" im Zonenabschnitt der Datei named.conf verwenden.

Eine andere Möglichkeit bei BIND (und ich habe es noch nie versucht) wäre, Ihre example.com-Domain auf dem internen DNS-Server nur mit den Datensätzen einzurichten, die Sie intern verwenden. Setzen Sie dann eine "forward" -Anweisung mit dem Argument "first" (in Verbindung mit "forwarders"). Theoretisch würde dies dazu führen, dass der externe DNS-Server (wie in "Weiterleitungen" festgelegt) nach einer Antwort gefragt wird, bei der Ihre internen Datensätze nicht vorhanden sind und keine Fehlerantwort zurückgegeben wird. Dann würde der interne Server sich selbst nach einer Antwort umsehen sicher, ob das funktionieren würde, aber es ist ein Gedanke.


Das Synchronisieren der beiden Zonendateien ist kompliziert, da die Aktualisierung der externen Zone über einen dynamischen DNS-Client erfolgt. Ich werde jedoch die Forward-Anweisung nachlesen. Danke für den Tipp.
Remy Blank

Nein, die BIND-Weiterleitung wird nicht funktionieren, es wird nur für unbekannte Domains sein, aber der interne Nameserver wird über example.com Bescheid wissen, es wird dafür maßgeblich sein.
Bortzmeyer

1
Wenn ich die Dokumentation richtig lese, sollte die Anweisung "forward first" (zuerst weiterleiten) in einem Zonenabschnitt BIND anweisen, auch bei einer autorisierenden lokalen Domäne nach einer Antwort beim Weiterleiter zu suchen. Verwenden Sie dann die lokalen Informationen nur, wenn dies möglich ist. ' Keine Antwort vom Spediteur.
Justin Scott

Wenn Sie ein globales "forward first" setzen, werden die Anfragen an die Weiterleitung gesendet, und wenn es nicht beantwortet wird, wird versucht, die Anfrage zu beantworten (aus dem Dokument). Wenn es jedoch eine Antwort erhält, wird es nicht versuchen, sich selbst aufzulösen. Es wäre großartig, wenn Sie eine Lösung erzwingen könnten, wenn die Antwort nicht autorisierend ist oder sogar wenn es sich um eine NXDOMAIN handelt, aber bind nicht versucht, eine Antwort vom Weiterleitungsdienst zu erhalten.
Pablo Martinez

3

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 überschreiben 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

Wenn ich also example.com über Intranet-DNS und ISP-DNS abfrage, erhalte ich dieselbe IP, aber wenn ich override.example.com abfrage, erhalte ich unterschiedliche Ergebnisse, wenn auf Intranet-DNS (primär) zugegriffen werden kann.


2

Du bist schon auf dem richtigen Weg.

Auf Ihren internen DNS-Servern müssen Sie für jeden Ausnahmehost unmittelbar unterhalb von "example.com" eine Zone definieren. Um diese Ausnahmen zu minimieren, ist es üblich, alle internen Computer mit "hosta.internal.example.com" zu benennen, wobei der DNS-Server die meisten Abfragen an externe DNS-Server sendet, jedoch für die Zone "internal.example.com" maßgeblich ist. (Sobald Sie an kleinen Vorgängen vorbeigekommen sind, gibt es normalerweise einige DNS-Server, an die Clients weitergeleitet werden, und einen separaten autorisierenden DNS, an den diese Server für "internal.example.com" weitergeleitet werden.)

Normalerweise werden die von Ihnen beschriebenen Ausnahmen nur dann erstellt, wenn ein Host sowohl extern als auch intern erreichbar sein muss. Selbst dann möchten Sie möglicherweise "host1.example.com" von außen und "host1.internal.example.com" von innen verwenden. Interne Hosts werden so konfiguriert, dass sie in "internal.example.com" nach Namen 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.


Ja, für die "host1.example.com" -Hosts funktioniert es bereits gut. Der knifflige Teil behandelt die Top-Ebene "example.com" auf die gleiche Weise ...
Remy Blank

2

Mit dnsmasq ist das ganz einfach. http://www.thekelleys.org.uk/dnsmasq/doc.html Dient als DNS-Server, erhält jedoch Antworten vom lokalen DNS-Server. Das Schöne ist, dass Sie einzelne Domain-Einträge überschreiben können, ohne sich mit Zonendateien herumschlagen zu müssen


2

Tatsächlich gibt es eine andere, wenn auch etwas andere Möglichkeit, 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 äußeren 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 von cron aus:

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

2) IP geändert, API des dyndns-Anbieters aufrufen, mit der neuen IP-Adresse,

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

4) Bind neu starten.

Funktioniert sehr zuverlässig für mein Heimnetzwerk


Gleicher Vorgang von mir gemacht. Details finden Sie in unserem Wiki Stealth Name Server . Aber nicht in der Lage, dyn.dev.shahed.bizvon World Wide zu lösen ! Würden Sie uns bitte helfen, dieses Problem zu beheben?
Md Shahed Hossain
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.