Sostituzione di alcune voci DNS in BIND per reti interne


39

Ho una rete interna con un server DNS che esegue BIND, connesso a Internet tramite un singolo gateway. Il mio dominio "example.com" è gestito da un provider DNS esterno. Alcune delle voci in quel dominio, ad esempio "host1.example.com" e "host2.example.com", così come la voce di livello superiore "example.com", indicano l'indirizzo IP pubblico del gateway.

Vorrei che gli host situati sulla rete interna risolvessero "host1.example.com", "host2.example.com" e "example.com" in indirizzi IP interni anziché in quello del gateway. Altri host come "otherhost.example.com" dovrebbero essere risolti dal provider DNS esterno.

Sono riuscito a farlo per le voci host1 e host2, definendo due zone a voce singola in BIND per "host1.example.com" e "host2.example.com". Tuttavia, se aggiungo una zona per "esempio.com", tutte le query per quel dominio vengono risolte dal mio server DNS locale e, ad esempio, la query "altrohost.esempio.com" genera un errore.

È possibile configurare BIND per sovrascrivere solo alcune voci di un dominio e risolvere il resto in modo ricorsivo?



1
"È possibile configurare BIND per sovrascrivere solo alcune voci di un dominio?" No, non con BIND. Usa un sottodominio.
Bortzmeyer,

1
Unbound sembra fare esattamente quello che ho chiesto, quindi sto impostando la risposta di Alnitak come risposta accettata. Ma alla fine seguirò il consiglio di bortzmeyer e non ignorerò la voce di dominio. Grazie per tutte le risposte!
Remy Blank,

1
Ora Bind può farlo con la policy policy di risposta. Vedi la mia risposta qui sotto. Altre soluzioni come Unbound non possono ignorare i CNAME. Con le zone politiche in Bind, non è necessario eseguire sottodomini; puoi semplicemente sostituire i singoli record a piacimento.
Florin Andrei,

Risposte:


18

Il metodo migliore è tramite la policy zone di risposta in Bind 9.8.1 o successive. Ti consente di sovrascrivere singoli record in zone arbitrarie (e non è necessario creare un intero sottodominio per quello, solo il singolo record che desideri modificare), ti consente di sovrascrivere CNAME, ecc. Altre soluzioni come Unbound non possono ignorare i CNAME .

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


EDIT: Facciamolo correttamente allora. Documenterò ciò che ho fatto sulla base del tutorial sopra linkato.

Il mio sistema operativo è Raspbian 4.4 per Raspberry Pi, ma la tecnica dovrebbe funzionare senza modifiche su Debian e Ubuntu o con modifiche minime su altre piattaforme.

Vai a dove sono conservati i tuoi file di configurazione di Bind sul tuo sistema - eccolo qui /etc/bind. Crea lì un file chiamato db.rpzcon i seguenti contenuti:

$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.

Che cosa fa?

  • sovrascrive l'indirizzo IP per www.some-website.comcon l'indirizzo falso 127.0.0.1, inviando effettivamente tutto il traffico per quel sito all'indirizzo di loopback
  • invia il traffico www.other-website.comverso un altro sito chiamatofake-hostname.com

Tutto ciò che potrebbe andare in un file di zona Bind è possibile utilizzare qui.

Per attivare queste modifiche ci sono alcuni altri passaggi:

Modifica named.conf.locale aggiungi questa sezione:

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

Il tutorial sopra linkato ti dice di aggiungere più cose zone "rpz" { }ma non è necessario in semplici configurazioni - quello che ho mostrato qui è il minimo per farlo funzionare sul tuo resolver locale.

Modifica named.conf.optionse da qualche parte nella options { }sezione aggiungi l' response-policyopzione:

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

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

Ora riavvia Bind:

service bind9 restart

Questo è tutto. Il nameserver dovrebbe iniziare a sovrascrivere questi record ora.

Se è necessario apportare modifiche, è sufficiente modificarlo db.rpz, quindi riavviare nuovamente Bind.

Bonus: se si desidera registrare le query DNS su syslog, in modo da poter tenere d'occhio il procedimento, modificare named.conf.locale assicurarsi che ci sia una loggingsezione che includa queste dichiarazioni:

logging {
    // stuff
    // already
    // there

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

Riavvia nuovamente Bind e il gioco è fatto.

Provalo sulla macchina che esegue Bind:

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

Se si esegue scavare su un altro computer, utilizzare semplicemente @ l'indirizzo-IP-di-Bind-server anziché @ 127.0.0.1

Ho usato questa tecnica con grande successo per ignorare il CNAME per un sito Web su cui stavo lavorando, inviandolo a un nuovo bilanciamento del carico AWS che stavo solo testando. Un Raspberry Pi è stato usato per eseguire Bind, e l'RPi è stato anche configurato per funzionare come router WiFi, quindi collegando i dispositivi all'SSID in esecuzione sull'RPi avrei ottenuto le sostituzioni DNS necessarie per il test.


1
Si noti che BIND RPZ non può effettivamente (ancora) sovrascrivere i singoli record in base al QTYPE - sostituirà tutti i record per un determinato nome del proprietario. Ciò significa che se si desidera sovrascrivere il record A per un dominio, ma non ad esempio il record MX, non è possibile. Devi mettere anche il record MX nella zona RPZ e tenerlo sincronizzato con la zona reale.
Alnitak,

2
Grazie per averlo analizzato come hai fatto tu. Molto utile.
Sruffell,

Ci sono avvertenze? Sto cercando di farlo su un pfsense, ma non riesco a "falsificare" alcun risultato, riporta comunque il vero indirizzo. Credo di aver seguito le istruzioni alla lettera.
Lenne,

@Lenne Dovrebbe solo funzionare. Ho modificato il post e aggiunto un suggerimento per testare le modifiche.
Florin Andrei,

@Lenne il pacchetto bind pfSense ha questo integrato nella GUI da circa un anno, quindi non dovrebbe essere necessario confondere con le configurazioni . OP: potrebbe valere la pena menzionare alcune delle altre cose che puoi fare con un RPZ come rispondere con NXDOMAIN o semplicemente abbandonare la risposta.
miken32

21

Il server DNS ricorsivo non associato ha la possibilità di sovrascrivere i singoli record di risorse.

Guarda le local-zonee local-dataimpostazioni di configurazione nel manuale , ad esempio:

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

L' transparentimpostazione su local-zoneindica di eseguire normali ricerche ricorsive per tutti i nomi non forniti local-data.


1
Sembra essere esattamente quello che voglio fare, grazie. Stasera leggerò su Unbound.
Remy Blank,

D'altra parte, la saggezza è abbastanza discutibile. Avere un dominio internal.example.com sarebbe più chiaro.
Bortzmeyer,

@Bortzmeyer - potresti avere ragione, ma non immagino che Wouter lo abbia messo solo per divertimento ;-)
Alnitak,

3
@bortzmeyer, a volte non c'è scelta. Esempio: SBS 2008 deve avere un singolo IP LAN, ma deve essere raggiunto dall'esterno utilizzando un IP esterno che il router sta inoltrando. Microsoft non consente due schede di rete su SBS, né due IP configurati sulla stessa scheda. Se i server locali risolvono il nome DNS sull'IP esterno, il router deve eseguire sia DNAT che SNAT per gli IP LAN, quindi i log su SBS mostreranno tutto l'accesso dall'IP del router, e questo è semplicemente sbagliato. Installerò unboundsul mio router, penso che la soluzione sia molto migliore.
Cosmin Prund,

Questo non risponde alla domanda, poiché la domanda è specifica di BIND.
bzeaman,

4

Potresti voler esaminare "dnsmasq", che ti consente di fare alcune cose piuttosto intelligenti con una risoluzione ottimizzata.


Grazie, buon consiglio. Peccato che dnsmasq non abbia una risoluzione ricorsiva, quindi dovrò comunque eseguire BIND su un'altra porta (i server DNS del mio ISP sono flakey).
Remy Blank,

4

Quello che stai cercando è DNS diviso, che è definito da Webopedia come:

In un'infrastruttura DNS divisa, si creano due zone per lo stesso dominio, una da utilizzare dalla rete interna, l'altra utilizzata dalla rete esterna. Il DNS diviso indirizza gli host interni a un server dei nomi di dominio interno per la risoluzione dei nomi e gli host esterni vengono indirizzati a un server dei nomi di dominio esterno per la risoluzione dei nomi.

In sostanza, dovrai creare una copia del file della tua zona esterna e sostenerlo sul tuo server DNS interno, quindi modificare o aggiungere i record necessari specificamente per la tua rete interna. Questa è una configurazione piuttosto comune, anche se può essere un problema mantenere sincronizzati i record "esterni" tra i due server DNS. Se si crea o si modifica un record sul server pubblico, sarà anche necessario crearlo o modificarlo sul server privato.

Questo può essere implementato indipendentemente dall'implementazione del server DNS che usi. Nella maggior parte delle configurazioni, avrai un server DNS che serve la rete esterna e uno diverso che serve la rete interna. Con BIND, come possibilmente altre implementazioni, è possibile avere entrambe le versioni della zona sullo stesso server tramite l'uso dell'istruzione "allow-query" all'interno della sezione della zona del file named.conf.

Un'altra possibilità su BIND (e non l'ho mai provato) sarebbe quella di impostare il tuo dominio example.com sul server DNS interno con solo i record che usi internamente. Quindi, imposta un'istruzione "forward" con l'argomento "first" (insieme a "forwarder"). In teoria, questo richiederebbe una risposta al server DNS esterno (come impostato in "server d'inoltro", che non avrebbe i tuoi record interni e restituirebbe una risposta di errore. Quindi, il server interno cercherebbe una risposta. sicuro che funzionerebbe, ma è un pensiero.


Mantenere sincronizzati i due file di zona sarà complicato, poiché quello esterno viene aggiornato tramite un client DNS dinamico. Leggerò sulla dichiarazione in avanti, però. Grazie per il consiglio.
Remy Blank,

No, l'inoltro BIND non funzionerà, sarà solo per domini sconosciuti ma il server dei nomi interno conoscerà example.com, sarà autorevole per questo.
Bortzmeyer,

1
Se sto leggendo correttamente la documentazione, l'istruzione "forward first" all'interno di una sezione di zona dovrebbe dire a BIND di uscire e cercare una risposta allo spedizioniere anche per un dominio locale autorevole, quindi utilizzare le informazioni locali solo se può ' ottenere una risposta dallo spedizioniere.
Justin Scott,

Se metti un "inoltra prima" globale, invierà le query allo spedizioniere e, in caso contrario, tenterà di rispondere alla query "(dal documento), ma se riceve una risposta, non tenterà di risolversi. Sarebbe bello se potessi forzare a risolvere se la risposta non è autorevole o anche se si tratta di un NXDOMAIN, ma il bind non tenterà se ottiene una risposta dallo spedizioniere.
Pablo Martinez,

3

In BIND ottengo questi risultati definendo una zona usando il nome host desiderato. L'approccio va bene se si desidera sovrascrivere solo alcuni host.

La mia dichiarazione di zona è simile alla seguente:

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

La definizione della mia zona è simile alla seguente:

$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

Pertanto, se eseguo una query su example.com su DNS Intranet e DNS ISP, ottengo lo stesso IP, ma se eseguo una query su override.example.com, ottengo risultati diversi se il DNS Intranet (primario) è accessibile.


2

Sei già sulla buona strada.

Sui tuoi server DNS interni, dovrai definire una zona per ogni host di eccezione immediatamente sotto "example.com". Per ridurre al minimo queste eccezioni, è pratica comune denominare tutte le macchine interne "hosta.internal.example.com", con il server DNS che invia la maggior parte delle query a server DNS esterni, ma autorevole per la zona "internal.example.com". (Una volta superate le piccole operazioni, di solito c'è un paio di server DNS a cui sono indirizzati i client e un DNS autorevole separato a cui sono server diretti per "internal.example.com".)

Di solito, è solo quando un host deve essere raggiungibile sia esternamente che internamente che vengono create le eccezioni che descrivi. Anche allora, potresti voler usare "host1.example.com" dall'esterno e "host1.internal.example.com" dall'interno. Gli host interni vengono configurati per cercare nomi all'interno di "internal.example.com". Esistono situazioni in cui ciò che stai già facendo è appropriato, ad esempio se il certificato per un server identifica il server come "host1.example.com", nel qual caso desideri che sia il nome a cui si connettono i client.


Sì, per gli host "host1.example.com", funziona già bene. La parte difficile è gestire il "esempio.com" di alto livello allo stesso modo ...
Remy Blank

2

L'uso di dnsmasq lo rende davvero semplice. http://www.thekelleys.org.uk/dnsmasq/doc.html Funziona come il server DNS ma ottiene risposte dal server DNS locale. La cosa bella è che puoi sovrascrivere i record di un singolo dominio senza fare confusione con i file di zona


2

È un dato di fatto che esiste un altro modo, anche se forse leggermente diverso, per farlo. Ho la stessa situazione, ho un dominio che viene utilizzato esternamente e internamente e ho host statici e dinamici esterni. Le uniche veramente dolorose sono quelle dinamiche esterne. La soluzione non è forse la più elegante, ma implementabile con un piccolo script. Principalmente sto facendo il mio script DNS dinamico con l'API del mio provider DNS dinamico, eseguo questo script cron, ogni 5 minuti:

1) ottieni il mio IP esterno. è cambiato? Uscita Vietata.

2) IP modificato, chiamare l'API del provider dyndns, con il nuovo indirizzo IP,

3) sed il db.mydomain.com con l'IP esterno

4) riavvia il bind.

Funziona in modo molto affidabile per la mia rete domestica


Lo stesso processo fatto da me. si prega di trovare i dettagli nel nostro wiki Stealth Name Server . Ma incapace di risolvere dyn.dev.shahed.bizdal mondo! Potresti aiutarci per risolvere questo problema?
Md Shahed Hossain, il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.