Tento tutoriál vám ukáže, jak přepsat veřejné záznamy DNS ve vašem překladači BIND DNS pomocí zóny zásad odezvy (RPZ) na Debian/Ubuntu.
Co je zóna zásad odezvy?
Zóna zásad odpovědí (RPZ) umožňuje překladači DNS upravovat záznamy DNS. Původně byl vyvinut jako způsob, jak blokovat přístup k nebezpečným webům. Pokud se například počítač dotáže na IP adresu známého nebezpečného webu, který šíří malware, může DNS resolver vrátit 127.0.0.1
jako odpověď DNS, takže počítač se nemůže připojit k nebezpečné stránce. Toto je původní případ použití. Jako taková je zóna zásad odezvy známá také jako DNS firewall .
RPZ můžete využít i jinak. Například,
- Pokud máte v místní síti vlastní služby, jako je Nextcloud, můžete pomocí RPZ nasměrovat svou doménu Nextcloud (nextcloud.vaše-doména.com) na místní IP adresu, takže nemusíte odcházet k Internetu a poté se vraťte do místní sítě pro přístup k serveru Nextcloud.
- Rodiče mohou pomocí RPZ zablokovat svým dětem přístup na porno stránky.
- Nežádoucí reklamy můžete blokovat.
- Na své VPS instaluji mnoho webových aplikací. Když webová aplikace není určena pro veřejný přístup, přidám záznam DNS pouze do BIND RPZ a nezveřejňuji záznam DNS u svého registrátora domény, abych zabránil hackování.
Ano, záznam DNS můžete vytvořit v /etc/hosts
soubor na místním počítači přepsat veřejné záznamy DNS, ale neškáluje se dobře. Kromě toho vám iOS a Android neumožňují vytvářet místní záznamy DNS. Nebylo by hezké, kdyby překladač DNS BIND přepsal veřejný záznam DNS, takže všechna zařízení v síti používající překladač BIND mohla používat vlastní DNS záznam?
Předpoklady
Chcete-li postupovat podle tohoto návodu, předpokládá se, že máte na serveru Debian/Ubuntu spuštěný BIND DNS resolver. Pokud ne, přečtěte si prosím jeden z následujících návodů k nastavení BIND resolveru.
- Nastavte si svůj vlastní BIND9 DNS Resolver na Debian 10 Buster
- Nastavte si svůj vlastní BIND9 DNS Resolver na Ubuntu 16.04/18.04
- Nastavte si svůj vlastní BIND9 DNS Resolver na Ubuntu 20.04
Jakmile bude váš BIND Resolver spuštěn a spuštěn, postupujte podle pokynů níže.
Jak nastavit zónu BIND Response Policy Zone na serveru Debian/Ubuntu
Nejprve upravte named.conf.options
soubor.
sudo nano /etc/bind/named.conf.options
Přidejte následující řádky do options {...}
klauzule pro povolení zóny zásad odezvy. (První řádek je komentář.)
//enable response policy zone. response-policy { zone "rpz.local"; };
Uložte a zavřete soubor. Poté otevřete named.conf.local
soubor.
sudo nano /etc/bind/named.conf.local
Přidejte do tohoto souboru zónu RPZ.
zone "rpz.local" { type master; file "/etc/bind/db.rpz.local"; allow-query { localhost; }; allow-transfer { 12.34.56.78; }; };
Poznámky:
- Je důležité, abyste místo jednoduchého názvu souboru v
file
použili absolutní cestu nebo BIND předpokládá, že soubor je v/var/cache/bind/
. - Zóny RPZ by měly umožňovat dotazy pouze z localhost. Není třeba přidávat klienty místní sítě.
- Nahraďte
12.34.56.78
s IP adresou slave DNS resolveru BIND, který má povoleno provádět zónový přenos. Pokud existuje pouze jeden DNS resolver, můžete použítlocalhost
takto:allow-transfer { localhost; };
Uložte a zavřete soubor. Poté musíme vytvořit soubor zóny. Místo vytvoření souboru zóny od začátku můžeme použít soubor šablony zóny. Zkopírujte obsah db.empty
do nového souboru.
sudo cp /etc/bind/db.empty /etc/bind/db.rpz.local
Poté upravte db.rpz
soubor.
sudo nano /etc/bind/db.rpz.local
Není třeba měnit stávající obsah. My pouze přidáme naše vlastní DNS záznamy. Pokud máte například v místní síti server Nextcloud s IP adresou 192.168.0.103, přidáte následující záznam DNS, takže klienti Nextcloud nemusí chodit na internet, aby se mohli připojit k serveru Nextcloud .
nextcloud.your-domain.com A 192.168.0.103
Pokud nechcete, aby vaše děti navštěvovaly porno stránky, jako je pornhub.com, přidejte do tohoto souboru následující řádek, abyste zablokovali celou doménu pornhub.com.
*.pornhub.com CNAME .
Pokud nechcete, aby se vám na webových stránkách zobrazovaly reklamy Google Adsense, můžete přidat následující řádek a blokovat doubleclick.net
doména, která se používá k zobrazování reklam AdSense.
*.doubleclick.net CNAME .
Zde je několik dalších domén reklamních serverů, které můžete blokovat.
*.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 .
Chcete-li přepsat záznam MX pro název domény, přidejte řádek jako níže.
example.com MX 0 mail.example.com.
Poznámka že všechna levá jména NESMÍ končit tečkou a všechna pravá jména musí končit tečkou.
Pokud potřebujete vyvažování zátěže pro název hostitele, vytvoříte záznam s více hodnotami, jak je uvedeno níže. Klienti DNS budou používat dvě IP adresy náhodně a provoz bude distribuován mezi ně.
host.example.com A 12.34.56.78 A 12.34.56.79
Uložte a zavřete soubor. Pro lepší analýzu protokolu se doporučuje použít samostatný soubor protokolu pro RPZ. Pro konfiguraci upravte hlavní konfigurační soubor BIND.
sudo nano /etc/bind/named.conf
Přidejte do souboru následující řádky.
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; }; };
Uložte a zavřete soubor. Poté vytvořte /var/log/named/
adresář a proveďte bind
jako vlastník.
sudo mkdir /var/log/named/ sudo chown bind:bind /var/log/named/ -R
Dále spusťte následující příkaz a zkontrolujte, zda v hlavním konfiguračním souboru nejsou chyby syntaxe. Tichý výstup znamená, že nebyly nalezeny žádné chyby.
sudo named-checkconf
Poté zkontrolujte syntaxi souborů zóny RPZ.
sudo named-checkzone rpz /etc/bind/db.rpz.local
Pokud nejsou nalezeny žádné chyby, restartujte BIND9.
sudo systemctl restart bind9
Nyní můžete spustit dig
příkaz na serveru BIND, abyste zjistili, zda RPZ funguje. Dotazujte se například na záznam DNS názvu domény, který je součástí zóny zásad odezvy.
dig A nextcloud.your-domain.com @127.0.0.1
Ve výstupu příkazu byste měli vidět něco jako níže, což znamená, že odpověď DNS byla doručena z místního RPZ.
;; AUTHORITY SECTION: rpz.local 86400 IN NS localhost.
Můžete také zkontrolovat protokol dotazů BIND9.
sudo tail /var/log/named/rpz.log
Uvidíte něco podobného níže, což znamená, že odpověď byla doručena z místního RPZ.
(example.com): rpz QNAME Local-Data rewrite example.com via example.com.rpz.local
Klient Fedora nepoužívá RPZ?
Ve výchozím nastavení Fedora nepoužívá RPZ. Můžete použít dig
nástroj příkazového řádku k nalezení IP adresy názvu hostitele v zóně RPZ, ale pokud na název hostitele odešlete příkaz ping, nemůže IP adresu najít.
Chcete-li tento problém vyřešit, musíte změnit parametr hosts v /etc/nsswitch.conf
soubor na klientovi Fedory.
sudo nano /etc/nsswitch.conf
Ve výchozím nastavení je parametr hosts definován jako:
hosts: files myhostname mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns
Změňte jej na:
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname mymachines
Uložte a zavřete soubor. RPZ by nyní mělo fungovat.
Používání RPZ s forwardery
Pokud přidáte fowarders
jako níže v options
klauzule v /etc/bind/named.conf.options
soubor, pak se váš BIND resolver stane forwarderem, který bude předávat DNS požadavky na upstream DNS resolver, jako je 8.8.8.8
.
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; }; ... };
Zóna zásad odezvy funguje s tímto nastavením předávání. Bind se nejprve dotáže místní zóny zásad odezvy. Pokud DNS záznam není v RPZ nalezen, bude požadavek předán upstreamovému DNS resolveru. Možná budete chtít použít forwarder k urychlení překladu DNS, když vašemu vlastnímu překladači BIND zabere příliš mnoho času překlad názvů DNS.
Konfigurace přenosu zóny
Pokud máte jiný BIND DNS resolver, můžete jej nakonfigurovat jako slave resolver, aby automaticky přijímal aktualizace z hlavního DNS resolveru.
Nejprve musíte upravit /etc/bind/named.conf.local
soubor na hlavním překladači DNS .
sudo nano /etc/bind/named.conf.local
Přidejte IP adresu podřízeného DNS resolveru do allow-transfer
směrnice.
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; }; };
Pokud máte více podřízených DNS resolverů, přidejte více IP adres, jak je uvedeno níže.
allow-transfer { 12.34.56.78; 12.34.56.79; };
also-notify
direktiva způsobí, že hlavní překladač DNS odešle zprávu s upozorněním podřízenému překladači, když se změní zóna RPZ. Uložte a zavřete soubor. Restartujte BIND, aby se změny projevily.
sudo systemctl restart bind9
Pokud je na hlavním překladači DNS spuštěna brána firewall, musíte podřízenému překladači DNS povolit připojení k portu 53. Pokud například používáte bránu firewall UFW, spusťte následující příkaz.
sudo ufw insert 1 allow in from 12.34.56.78 to any port 53
Dále upravte named.conf.options
soubor na slave DNS resolveru .
sudo nano /etc/bind/named.conf.options
Přidejte následující řádky do options {...}
klauzule pro povolení zóny zásad odezvy. (První řádek je komentář.)
//enable response policy zone. response-policy { zone "rpz.local"; };
Uložte a zavřete soubor. Poté upravte named.conf.local
soubor.
sudo nano /etc/bind/named.conf.local
Přidejte do tohoto souboru podřízenou zónu RPZ. Nahraďte 11.22.33.44 IP adresou hlavního DNS resolveru.
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; }; };
Uložte a zavřete soubor.
Musíte také nakonfigurovat bránu firewall podřízeného resolveru, aby umožnil hlavnímu DNS resolveru posílat notify
zprávy.
sudo ufw insert 1 allow in from 11.22.33.44 to any port 53
Dále spusťte následující příkaz a zkontrolujte, zda v hlavním konfiguračním souboru nejsou chyby syntaxe. Tichý výstup znamená, že nebyly nalezeny žádné chyby.
sudo named-checkconf
Pokud nejsou nalezeny žádné chyby, restartujte BIND9.
sudo systemctl restart bind9
Po restartu BIND9 se okamžitě spustí přenos zóny. Zkontrolujte protokol BIND9 pomocí následujícího příkazu.
sudo journalctl -eu bind9
nebo
sudo journalctl -eu named
Můžete vidět zprávy jako níže, které indikují, že přenos zóny byl úspěšný.
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)
Poznámka: Kdykoli upravíte zónu RPZ na hlavním překladači, musíte aktualizovat sériové číslo. Zvětšete jej, aby slave resolvery věděli, že se zóna RPZ změnila.
Vytvoření více RPZ zón
Někdy možná nebudete chtít, aby se určité záznamy DNS přenášely do podřízených překladačů. Můžete vytvořit samostatnou zónu RPZ. Upravte named.conf.options
soubor.
sudo nano /etc/bind/named.conf.options
Přidejte novou zónu RPZ.
//enable response policy zone. response-policy { zone "rpz.local"; zone "rpz.local.notransfer"; };
Poznámka :Pokud mají dvě zóny RPZ konfliktní záznamy DNS, bude mít přednost první položka. Pokud chcete obrátit prioritu, změňte jejich polohu, jako níže:
//enable response policy zone. response-policy { zone "rpz.local.notransfer"; zone "rpz.local"; };
Uložte a zavřete soubor. Poté otevřete named.conf.local
soubor.
sudo nano /etc/bind/named.conf.local
Přidejte definici pro novou zónu do tohoto souboru.
zone "rpz.local.notransfer" { type master; file "/etc/bind/db.rpz.local.notransfer"; allow-query { localhost; }; allow-transfer { localhost; }; };
Uložte a zavřete soubor. Poté musíme vytvořit soubor zóny. Místo vytvoření souboru zóny od začátku můžeme použít soubor šablony zóny. Zkopírujte obsah db.empty
do nového souboru.
sudo cp /etc/bind/db.empty /etc/bind/db.rpz.local.notransfer
Poté upravte db.rpz
soubor a přidejte vlastní záznamy DNS.
sudo nano /etc/bind/db.rpz.local.transfer
Tipy pro odstraňování problémů
Pokud sekundární překladač DNS nedokáže replikovat záznamy RPZ z primárního překladače DNS, je možné, že na sekundárním překladači DNS:
- Pravidlo brány firewall je chybné.
- Překladač BIND neběží.
- BIND nenaslouchá na požadovaném síťovém rozhraní.
Jak používat RPZ se zobrazeními v BIND
Pokud chcete své RPZ zpřístupnit pouze interním důvěryhodným sítím, můžete k tomu použít pohledy v BIND. Toto nastavení bude kompatibilní s přenosem zóny master-slave.
Nejprve upravte named.conf.options
soubor.
sudo nano /etc/bind/named.conf.options
Definujte interní síť a síť pro hosty pomocí acl
směrnice.
options { ..... ..... } acl internal { 10.10.10.0/24; }; acl guest { 10.10.20.0/24; };
Zde je 10.10.10.0/24
síť je interní důvěryhodná síť. 10.10.20.0/24
je síť pro hosty. Z tohoto souboru také odstraňte následující řádky.
response-policy { zone "rpz.local"; };
Uložte a zavřete soubor.
Dále upravte named.conf.local
soubor.
sudo nano /etc/bind/named.conf.local
Musíte vložit definici zóny do view
klauzule jako níže. Všimněte si, že musíme povolit zónu zásad odezvy uvnitř view
doložka.
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; }; }; };
Uložte a zavřete soubor. Poté upravte named.conf
soubor.
sudo nano /etc/bind/named.conf.default-zones
Vložte výchozí zóny do guest
zobrazit.
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"; }; ..... ..... };
Uložte a zavřete soubor. Spuštěním následujícího příkazu zkontrolujte, zda v konfiguračním souboru nejsou syntaktické chyby. Tichý výstup znamená, že nebyly nalezeny žádné chyby.
sudo named-checkconf
Pokud nejsou nalezeny žádné chyby, restartujte BIND9, aby se změny projevily.
sudo systemctl restart bind9