Dieses Tutorial zeigt Ihnen, wie Sie öffentliche DNS-Einträge in Ihrem BIND-DNS-Resolver mit Antwortrichtlinienzone überschreiben (RPZ) auf Debian/Ubuntu.
Was ist die Reaktionsrichtlinienzone?
Antwortrichtlinienzone (RPZ) ermöglicht es einem DNS-Resolver, DNS-Einträge zu ändern. Es wurde ursprünglich entwickelt, um den Zugriff auf gefährliche Websites zu blockieren. Wenn ein Computer beispielsweise die IP-Adresse einer bekanntermaßen gefährlichen Website abfragt, die Malware verbreitet, kann der DNS-Resolver 127.0.0.1
zurückgeben als DNS-Antwort, sodass der Computer keine Verbindung zu der gefährlichen Site herstellen kann. Dies ist der ursprüngliche Anwendungsfall. Daher wird die Reaktionsrichtlinienzone auch als DNS-Firewall bezeichnet .
Sie können RPZ auf andere Weise verwenden. Zum Beispiel
- Wenn Sie selbst gehostete Dienste wie Nextcloud im lokalen Netzwerk haben, können Sie RPZ verwenden, um Ihre Nextcloud-Domain (nextcloud.your-domain.com) auf die lokale IP-Adresse zu verweisen, sodass Sie nicht ausgehen müssen mit dem Internet und gehen Sie dann zurück zu Ihrem lokalen Netzwerk, um auf den Nextcloud-Server zuzugreifen.
- Eltern können mit RPZ verhindern, dass ihre Kinder auf Pornoseiten zugreifen.
- Sie können unerwünschte Werbung blockieren.
- Ich installiere viele Webanwendungen auf meinem VPS. Wenn die Web-App nicht für den öffentlichen Zugriff bestimmt ist, füge ich den DNS-Eintrag nur in BIND RPZ hinzu und veröffentliche keinen DNS-Eintrag bei meinem Domain-Registrar, um Hacking zu verhindern.
Ja, Sie können einen DNS-Eintrag in /etc/hosts
erstellen Datei auf dem lokalen Computer, um öffentliche DNS-Einträge zu überschreiben, aber sie lässt sich nicht gut skalieren. Außerdem erlauben es iOS und Android nicht, lokale DNS-Einträge zu erstellen. Wäre es nicht schön, wenn der BIND-DNS-Resolver den öffentlichen DNS-Eintrag überschreibt, sodass alle Geräte im Netzwerk, die den BIND-Resolver verwenden, den benutzerdefinierten DNS-Eintrag verwenden können?
Voraussetzungen
Um diesem Tutorial zu folgen, wird davon ausgegangen, dass auf Ihrem Debian/Ubuntu-Server ein BIND-DNS-Resolver ausgeführt wird. Wenn nicht, lesen Sie bitte eines der folgenden Tutorials, um den BIND-Resolver einzurichten.
- Richten Sie Ihren eigenen BIND9-DNS-Resolver auf Debian 10 Buster ein
- Richten Sie Ihren eigenen BIND9-DNS-Resolver auf Ubuntu 16.04/18.04 ein
- Richten Sie Ihren eigenen BIND9-DNS-Resolver unter Ubuntu 20.04 ein
Sobald Ihr BIND-Resolver betriebsbereit ist, befolgen Sie die nachstehenden Anweisungen.
So richten Sie die BIND-Antwortrichtlinienzone auf einem Debian/Ubuntu-Server ein
Bearbeiten Sie zuerst die named.conf.options
Datei.
sudo nano /etc/bind/named.conf.options
Fügen Sie die folgenden Zeilen in den options {...}
hinzu -Klausel zum Aktivieren der Reaktionsrichtlinienzone. (Die erste Zeile ist ein Kommentar.)
//enable response policy zone. response-policy { zone "rpz.local"; };
Speichern und schließen Sie die Datei. Öffnen Sie dann die named.conf.local
Datei.
sudo nano /etc/bind/named.conf.local
Fügen Sie dieser Datei eine RPZ-Zone hinzu.
zone "rpz.local" { type master; file "/etc/bind/db.rpz.local"; allow-query { localhost; }; allow-transfer { 12.34.56.78; }; };
Hinweise:
- Wichtig ist, dass Sie in der
file
anstelle eines einfachen Dateinamens einen absoluten Pfad verwenden Direktive, oder BIND würde davon ausgehen, dass sich die Datei in/var/cache/bind/
befindet . - RPZ-Zonen sollten nur Abfragen von localhost zulassen. Sie müssen keine lokalen Netzwerkclients hinzufügen.
- Ersetzen Sie
12.34.56.78
mit der IP-Adresse des Slave-BIND-DNS-Resolvers, der Zonentransfers durchführen darf. Wenn es nur einen DNS-Resolver gibt, können Sielocalhost
verwenden etwa so:allow-transfer { localhost; };
Speichern und schließen Sie die Datei. Dann müssen wir die Zonendatei erstellen. Anstatt eine Zonendatei von Grund auf neu zu erstellen, können wir eine Zonenvorlagendatei verwenden. Kopieren Sie den Inhalt von db.empty
in eine neue Datei.
sudo cp /etc/bind/db.empty /etc/bind/db.rpz.local
Bearbeiten Sie dann die db.rpz
Datei.
sudo nano /etc/bind/db.rpz.local
Es besteht keine Notwendigkeit, den bestehenden Inhalt zu ändern. Wir fügen einfach unsere benutzerdefinierten DNS-Einträge hinzu. Wenn Sie beispielsweise einen Nextcloud-Server im lokalen Netzwerk mit der IP-Adresse 192.168.0.103 haben, fügen Sie den folgenden DNS-Eintrag hinzu, damit Nextcloud-Clients nicht ins Internet gehen müssen, um sich mit dem Nextcloud-Server zu verbinden .
nextcloud.your-domain.com A 192.168.0.103
Wenn Sie nicht möchten, dass Ihre Kinder Pornoseiten wie pornhub.com besuchen, fügen Sie dieser Datei die folgende Zeile hinzu, um die gesamte Domäne pornhub.com zu blockieren.
*.pornhub.com CNAME .
Wenn Sie keine Google Adsense-Anzeigen auf Webseiten sehen möchten, können Sie die folgende Zeile hinzufügen, um doubleclick.net
zu blockieren Domain, die zur Bereitstellung von Adsense-Anzeigen verwendet wird.
*.doubleclick.net CNAME .
Hier sind einige weitere Ad-Server-Domains, die Sie blockieren können.
*.pubmatic.com CNAME . *.mopub.com CNAME . *.eskimi.com CNAME . *.adcolony.xyz CNAME . *.adsrvr.org CNAME . *.adsymptotic.com CNAME . *.servedby-buysellads.com CNAME . srv.buysellads.com CNAME . *.powerinboxedge.com CNAME . *.defof.com CNAME . *.licasd.com CNAME . *.liadm.com CNAME .
Um den MX-Eintrag für einen Domainnamen zu überschreiben, fügen Sie eine Zeile wie unten hinzu.
example.com MX 0 mail.example.com.
Hinweis dass alle linken Namen NICHT mit einem Punkt enden dürfen und alle rechten Namen mit einem Punkt enden müssen.
Wenn Sie einen Lastenausgleich für einen Hostnamen benötigen, erstellen Sie einen Datensatz mit mehreren Werten wie unten. DNS-Clients verwenden die beiden IP-Adressen nach dem Zufallsprinzip und der Datenverkehr wird zwischen ihnen verteilt.
host.example.com A 12.34.56.78 A 12.34.56.79
Speichern und schließen Sie die Datei. Es wird empfohlen, eine separate Protokolldatei für RPZ zu verwenden, um das Protokoll besser analysieren zu können. Bearbeiten Sie zum Konfigurieren die BIND-Hauptkonfigurationsdatei.
sudo nano /etc/bind/named.conf
Fügen Sie der Datei die folgenden Zeilen hinzu.
logging { channel rpzlog { file "/var/log/named/rpz.log" versions unlimited size 100m; print-time yes; print-category yes; print-severity yes; severity info; }; category rpz { rpzlog; }; };
Speichern und schließen Sie die Datei. Erstellen Sie dann /var/log/named/
Verzeichnis und machen Sie bind
als Eigentümer.
sudo mkdir /var/log/named/ sudo chown bind:bind /var/log/named/ -R
Führen Sie als Nächstes den folgenden Befehl aus, um zu prüfen, ob Syntaxfehler in der Hauptkonfigurationsdatei vorhanden sind. Eine stille Ausgabe zeigt an, dass keine Fehler gefunden wurden.
sudo named-checkconf
Überprüfen Sie dann die Syntax der RPZ-Zonendateien.
sudo named-checkzone rpz /etc/bind/db.rpz.local
Wenn keine Fehler gefunden werden, starten Sie BIND9 neu.
sudo systemctl restart bind9
Jetzt können Sie dig
ausführen Befehl auf dem BIND-Server, um zu sehen, ob RPZ funktioniert. Fragen Sie beispielsweise einen DNS-Eintrag eines Domänennamens ab, der in der Antwortrichtlinienzone enthalten ist.
dig A nextcloud.your-domain.com @127.0.0.1
Sie sollten in der Befehlsausgabe so etwas wie unten sehen, was darauf hinweist, dass die DNS-Antwort von der lokalen RPZ bereitgestellt wurde.
;; AUTHORITY SECTION: rpz.local 86400 IN NS localhost.
Sie können auch das BIND9-Abfrageprotokoll überprüfen.
sudo tail /var/log/named/rpz.log
Sie würden so etwas wie unten sehen, was bedeutet, dass die Antwort von der lokalen RPZ geliefert wurde.
(example.com): rpz QNAME Local-Data rewrite example.com via example.com.rpz.local
Der Fedora-Client verwendet kein RPZ?
Standardmäßig verwendet Fedora kein RPZ. Sie können den dig
verwenden Befehlszeilendienstprogramm, um die IP-Adresse eines Hostnamens in der RPZ-Zone zu finden, aber wenn Sie den Hostnamen anpingen, kann es die IP-Adresse nicht finden.
Um dieses Problem zu lösen, müssen Sie den hosts-Parameter in /etc/nsswitch.conf
ändern Datei auf dem Fedora-Client.
sudo nano /etc/nsswitch.conf
Standardmäßig ist der hosts-Parameter wie folgt definiert:
hosts: files myhostname mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns
Ändern Sie es in:
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname mymachines
Speichern und schließen Sie die Datei. RPZ sollte jetzt funktionieren.
RPZ mit Forwardern verwenden
Wenn Sie eine fowarders
hinzufügen Direktive wie unten in den options
-Klausel in /etc/bind/named.conf.options
Datei, dann wird Ihr BIND-Resolver zu einem Forwarder, der DNS-Anfragen an einen Upstream-DNS-Resolver wie 8.8.8.8
weiterleitet .
options { directory "/var/cache/bind"; // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. forwarders { 8.8.8.8; 8.8.4.4; }; ... };
Die Antwortrichtlinienzone funktioniert mit dieser Weiterleitungseinrichtung. Bind fragt zuerst die lokale Reaktionsrichtlinienzone ab. Wenn der DNS-Eintrag nicht in der RPZ gefunden wird, wird die Anfrage an einen Upstream-DNS-Resolver weitergeleitet. Möglicherweise möchten Sie einen Forwarder verwenden, um die DNS-Auflösung zu beschleunigen, wenn Ihr eigener BIND-Resolver zu viel Zeit mit dem Auflösen von DNS-Namen benötigt.
Zonenübertragung konfigurieren
Wenn Sie einen anderen BIND-DNS-Resolver haben, können Sie ihn als Slave-Resolver konfigurieren, um automatisch Updates vom Master-DNS-Resolver zu erhalten.
Zuerst müssen Sie die /etc/bind/named.conf.local
bearbeiten Datei auf dem Master-DNS-Resolver .
sudo nano /etc/bind/named.conf.local
Fügen Sie die IP-Adresse des Slave-DNS-Resolvers zum allow-transfer
hinzu Richtlinie.
zone "rpz.local" { type master; file "/etc/bind/db.rpz.local"; allow-query { localhost; }; allow-transfer { 12.34.56.78; }; also-notify { 12.34.56.78; }; };
Wenn Sie mehrere Slave-DNS-Resolver haben, fügen Sie mehrere IP-Adressen wie unten hinzu.
allow-transfer { 12.34.56.78; 12.34.56.79; };
Die also-notify
-Anweisung bewirkt, dass der Master-DNS-Resolver eine Benachrichtigung an den Slave-Resolver sendet, wenn die RPZ-Zone geändert wird. Speichern und schließen Sie die Datei. Starten Sie BIND neu, damit die Änderungen wirksam werden.
sudo systemctl restart bind9
Wenn auf dem Master-DNS-Resolver eine Firewall ausgeführt wird, müssen Sie dem Slave-DNS-Resolver erlauben, sich mit Port 53 zu verbinden. Wenn Sie beispielsweise eine UFW-Firewall verwenden, führen Sie den folgenden Befehl aus.
sudo ufw insert 1 allow in from 12.34.56.78 to any port 53
Bearbeiten Sie als Nächstes die named.conf.options
Datei auf dem Slave-DNS-Resolver .
sudo nano /etc/bind/named.conf.options
Fügen Sie die folgenden Zeilen in den options {...}
hinzu -Klausel zum Aktivieren der Reaktionsrichtlinienzone. (Die erste Zeile ist ein Kommentar.)
//enable response policy zone. response-policy { zone "rpz.local"; };
Speichern und schließen Sie die Datei. Bearbeiten Sie dann die named.conf.local
Datei.
sudo nano /etc/bind/named.conf.local
Fügen Sie dieser Datei eine Slave-RPZ-Zone hinzu. Ersetzen Sie 11.22.33.44 durch die IP-Adresse des Master-DNS-Resolvers.
zone "rpz.local" { type slave; file "db.rpz.local"; masters { 11.22.33.44;}; allow-notify { 11.22.33.44; }; allow-transfer { none; }; allow-query { localhost; }; };
Speichern und schließen Sie die Datei.
Sie müssen auch die Firewall des Slave-Resolvers konfigurieren, damit der Master-DNS-Resolver notify
senden kann Nachrichten.
sudo ufw insert 1 allow in from 11.22.33.44 to any port 53
Führen Sie als Nächstes den folgenden Befehl aus, um zu prüfen, ob Syntaxfehler in der Hauptkonfigurationsdatei vorhanden sind. Eine stille Ausgabe zeigt an, dass keine Fehler gefunden wurden.
sudo named-checkconf
Wenn keine Fehler gefunden werden, starten Sie BIND9 neu.
sudo systemctl restart bind9
Nach dem Neustart von BIND9 beginnt der Zonentransfer sofort. Überprüfen Sie das BIND9-Protokoll mit dem folgenden Befehl.
sudo journalctl -eu bind9
oder
sudo journalctl -eu named
Sie können Meldungen wie unten sehen, die darauf hinweisen, dass die Zonenübertragung erfolgreich war.
transfer of 'rpz.local/IN' from xx.xx.xx.xx#53: Transfer status: success transfer of 'rpz.local/IN' from xx.xx.xx.xx#53: Transfer completed: 1 messages, 34 records, 899 bytes, 0.248 secs (3625 bytes/sec)
Hinweis: Immer wenn Sie die RPZ-Zone auf dem Master-Resolver ändern, müssen Sie die Seriennummer aktualisieren. Machen Sie es größer, damit Slave-Resolver wissen, dass die RPZ-Zone geändert wurde.
Erstellen mehrerer RPZ-Zonen
Manchmal möchten Sie möglicherweise nicht, dass bestimmte DNS-Einträge an Slave-Resolver übertragen werden. Sie können eine separate RPZ-Zone erstellen. Bearbeiten Sie die named.conf.options
Datei.
sudo nano /etc/bind/named.conf.options
Fügen Sie eine neue RPZ-Zone hinzu.
//enable response policy zone. response-policy { zone "rpz.local"; zone "rpz.local.notransfer"; };
Hinweis :Wenn die beiden RPZ-Zonen Konflikt-DNS-Einträge haben, hat der erste Eintrag Vorrang. Wenn Sie die Priorität umkehren möchten, ändern Sie ihre Position wie unten:
//enable response policy zone. response-policy { zone "rpz.local.notransfer"; zone "rpz.local"; };
Speichern und schließen Sie die Datei. Öffnen Sie dann die named.conf.local
Datei.
sudo nano /etc/bind/named.conf.local
Fügen Sie in dieser Datei eine Definition für die neue Zone hinzu.
zone "rpz.local.notransfer" { type master; file "/etc/bind/db.rpz.local.notransfer"; allow-query { localhost; }; allow-transfer { localhost; }; };
Speichern und schließen Sie die Datei. Dann müssen wir die Zonendatei erstellen. Anstatt eine Zonendatei von Grund auf neu zu erstellen, können wir eine Zonenvorlagendatei verwenden. Kopieren Sie den Inhalt von db.empty
in eine neue Datei.
sudo cp /etc/bind/db.empty /etc/bind/db.rpz.local.notransfer
Bearbeiten Sie dann die db.rpz
Datei und benutzerdefinierte DNS-Einträge hinzufügen.
sudo nano /etc/bind/db.rpz.local.transfer
Tipps zur Fehlerbehebung
Wenn der sekundäre DNS-Resolver keine RPZ-Einträge vom primären DNS-Resolver replizieren kann, ist es möglich, dass auf dem sekundären DNS-Resolver:
- Firewall-Regel ist falsch.
- Der BIND-Resolver läuft nicht.
- BIND lauscht nicht auf der erforderlichen Netzwerkschnittstelle.
Wie man RPZ mit Ansichten in BIND verwendet
Wenn Sie Ihre RPZ nur für interne vertrauenswürdige Netzwerke zugänglich machen möchten, können Sie Ansichten in BIND verwenden, um dies zu erreichen. Dieses Setup ist mit der Master-Slave-Zonenübertragung kompatibel.
Bearbeiten Sie zuerst die named.conf.options
Datei.
sudo nano /etc/bind/named.conf.options
Definieren Sie ein internes Netzwerk und ein Gastnetzwerk mit acl
Richtlinie.
options { ..... ..... } acl internal { 10.10.10.0/24; }; acl guest { 10.10.20.0/24; };
Hier der 10.10.10.0/24
Netzwerk ist das interne vertrauenswürdige Netzwerk. 10.10.20.0/24
ist das Gästenetz. Löschen Sie außerdem die folgenden Zeilen aus dieser Datei.
response-policy { zone "rpz.local"; };
Speichern und schließen Sie die Datei.
Bearbeiten Sie als Nächstes die named.conf.local
Datei.
sudo nano /etc/bind/named.conf.local
Sie müssen die Zonendefinition in eine view
einfügen Klausel wie unten. Beachten Sie, dass wir die Reaktionsrichtlinienzone innerhalb der view
aktivieren müssen Klausel.
view "internal" { match-clients { internal; }; //enable the response policy zone. response-policy { zone "rpz.local"; }; zone "rpz.local" { type master; file "/etc/bind/db.rpz.local"; allow-query { localhost; }; allow-transfer { 12.34.56.78; }; }; };
Speichern und schließen Sie die Datei. Bearbeiten Sie dann die named.conf
Datei.
sudo nano /etc/bind/named.conf.default-zones
Setzen Sie die Standardzonen in guest
ansehen.
view guest { match-clients { guest; }; allow-recursion { any; }; zone "." { type hint; file "/usr/share/dns/root.hints"; }; zone "localhost" { type master; file "/etc/bind/db.local"; }; ..... ..... };
Speichern und schließen Sie die Datei. Führen Sie den folgenden Befehl aus, um zu prüfen, ob die Konfigurationsdatei Syntaxfehler enthält. Eine stille Ausgabe zeigt an, dass keine Fehler gefunden wurden.
sudo named-checkconf
Wenn keine Fehler gefunden werden, starten Sie BIND9 neu, damit die Änderungen wirksam werden.
sudo systemctl restart bind9