Una delle modalità più diffuse per effettuare failover su un servizio secondario, ad esempio in caso di Disaster Recovery, consiste nell’utilizzo di record DNS dinamici.
Quando si tratta di DNS pubblico, CloudFlare mette a disposizione ad un prezzo contenuto il servizio di Load Balancing che integra la funzionalità di DNS steering in caso di failover.
Quando, però, si necessita di utilizzare records dinamici sul DNS interno è necessario fare affidamento a prodotti on-premise.
In questo articolo verranno mostrati gli step di installazione e configurazione di base di un cluster PowerDNS con backend Bind e la creazione di records dinamici tramite LUA.
PREREQUISITI
La procedura in questo articolo è stata eseguita su due server Debian 12.
È necessario che entrambi i server PowerDNS possano contattare i servizi di cui devono gestire i records dinamici.
Se si vuole creare un cluster PowerDNS è necessario che i due servers possano contattarsi a vicenda sulla porta 53 TCP e UDP.
INSTALLAZIONE DI POWERDNS
I passaggi eseguiti in questo paragrafo devono essere eseguiti sia sul server master che sui server in replica.
Aggiornare i repositories:
0 |
apt update |
Installare PowerDNS con backend Bind:
0 |
apt install pdns-server pdns-backend-bind -y |
CONFIGURAZIONE DEL BACKEND BIND SUL MASTER
Creare la directory per la configurazione delle zone:
0 |
mkdir -p /etc/powerdns/bind |
Aggiungere il file /etc/powerdns/bind/pizza.dynamic.zone con il seguente contenuto:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$TTL 60 ; Static records @ IN SOA ns1.pizza.dynamic. admin.pizza.com. ( 2025042601 ; serial 300 ; refresh 60 ; retry 604800 ; expire 60 ; minimum ) @ IN NS ns1.pizza.dynamic. @ IN NS ns2.pizza.dynamic. ns1 IN A 10.10.160.44 ns2 IN A 10.10.160.45 ; Dynamic records test1 IN LUA A "ifportup(8080, {'10.10.170.245', '10.10.170.246'})" ; active-active test2 IN LUA A "ifportup(8080, {{'10.10.170.245'}, {'10.10.170.246'}})" ; active-passive (only from v4.8-beta1) test3 IN LUA A "ifurlup('http://10.10.170.245:8080/', {{'10.10.170.245'}, {'10.10.170.246'}})" ; active-passive |
Nella configurazione precedente si assume che 10.10.170.245 e 10.10.170.246 siano gli IP di due web server in ascolto sulla porta 8080 e che il server con IP 10.10.170.245 sia il primario.
I due web server si trovano sulla stessa rete, ma questo non è un requisito, basta che PowerDNS possa contattarli entrambi.
Inoltre, “10.10.160.44” è l’IP del server PowerDNS master, “10.10.160.45” è l’IP del server PowerDNS in replica ed è stato utilizzato “pizza.dynamic” come nome della zona.
L’FQDN “admin.pizza.com” identifica il recapito email per la zona, è possibile specificare una qualsiasi email, a patto di sostituire la @ con un punto.
I timers nel record SOA sono indicati in secondi, in particolare bisogna tenere in considerazione il valore per “expire” (1 settimana), dopo tale scadenza il server DNS in replica considerà i records non più validi e smetterà di rispondere; per evitare che i records DNS scadano è necessario che il server in replica contatti il server master almeno una volta prima della scadenza; è sconsigliato incrementare oltre alla settimana il timer “expire”.
Se non si volesse formare un cluster, sarebbe possibile configurare solamente un name server (record NS e relativo record A).
Il record “test1” viene risolto secondo la topologia “active-active” e perciò viene selezionato in modo random un IP dal gruppo fornito nel record.
I records “test2” e “test3”, invece, vengono risolti secondo la topologia “active-passive” e perciò verrà utilizzato l’IP appartenente al secondo gruppo (10.10.170.246) solo se l’IP del server primario (quello nel primo gruppo) non risponde correttamente.
Nello specifico i records “test1” e “test2” utilizzano come health check un controllo sulla porta (in questo caso la 8080); il record “test3”, invece, verifica lo stato di salute del servizio interrogando l’URL fornito come primo parametro e perciò non verifica lo stato di salute dei singoli server (quelli a cui appartengono gli IP dei gruppi).
Affinchè “ifurlup” consideri sano il primo gruppo di IP è necessario PowerDNS riceva come risposta all’URL indicato come primo parametro 200 come response code.
L’utilizzo di “ifportup” e più versatile rispetto a “ifurlup” poichè non necessita di un endpoint HTTP per effettuare gli health checks, tuttavia la possibiltà di specificare due gruppi con priorità diversa (topologia “active-passive”) è stata introdotta in una versione successiva rispetto a quella distribuita tramite package manager di Debian 12.
CONFIGURAZIONE DI POWERDNS SUL MASTER
Aggiungere nel file /etc/powerdns/named.conf la seguente configurazione:
0 1 2 3 |
zone "pizza.dynamic" { type master; file "/etc/powerdns/bind/pizza.dynamic.zone"; }; |
Abilitare l’utilizzo di records LUA nel file /etc/powerdns/pdns.conf modificando o aggiungendo la seguente riga:
0 |
enable-lua-records=yes |
Inoltre, per configurare la replica, è necessario modificare o aggiungere le seguenti configurazioni nel file /etc/powerdns/pdns.conf (solo se si vuole formare un cluster):
0 1 2 3 4 |
allow-axfr-ips=10.10.160.45 also-notify=10.10.160.45 disable-axfr=no master=yes slave=no |
Modificare “10.10.160.45” con l’IP del server PowerDNS in replica.
AVVIARE ED ABILITARE IL SERVIZIO
Riavviare il servizio PowerDNS:
0 |
systemctl restart pdns |
Se viene mostrato un errore è possibile che siano presenti degli errori di permessi.
Analizzare i logs con il seguente comando:
0 |
journalctl -xeu pdns.service |
Se viene mostrato un errore come il seguente significa che potrebbero essere presenti dei problemi con i permessi:
0 1 |
Apr 26 00:30:46 Unable to open /etc/powerdns/pdns.conf Apr 26 00:30:46 PDNS01-SRV pdns_server[26346]: Unable to launch, no backends configured for querying |
In questo caso correggere il gruppo a cui appartiene il file di configurazione di PowerDNS:
0 |
chown root:pdns /etc/powerdns/pdns.conf |
Verificare che gli errori siano stati corretti riavviando il serivzio nuovamente:
0 |
systemctl restart pdns |
Infine, abilitare il servizio:
0 |
systemctl enable pdns |
VERIFICARE IL FUNZIONAMENTO
Per verificare il funzionamento di un record DNS è possibile eseguire il seguente comando:
0 |
nslookup test0.pizza.dynamic 127.0.0.1 |
In caso di errore di configurazione potrebbe venir mostrato il codice “SERVFAIL”.
Per monitorare l’aggiornamento di un record DNS durante un test di failover è possibile utilizzare “watch”:
0 |
watch -n1 nslookup test0.pizza.dynamic 127.0.0.1 |
CONFIGURAZIONE DI UN SERVER POWERDNS IN REPLICA
PowerDNS integra nativamente la replica, perciò è possibile configurare uno o più servers slaves che verranno automaticamente sincronizzati con il master.
Sul server in replica eseguire gli step descritti nei capitoli INSTALLAZIONE DI POWERDNS e AVVIARE ED ABILITARE IL SERVIZIO per installare PowerDNS.
I passaggi mostrati in questo paragrafo bisogna eseguirli solo sul server in replica.
Creare la struttura di directories necessarie ed assegnare loro i permessi:
0 1 2 |
mkdir -p /var/lib/pdns/slaves chown pdns:pdns /var/lib/pdns/slaves chmod 755 /var/lib/pdns/slaves |
Aggiungere nel file /etc/powerdns/named.conf la seguente configurazione:
0 1 2 3 4 |
zone "pizza.dynamic" { type slave; file "/var/lib/pdns/slaves/pizza.dynamic.zone"; masters { 10.10.160.44; }; }; |
Sostituire “10.10.160.44” con l’IP del server master.
Modificare o aggiungere le seguenti configurazioni nel file /etc/powerdns/pdns.conf:
0 1 2 3 4 5 |
allow-notify-from=10.10.160.44 disable-axfr=no enable-lua-records=yes master=no slave=yes slave-cycle-interval=60 |
Assicurarsi di aver aggiunto le configurazioni necessarie per la replica sul server master.
Riavviare il servizio PowerDNS:
0 |
systemctl restart pdns.service |
Infine, verificare nei logs che la replica sia stata effettuata:
0 |
journalctl -xeu pdns.service | grep AXFR |
Per forzare la replica, è possibile eseguire il seguente comando sul server secondario:
0 |
pdns_control retrieve pizza.dynamic |
Se si effettuano modifiche alla zona sul primario, assicurarsi di modificare il seriale della configurazione, che tipicamente è nel formato YYYYMMDDXX, dove YYYY è l’anno, MM il mese, DD il giorno e XX un numero incrementale (esempio 2025042601).
CONFIGURAZIONE DEI CONDITIONAL FORWARDERS
Per integrare PowerDNS con la propria infrastruttura DNS è possibile creare una zona con conditional forwarder verso i server installati durante i passaggi dei paragrafi precedenti.
A scopo dimostrativo verrà descritto come effettuare la procedura con dei server DNS Windows integrati con Active Directory, tuttavia è possibile configurare i conditional forwarder sulla maggior parte dei server DNS.
Accedere allo snap-in DNS Manager, selezionare Conditional Forwarders, effettuare click con il tasto destro e navigare su New Conditional Forwarder….
Assegnare il nome DNS alla zona e aggiungere gli IP dei servers PowerDNS, inoltre, è possibile abilitare la replica sui server DNS appartenenti alla foresta Active Directory:
Salvare cliccando su Ok e verificare da CMD o PowerShell con nslookup il funzionamento dei records dinamici.
0 commenti