sviluppo-web-qa.it

Sostituzione di alcune voci DNS in BIND per reti interne

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", nonché la voce di livello superiore "esempio.com", indicano l'indirizzo IP pubblico del gateway.

Vorrei che gli host situati sulla rete interna risolvessero "Host1.example.com", "Host2.example.com" ed "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 es. la query "otherhost.example.com" genera un errore.

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

41
Remy Blank

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 sottodominio completo 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 dove sono conservati i tuoi file di configurazione di Bind sul tuo sistema - qui è in /etc/bind. Crea lì un file chiamato db.rpz con 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.com con l'indirizzo falso 127.0.0.1, inviando effettivamente tutto il traffico per quel sito all'indirizzo di loopback
  • invia traffico per www.other-website.com in un altro sito chiamato fake-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:

Modificare named.conf.local e aggiungi questa sezione:

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

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

Modificare named.conf.options e da qualche parte nel options { } sezione aggiungi il response-policy opzione:

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 devi apportare modifiche, modifica semplicemente db.rpz, quindi riavvia nuovamente Bind.

Bonus: se desideri registrare le query DNS su syslog, in modo da poter tenere d'occhio il procedimento, modifica named.conf.local e assicurati che ci sia una sezione logging che includa queste istruzioni:

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 esegui Dig su un altro computer, usa semplicemente @ the-ip-address-of-Bind-server invece di @ 127.0.0.1

Ho usato questa tecnica con grande successo per sostituire 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 configurato anche per funzionare come router WiFi, quindi collegando i dispositivi all'SSID in esecuzione sull'RPi avrei ottenuto le sostituzioni DNS necessarie per il test.

19
Florin Andrei

nbound server DNS ricorsivo ha la capacità di sovrascrivere i singoli record di risorse.

Guarda al local-zone e local-data impostazioni di configurazione nel manuale , ad es .:

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

L'impostazione transparent su local-zone gli dice di fare normali ricerche ricorsive per tutti i nomi non forniti con local-data.

21
Alnitak

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

4
Luke

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à necessario crearlo o modificarlo anche 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, ciò 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.

4
Justin Scott

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

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

3
srdjan

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

2
Dustin

È 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, chiamata 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

2
nico

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 questi sono server vengono indirizzati a "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 i nomi all'interno di "internal.example.com". Ci sono 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.

2