BIND: Configurazione delle Viste (view) DNS in Chroot
Premessa
Prima di iniziare a descrivere la configurazione DNS a viste (view) con BIND in ambiente Chroot, già anticipata nell’articolo BIND e Chroot: Compilazione e installazione occorre descrivere cosa sono le viste (view) DNS e perchè si utilizzano.
Cosa sono le viste in BIND?
La configurazione delle viste in BIND consente di gestire in modo più flessibile le risoluzioni DNS, permettendo di fornire risposte differenti a query provenienti da fonti differenti. Questa funzionalità è particolarmente utile negli scenari complessi, come reti aziendali o ISP, dove è necessario gestire accessi in modo granulare ai dati DNS; permettono di definire diverse configurazioni di zone per diverse categorie di client. Ogni vista può avere record DNS distinti, e il server DNS restituisce la risposta corretta in base all’indirizzo IP del client che fa la richiesta.
Facendo l’esempio della Società che possiede più BU (Business Unit) distribuite sul territorio, ciascuna con il proprio ramo di rete (branch), con il proprio server CMS posto all’interno del datacenter della Società, potrebbero entrambi usare la stessa URL (cms.esempio.com), per terminare su server differenti, così per gli utenti VPN di ciascuna BU, mentre per gli utenti internet, la richiesta di accesso alla medesima URL potrebbe terminare sul CMS della società.
Realizzazione di una configurazione di esempio
Nei passaggi seguenti, saranno indicati percorsi, che saranno implicitamente, ricondotti alla root jail, creata dello script pubblicato nell’articolo “Bind e Chroot: Compilazione e Installazione“; La sostanza non cambia, per coloro che desiderassero effettuare una installazione senza root jail, che dovranno solo modificare il percorso dei file adattandoli al proprio ambiente.
File e directory principali
L’elenco delle directory della root jail è questo;
[root@fe01 ~]# cd /jail/named [root@fe01 named]# ls -l total 0 drwxr-xr-x 2 named named 59 Oct 2 12:08 dev drwxr-xr-x 2 named named 23 Oct 2 12:08 etc drwxr-xr-x 2 named named 6 Oct 2 12:08 master drwxr-xr-x 2 named named 6 Oct 2 12:08 reverse drwxr-xr-x 2 named named 6 Oct 2 12:08 slave drwxr-xr-x 4 named named 31 Oct 2 12:08 usr drwxr-xr-x 6 named named 53 Oct 2 12:08 var
[root@fe01 named]# cd etc/ [root@fe01 etc]# ls -l total 36 -rw-r--r-- 1 named named 2641 Oct 2 12:08 localtime -rw-r--r-- 1 named named 1277 Oct 2 17:07 named.acl -rw-r--r-- 1 named named 4532 Oct 2 17:04 named.conf -rw-r--r-- 1 named named 2839 Oct 2 16:46 named.logger -rw-r--r-- 1 named named 441 Oct 2 16:47 rndc.key
Il file fondamentale per il funzionamento di BIND è il named.conf che deve trovarsi nella directory /etc e può contenere tutta la configurazione oppure essere suddivisa in più file, per una migliore gestione.
In questo esempio, suddivideremo la configurazione, anche per aiutare a comprendere ciascun contesto; spiegheremo i punti salienti per aiutare a comprendere il concetto di vista (view), senza entrare nel merito di ciascuna istruzione, che potrà essere verificata nella documentazione ufficiale;
Esempio di file named.conf
# ----------------------------------------------------------------------------- # - Zone file name : named.conf # - Author : NM # - DNS administrator : NM # - Create : 02.10.2024 # - Last Update : 02.10.2024 # - Description : File di configurazione BIND su Linux Almalinux 9.2 # - Position : /etc # - Info : # - Note : NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE # ---------------------------------------------------------------------------- Include "/etc/named.acl"; Include "/etc/named.logger"; #Include "/etc/rndc.key"; options { directory "/"; // Size of the sent packets max-udp-size 4096; // Size of received packets edns-udp-size 4096; listen-on { 127.0.0.1; 172.16.60.40; }; dnssec-validation no; max-cache-size 1024M; // 25% of MEM max-cache-ttl 60; // limit cached record to a 60s TTL max-ncache-ttl 60; // limit cache neg. resp. to a 60s TTL version "My Name is Bind, James Bind"; forward first; forwarders { 8.8.8.8; 1.1.1.1; }; // da commentare con uso di root.hints // forwarders { IP.1.DNS.PROVIDER; IP.2.DNS.PROVIDER; }; // da commentare con uso di root.hints pid-file "/var/run/named.pid"; dump-file "/var/dump/named.db"; statistics-file "/var/stats/named.stats"; transfers-in 100; transfers-out 100; // datasize 20M; allow-transfer { none; }; allow-recursion { net-internals; }; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; statistics-channels { inet 127.0.0.1 port 9999 allow { 127.0.0.1; }; }; view "internal" { match-clients { !net-externals; net-internals; localhost; }; allow-query { localhost; net-internals; }; zone "." { type hint; file "root.hints"; }; zone "localhost" { type master; file "master/localhost/localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" { type master; file "reverse/127.0.0.in-addr.arpa.zone"; allow-update { none; }; }; zone "60.16.172.in-addr.arpa.zone" { type master; file "reverse/172.16.60.in-addr.arpa.zone"; allow-update { none; }; }; zone "esempio.com" { type master; file "master/esempio.com/int.esempio.com.zone"; allow-update { none; }; }; zone "solutioncafe.it" { type master; file "master/solutioncafe.it/int.solutioncafe.it.zone"; allow-update { none; }; }; // FORWARD zone "esempio.loc" { type forward; forwarders { 192.168.58.4; }; forward only ; }; zone "8.10.10.in-addr.arpa" { type forward; forwarders { 10.10.100.1; }; forward only ; }; zone "7.10.10.in-addr.arpa" { type forward; forwarders { 10.10.100.1; }; forward only ; }; }; // end internal view view "external" { match-clients { any; }; allow-recursion { net-externals; }; allow-query { any; }; zone "esempio.com" { type master; file "master/esempio.com/ext.esempio.com.zone"; allow-query { any; }; }; zone "solutioncafe.it" { type master; file "master/solutioncafe.it/ext.solutioncafe.it.zone"; allow-query { any; }; }; }; // end external view
descrizione: il file named.conf di esempio, si divide in:
configurazione globale: contiene la configurazione globale del server DNS;
- listen-on { 127.0.0.1; x.x.x.x; }; riferisce con quali indirizzo/i dell’ host erogare il servizio.
- forwarders { x.x.x.x; y.y.y.y; }; riferisce a quale indirizzo/i inoltrare le richieste che non può risolvere in autonomia (last resort ).
view “internals”: contiene la lista dei nomi dei file di zona per ciascun dominio per il quale il DNS è autoritativo.
- match-clients { !net-externals; net-internals; localhost; }; si riferisce a quali gruppi di IP (clients) possono accedere a questa vista, in questo caso è negato l’accesso (!) al gruppo net-externals è invece permesso al gruppo net-internals e localhost;
- allow-query { localhost; net-internals; }; si riferisce a quali gruppi di IP (clients) che possono effettuare query alle zone per domini di questa vista.
- zone “.” si riferisce al dominio . (root); il file contiene la lista dei root DNS ai quale inoltrare le richieste che il DNS non può risolvere in autonomia; sostituisce i forwarders visti in precedenza qualora si abbia la possibilità di esporre a internet il DNS.
- // FORWARD alla linea (linea 100), indica un gruppo di domini, per i quali non esiste il file di configurazione, ma la cui risoluzione deve essere inoltrata a un forwarders { x.x.x.x; }; specifico per ciascun dominio dell’elenco ed è diverso dagli indirizzi dei forwarders globali; questa tecnica è chiamata forwarding condizionale.
view “esternals”: contiene la lista dei nomi dei file di zona per ciascun dominio per il quale il DNS è autoritativo;
- match-clients { any; }; si riferisce a IP (clients) possono accedere a questa vista, in questo caso qualsiasi IP;
- allow-recursion { net-externals; }; indica che le query ricorsive, possono essere fatte solo dalle reti interne.
Il numero di viste è arbitrario, in questa configurazione mi sono limitato a specificarne due, per non complicare troppo l’esposizione.
Esempio di file named.acl
# ----------------------------------------------------------------------------- # - Zone file name : named.acl # - Author : NM # - DNS administrator : NM # - Create : 02.10.2024 # - Last Update : 02.10.2024 # - Description : File di configurazione BIND Almalinux 9.2 # - Position : /jail/named/etc # - note : NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE # ---------------------------------------------------------------------------- // acl's "localhost", "none", "any", "localnets" are built-in in BIND // NOTE: "localnets" --> matches all the IP address(es) and subnetmasks of the server on which BIND is installed acl "host-vpn-vps" { 172.16.89.5/32; }; acl "net-vpn-roadwarrior" { 172.16.88.0/25; }; acl "net-office" { 10.10.7.0/27; 10.10.8.0/27; 172.16.60.32/27; }; acl "net-internals" { 127.0.0.1; localhost; net-office; host-vpn-vps; net-vpn-roadwarrior; }; acl "net-externals" { 5.2.22.56/29; ### RETE PUBBLICA 15.235.197.206/32; ### HOST VPS (ipv4) 2402:1f00:8000:800::19be; ### HOST VPS (ipv6) };
descrizione: Il file acl, raggruppa indirizzi IP di reti e host, poi utilizzati nel file named.conf per “condizionare” il comportamento del flusso di richieste; il file contiene tre gruppi in cui sono elencati i relativi indirizzi IP che vengono poi aggiunti, utilizzando il nome specifico, a ulteriori due gruppi che saranno, poi, utilizzati nelle viste.
La scelta di creare tre gruppi da confluire in ulteriori due gruppi, potrebbe sembrare inutile, ma la gestione granulare, realizzata in questo modo, agevola di molto leggibilità e di conseguenza la manutenzione, soprattutto i numero di reti da gestire è elevato; in ogni caso, nulla vieta di creare solo il gruppo da utilizzare nella vista (in questo caso due).
Esempio di file named.logger
# ----------------------------------------------------------------------------- # - Zone file name : named.logger # - Author : NM # - DNS administrator : NM # - Create : 02.10.2024 # - Last Update : 02.10.2024 # - Description : File di configurazione BIND Almalinux 9.2 # - Position : /jail/named/etc # - note : NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE # ---------------------------------------------------------------------------- // defaults to use 7 files in rotation // BIND 9.x parses the whole file before using the log // failure messages up to this point are in (syslog) /var/log/messages logging { channel log-syslog { syslog daemon; severity info; }; channel log-config { file "var/log/config.log" versions 99 size 10M; severity info; print-severity yes; print-time yes; print-category yes; }; channel log-client { file "var/log/client.log" versions 99 size 10M; severity info; print-severity yes; print-time yes; print-category yes; }; channel log-query { file "var/log/query.log" versions 99 size 20M; severity info; print-severity yes; print-time yes; print-category yes; }; channel log-security { file "var/log/security.log" versions 99 size 10M; severity info; print-severity yes; print-time yes; print-category yes; }; channel log-xfer-in { file "/var/log/xfer-in.log" versions 99 size 10M; severity info; print-severity yes; print-time yes; print-category yes; }; channel log-xfer-out { file "/var/log/xfer-out.log" versions 99 size 10M; severity info; print-severity yes; print-time yes; print-category yes; }; category config { log-syslog; }; category client { log-client; }; category queries { log-query; }; category security { log-security; }; category xfer-in { log-xfer-in; }; category xfer-out { log-xfer-out; }; };
descrizione: nel file named.logger sono definite le regole di logging, il file di esempio permette la gestione separata per ciascuno dei sette canali implementato da BIND in modo di raccogliere le informazioni in modo granulare.
Esempio di file della zona interna (int.esempio.com.zone)
;# ----------------------------------------------------------------------------- ;# - Zone file name : int.esempio.com.zone ;# - Author : NM ;# - DNS administrator : NM ;# - Create : 02.10.2024 ;# - Last Update : 03.10.2024 ;# - Description : file per la zona esempio.com ;# - Position : /master/esempio.com ;# - Info : ;# - Note : NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE ;# ---------------------------------------------------------------------------- $TTL 86400 @ IN SOA ns1.esempio.com. admin.esempio.com. ( 2024100201 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ) ; Negative Cache TTL ; @ IN NS ns1.esempio.com. @ IN A 192.168.1.10 ns1 IN A 172.16.60.40 www IN A 192.168.1.10 mail IN A 192.168.1.11 smtp IN CNAME mail
Esempio di file della zona esterna (ext.esempio.com.zone)
;# ----------------------------------------------------------------------------- ;# - Zone file name : ext.esempio.com.zone ;# - Author : NM ;# - DNS administrator : NM ;# - Create : 02.10.2024 ;# - Last Update : 03.10.2024 ;# - Description : file per la zona esempio.com ;# - Position : named/master/esempio.com ;# - Info : ;# - Note : NON modificare senza AUTORIZZAZIONE dell'AMMINISTRATORE ;# ---------------------------------------------------------------------------- $TTL 86400 @ IN SOA ns1.esempio.com. admin.esempio.com. ( 2024100201 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ) ; Negative Cache TTL ; @ IN NS ns1.esempio.com. @ IN A 203.0.113.10 ns1 IN A 203.0.113.10 www IN A 203.0.113.10 mail IN A 203.0.113.11 smtp IN CNAME smtp.myprovider.com.
Avvio del server DNS
tips & tricks
Per controllare che non ci siano errori di sintassi nel file named.conf, eseguite:
/usr/local/named/bin/named-checkconf -t /jail/named /etc/named.conf
Assegnazione dei permessi corretti a tutti i file nella root jail
chown -R named:named /jail/named
Avvio del server
systemctl restart named
Un’occhiata al log messages
tail -f /var/log/messages
Oct 2 21:18:01 fe01 named[4110]: automatic empty zone: view external: EMPTY.AS112.ARPA
Oct 2 21:18:01 fe01 named[4110]: automatic empty zone: view external: HOME.ARPA
Oct 2 21:18:01 fe01 named[4110]: automatic empty zone: view external: RESOLVER.ARPA
Oct 2 21:18:01 fe01 named[4110]: command channel listening on 127.0.0.1#953
Oct 2 21:18:01 fe01 named[4110]: managed-keys-zone/internal: loaded serial 0
Oct 2 21:18:01 fe01 named[4110]: managed-keys-zone/external: loaded serial 0
Oct 2 21:18:01 fe01 named[4110]: zone esempio.com/IN/internal: loaded serial 2024100201
Oct 2 21:18:01 fe01 named[4110]: zone esempio.com/IN/external: loaded serial 2024100201
Oct 2 21:18:01 fe01 named[4110]: all zones loaded
Oct 2 21:18:01 fe01 named[4110]: running
Verifica del processo
ps -ef |grep named
named 4110 1 0 21:18 ? 00:00:00 /usr/local/named/sbin/named -u named -t /jail/named -c /etc/named.conf -n 2
Prova di lookup, dal server dns stesso
[root@fe01 esempio.com]# nslookup > www.esempio.com Server: 172.16.60.40 Address: 172.16.60.40#53 Name: www.esempio.com Address: 192.168.1.10 >
Prova di lookup da un server diverso su rete diversa
[root@web01 named]# nslookup > www.esempio.com Server: 203.0.113.10 Address: 203.0.113.10#53 Name: www.esempio.com Address: 203.0.113.10 >
Considerazioni finali
La configurazione delle viste in BIND è uno strumento potente per gestire scenari DNS complessi, consentendo di personalizzare le risposte in base alle esigenze specifiche di diversi gruppi di client.