Creazione di un sistema DDNS con Bind: Difference between revisions

From RVM Wiki
Jump to navigation Jump to search
 
(12 intermediate revisions by the same user not shown)
Line 1: Line 1:
E' possibile creare un sistema DDNS di aggiornamento dinamico dei nomi DNS con Bind 9.x, usando l'utility nsupdate da linux.
E' possibile creare un sistema DDNS di aggiornamento dinamico dei nomi DNS con Bind 9.x, usando l'utility nsupdate da linux.


==Preparazione del Server==
=Preparazione del Server=


Il server deve essere già configurato e funzionante con la gestione completa di una zona.
* Il server deve essere già configurato e funzionante con la gestione completa di una zona.


===Generazione della chiave di aggiornamento===
==Generazione della chiave di aggiornamento==


Questa chiave permetterà ai client di aggiornare il nome DNS sul server.
* Questa chiave permetterà ai client di aggiornare il nome DNS sul server.


Si genera la chiave per un utente fittizio, usando un indirizzo email fittizio tipo gal-alert@rvmgroup.it:
* Installazione pacchetti necessari:


  dnssec-keygen -a HMAC-MD5 -b 512 -n USER gal-alert.rvmgroup.it.
  sudo apt-get install dnsutils bind9utils


Questo genera due files:
* Si genera la chiave per un utente fittizio, usando un indirizzo email fittizio tipo email@example.com:
cd
dnssec-keygen -r /dev/urandom -a HMAC-MD5 -b 512 -n USER email.example.com.


Kgal-alert.rvmgroup.it.+157+31772.key
* '''ATTENZIONE A GENERARE LA CHIAVE CON IL NOME CORRETTO, CHE ANDRÀ SEMPRE UTILIZZATO. LA CHIAVE CONTIENE ANCHE IL NOME DELLO USER, E QUANDO SI FA RIFERIMENTO ALLA CHIAVE STESSA NELLA CONFIGURAZIONE DI BIND, OCCORRE UTILIZZARE IL NOME ESATTO CON CUI È GENERATA LA CHIAVE'''
Kgal-alert.rvmgroup.it.+157+31772.private


Queste due chiavi andranno SPOSTATE poi sul client. I files non dovranno essere presenti sul server.
* Questo genera due files:


La .key è la chiave pubblica e la .private è quella privata, che per questo tipo di cifratura HMAC-MD5 sono le stesse, e cioè:
Kemail.example.com.+157+31772.key
Kemail.example.com.+157+31772.private


Comando per stampare la chiave:
* Queste due chiavi andranno poi SPOSTATE poi sul client. I files non sono necessari sul server.
cat Kgal-alert.rvmgroup.it.+157+31772.private | grep Key | cut -b6-


Chiave:
* Per stampare la chiave:
  rD3UJquI5r1Rvd9MblnoMCc7uS9ZYgC49Z/fgS0QwGaLBMHgPPdjYZVAIqpZGHAg+NDulKhJ2d5Sf4na+Tkzng==
  cat Kemail.example.com.+157+31772.private | grep Key | cut -b6-


=== Configurazione della Zona sul DNS Server===
rD3UJquI5r1Rvd9MblnoMCc7uS9ZYgC49Z/fgS0QwGaLBMHgPPdjYZVAIqpZGHAg+NDulKhJ2d5Sf4na+Tkzng=


*Creazione del file di configurazione delle chiavi:
== Configurazione della chiave sul DNS Server==
 
* Creazione del file di configurazione delle chiavi:


<pre>
<pre>
cat | sudo tee /etc/bind/ddns-keys.conf > /dev/null <<EOFile
cat | sudo tee -a /etc/bind/ddns-keys.conf > /dev/null <<EOFile
key gal-alert.rvmgroup.it. {
key email.example.com. {
         algorithm HMAC-MD5;
         algorithm HMAC-MD5;
         secret "rD3UJquI5r1Rvd9MblnoMCc7uS9ZYgC49Z/fgS0QwGaLBMHgPPdjYZVAIqpZGHAg+NDulKhJ2d5Sf4na+Tkzng==";
         secret "rD3UJquI5r1Rvd9MblnoMCc7uS9ZYgC49Z/fgS0QwGaLBMHgPPdjYZVAIqpZGHAg+NDulKhJ2d5Sf4na+Tkzng==";
};
};
EOFile


sudo chown root:bind ddns-keys.conf
sudo chown root:bind /etc/bind/ddns-keys.conf
sudo chmod 640 ddns-keys.conf
sudo chmod 640 /etc/bind/ddns-keys.conf
</pre>
</pre>


Line 52: Line 56:
  sudo sudo /etc/init.d/bind9 restart
  sudo sudo /etc/init.d/bind9 restart


==Configurazione del Client==
==Configurazione della zona DNS sul server DNS==
* Anche la zona va configurata per accettare le modifiche tramite la chiave
* Editare il file contenete i dati della zona, ad esempio:
sudoedit /etc/bind/named.conf.publiczones
 
<pre>
zone "example.com" {
type master;
file "/etc/bind/example.com.db";
};
</pre>
 
* Aggiungere le regole di update nella forma:
 
<pre>
update-policy {
grant <key> <type> <zone> <record-types>;
};
</pre>
 
* Dove
:<key> è il nome della chiave a cui si vuole dare il privilegio, nel nostro caso email.example.com.
:<type> è il contesto in cui si esprime la regola: 'name' per un solo nome dns o 'subdomain' per un intero dominio
:<zone/name> è il nome DNS o il sottodominio DNS seguiti da punto che si vogliono aggiornare , ad esempio example.com. o test.example.com.
:<record-types> è l'elenco separato da spazi dei tipi di record che si possono aggiornare, ad esempio A CNAME TXT


=== Installazione delle chiavi===
* Ad esempio, per permettere alla nostra ''key'' email.exaple.com. di poter aggiornare il singolo ''name'' test.example.com. come ''record-types'' A o TXT:
 
<pre>
zone "example.com" {
update-policy {
grant email.example.com name test.example.com. A TXT;
};
type master;
file "/etc/bind/example.com.db";
};
</pre>
 
* Restartare Bind
sudo /etc/init.d/bind9 restart
 
* Dato che a seguito di un update, bind creerà il jounrla file ''/etc/bind/example.com.db.jnl'' , assicurarsi che lo user bind possa scrivere nella stessa directory dove sono specificati i file di zona, ad esempio
sudo chown :bind /etc/bind
sudo chmod g+w /etc/bind
 
==Test di aggiornamento==
 
* Proviamo ora ad aggiornare il record test.example.com sul server dns locale appena configurato:
cd
<pre>
nsupdate -k Kemail.example.com.+157+31772.private -v <<EOFile
server ns1.example.com
zone example.com
update delete ${NAME}.example.com. A
update add ${NAME}.example.com. 60 A 1.2.3.4
show
send
EOFile
</pre>
 
* Se tutto è configurato a dovere, otterremo:
 
<pre>
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;example.com.                IN      SOA
 
;; UPDATE SECTION:
test.example.com.    0      ANY    A
test.example.com.    60      IN      A      1.2.3.4
</pre>
 
* Verificare:
host test.example.com localhost
 
<pre>
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases:
 
test.example.com has address 1.2.3.4
</pre>
 
* Se
:sul client si ottiene un errore tipo
BADKEY
 
:sul server si ottiene un errore del tipo
request has invalid signature: TSIG email.example.com.: tsig verify failure (BADKEY)
 
:allora significa che o la chiave è sbagliata o il nome utente della chiave è sbagliato.
 
==Note relative alle zone dinamiche==
 
*'''ATTENZIONE: QUANDO SI USA L'UPDATE DINAMICO DI UNA ZONA, NON EDITARE MAI DIRETTAMENTE IL FILE DI ZONA STESSO, MA SEGUIRE LA PROCEDURA SEGUENTE'''
* Quando si modificano dei record dinamicamente, le modifiche non sono contenute nel file di zona testuale, ma bensì nel journal, il cui contenuto è visionabile con
 
named-journalprint /etc/bind/example.com.db.jnl
 
add test.example.com. 60      IN      A      1.2.3.4
 
* Se si vuole modificare il fiel di zona, ANCHE PER RECORD NON GESTITI DINAMICAMENTE, bisogna prima trasferire queste modifica nel file di zona, tramite un freeze della zona stessa. Per comodità, effettuiamo un freeze di tutte le zone
sudo rndc -k /etc/bind/rndc.key -s localhost freeze
 
* Questo comando sposterà tutte le modifiche dai journal nei file di zona stessi, ELIMINANDO i file di journal
 
* Terminate le modifiche, si riabilita l'aggiornamento dinamico della zona, ed al primo update, verrà ricreato il journal
sudo rndc -k /etc/bind/rndc.key -s localhost thaw
 
* Se si ricevono errori durante il freeze o thaw, verificare i diritti sulla diretcory di zona e che non ci siano errori nei files di descrizione delle zone
 
* '''ANCHE QUANDO SI FA UN RELOAD DI BIND, È NECESSARIO FARE UN FREEZE, RELOAD, THAW'''
 
=Configurazione del Client=
 
== Installazione delle chiavi==


Cancellare le chiavi dal Server e copiarle sul client in /etc/bind/ddns-keys:
Cancellare le chiavi dal Server e copiarle sul client in /etc/bind/ddns-keys:
Line 60: Line 180:
<pre>
<pre>
sudo mkdir -p /etc/bind/ddns-keys
sudo mkdir -p /etc/bind/ddns-keys
sudo mv Kgal-alert.rvmgroup.it.+157+31772.key /etc/bind/ddns-keys
sudo mv Kemail.example.com.+157+31772.key /etc/bind/ddns-keys
sudo mv Kgal-alert.rvmgroup.it.+157+31772.private /etc/bind/ddns-keys
sudo mv Kemail.example.com.+157+31772.private /etc/bind/ddns-keys
sudo chown root:bind /etc/bind/ddns-keys/*
sudo chown root:bind /etc/bind/ddns-keys/*
sudo chmod 640 /etc/bind/ddns-keys/*
sudo chmod 640 /etc/bind/ddns-keys/*
</pre>
</pre>


===Configurazione dello script di aggiornamento===
==Configurazione dello script di aggiornamento per una connessione ppp==


Creaiamo lo script che ad ogni collegamento di PPP, aggiorni il nome DNS:
Creaiamo lo script che ad ogni collegamento di PPP, aggiorni il nome DNS:
Line 74: Line 194:
#!/bin/sh -e
#!/bin/sh -e
NAME=$(hostname | cut -b5-)
NAME=$(hostname | cut -b5-)
nsupdate -k /etc/bind/ddns-keys/Kgal-alert.rvmgroup.it.+157+31772.private -v <<EOFile
nsupdate -k /etc/bind/ddns-keys/Kemail.example.com.+157+31772.private -v <<EOFile
server ns1.quindicirighe.com
server ns1.example.com
zone quindicirighe.com
zone example.com
update delete ${NAME}.quindicirighe.com. A
update delete ${NAME}.example.com. A
update add ${NAME}.quindicirighe.com. 60 A $PPP_LOCAL
update add ${NAME}.example.com. 60 A $PPP_LOCAL
show
show
send
send
EOFile
EOFscript
EOFscript
</pre>
</pre>
Line 88: Line 206:
  chmod +x /etc/ppp/ip-up.d/05-sendipaddress  
  chmod +x /etc/ppp/ip-up.d/05-sendipaddress  


Provare ad eseguirlo, ('''NON TRAMITE SUDO PERCHE' NON FUNZIONA, quindi cambiando le permission delle chiavi''') e se tutto è corretto, il nome verrà aggiornato al valore indicato:
Provare ad eseguirlo, ('''NON TRAMITE SUDO PERCHE' NON PASSA LE VARIABILI DI AMBIENTE, quindi cambiando le permission delle chiavi''') e se tutto è corretto, il nome verrà aggiornato al valore indicato:


  sudo chmod a+r /etc/bind/ddns-keys/*
  sudo chmod a+r /etc/bind/ddns-keys/*


  PPP_LOCAL=62.11.253.159 /etc/ppp/ip-up.d/05-sendipaddress  
  PPP_LOCAL=1.2.3.4 /etc/ppp/ip-up.d/05-sendipaddress


<pre>
<pre>
Line 99: Line 217:
;; flags: ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; flags: ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; UPDATE SECTION:
;; UPDATE SECTION:
pv.quindicirighe.com.  0      ANY    A
test.example.com.  0      ANY    A
pv.quindicirighe.com.  60      IN      A      62.11.253.159
test.example.com.  60      IN      A      1.2.3.4
</pre>
</pre>


Line 108: Line 226:


Testare:
Testare:
  host pv.quindicirighe.com
  host test.example.com


  pv.quindicirighe.com has address 62.11.253.159
  test.example.com has address 1.2.3.4




* Script di scollegamento
* Script di scollegamento: se esistesse la possibilità di eseguire uno script di PRE-DOWN, si potrebbe fare un delete del nome dns, ma non esiste ...
Se esistesse la possibilità di eseguire uno script di PRE-DOWN, si potrebbe fare un delete del nome dns, ma non esiste ...


==Riferimenti==
=Riferimenti=
*[http://linux.yyz.us/nsupdate/ nsupdate: Painless Dynamic DNS]
*[http://linux.yyz.us/nsupdate/ nsupdate: Painless Dynamic DNS]
*[http://linux.yyz.us/dns/ddns-server.html nsupdate: Painless Dynamic DNS Painless DDNS part 2: the server]
*[http://linux.yyz.us/dns/ddns-server.html nsupdate: Painless Dynamic DNS Painless DDNS part 2: the server]
*[http://www.aossama.com/orking-with-a-journal-ized-bind-zone/ Working with a journal-ized bind zone - AOssama]
*[https://www.andrewzammit.com/blog/reload-dns-zone-with-bind9-and-rndc/ Reload DNS Zone with Bind9 and rndc | put things down]
*[https://bugs.launchpad.net/ubuntu/+source/bind9/+bug/963368 Bug #963368 “dnssec-keygen takes forever to generate a keyfile” : Bugs : bind9 package : Ubuntu]
*[https://blog.hqcodeshop.fi/archives/76-Doing-secure-dynamic-DNS-updates-with-BIND.html Doing secure dynamic DNS updates with BIND - Hacker's ramblings]
*[http://serverfault.com/questions/531112/bind-9s-nsupdate-dyndns-update-gives-tsig-verify-failure-badkey linux - BIND 9's nsupdate dyndns update gives: "tsig verify failure (BADKEY)" - Server Fault]
*[http://jpmens.net/2010/09/28/performing-dynamic-dns-updates-on-your-dns/ Jan-Piet Mens :: Performing dynamic DNS updates on your DNS]

Latest revision as of 16:09, 4 March 2016

E' possibile creare un sistema DDNS di aggiornamento dinamico dei nomi DNS con Bind 9.x, usando l'utility nsupdate da linux.

Preparazione del Server

  • Il server deve essere già configurato e funzionante con la gestione completa di una zona.

Generazione della chiave di aggiornamento

  • Questa chiave permetterà ai client di aggiornare il nome DNS sul server.
  • Installazione pacchetti necessari:
sudo apt-get install dnsutils bind9utils
  • Si genera la chiave per un utente fittizio, usando un indirizzo email fittizio tipo email@example.com:
cd
dnssec-keygen -r /dev/urandom -a HMAC-MD5 -b 512 -n USER email.example.com.
  • ATTENZIONE A GENERARE LA CHIAVE CON IL NOME CORRETTO, CHE ANDRÀ SEMPRE UTILIZZATO. LA CHIAVE CONTIENE ANCHE IL NOME DELLO USER, E QUANDO SI FA RIFERIMENTO ALLA CHIAVE STESSA NELLA CONFIGURAZIONE DI BIND, OCCORRE UTILIZZARE IL NOME ESATTO CON CUI È GENERATA LA CHIAVE
  • Questo genera due files:
Kemail.example.com.+157+31772.key
Kemail.example.com.+157+31772.private
  • Queste due chiavi andranno poi SPOSTATE poi sul client. I files non sono necessari sul server.
  • Per stampare la chiave:
cat Kemail.example.com.+157+31772.private | grep Key | cut -b6-
rD3UJquI5r1Rvd9MblnoMCc7uS9ZYgC49Z/fgS0QwGaLBMHgPPdjYZVAIqpZGHAg+NDulKhJ2d5Sf4na+Tkzng=

Configurazione della chiave sul DNS Server

  • Creazione del file di configurazione delle chiavi:
cat | sudo tee -a /etc/bind/ddns-keys.conf > /dev/null <<EOFile
key email.example.com. {
        algorithm HMAC-MD5;
        secret "rD3UJquI5r1Rvd9MblnoMCc7uS9ZYgC49Z/fgS0QwGaLBMHgPPdjYZVAIqpZGHAg+NDulKhJ2d5Sf4na+Tkzng==";
};
EOFile

sudo chown root:bind /etc/bind/ddns-keys.conf
sudo chmod 640 /etc/bind/ddns-keys.conf
  • Inclusione del file nella configurazione di bind:
sudoedit /etc/bind/named.conf.local
include "/etc/bind/ddns-keys.conf";
  • Riavvio di bind
sudo sudo /etc/init.d/bind9 restart

Configurazione della zona DNS sul server DNS

  • Anche la zona va configurata per accettare le modifiche tramite la chiave
  • Editare il file contenete i dati della zona, ad esempio:
sudoedit /etc/bind/named.conf.publiczones
zone "example.com" {
	type master;
	file "/etc/bind/example.com.db";
};
  • Aggiungere le regole di update nella forma:
	update-policy {
		grant <key> <type> <zone> <record-types>;
	};
  • Dove
<key> è il nome della chiave a cui si vuole dare il privilegio, nel nostro caso email.example.com.
<type> è il contesto in cui si esprime la regola: 'name' per un solo nome dns o 'subdomain' per un intero dominio
<zone/name> è il nome DNS o il sottodominio DNS seguiti da punto che si vogliono aggiornare , ad esempio example.com. o test.example.com.
<record-types> è l'elenco separato da spazi dei tipi di record che si possono aggiornare, ad esempio A CNAME TXT
  • Ad esempio, per permettere alla nostra key email.exaple.com. di poter aggiornare il singolo name test.example.com. come record-types A o TXT:
zone "example.com" {
	update-policy {
		grant email.example.com name test.example.com. A TXT;
	};
	type master;
	file "/etc/bind/example.com.db";
};
  • Restartare Bind
sudo /etc/init.d/bind9 restart
  • Dato che a seguito di un update, bind creerà il jounrla file /etc/bind/example.com.db.jnl , assicurarsi che lo user bind possa scrivere nella stessa directory dove sono specificati i file di zona, ad esempio
sudo chown :bind /etc/bind
sudo chmod g+w /etc/bind

Test di aggiornamento

  • Proviamo ora ad aggiornare il record test.example.com sul server dns locale appena configurato:
cd
nsupdate -k Kemail.example.com.+157+31772.private -v <<EOFile
server ns1.example.com
zone example.com
update delete ${NAME}.example.com. A
update add ${NAME}.example.com. 60 A 1.2.3.4
show
send
EOFile
  • Se tutto è configurato a dovere, otterremo:
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;example.com.                 IN      SOA

;; UPDATE SECTION:
test.example.com.     0       ANY     A
test.example.com.     60      IN      A       1.2.3.4
  • Verificare:
host test.example.com localhost
Using domain server:
Name: localhost
Address: 127.0.0.1#53
Aliases: 

test.example.com has address 1.2.3.4
  • Se
sul client si ottiene un errore tipo
BADKEY
sul server si ottiene un errore del tipo
request has invalid signature: TSIG email.example.com.: tsig verify failure (BADKEY)
allora significa che o la chiave è sbagliata o il nome utente della chiave è sbagliato.

Note relative alle zone dinamiche

  • ATTENZIONE: QUANDO SI USA L'UPDATE DINAMICO DI UNA ZONA, NON EDITARE MAI DIRETTAMENTE IL FILE DI ZONA STESSO, MA SEGUIRE LA PROCEDURA SEGUENTE
  • Quando si modificano dei record dinamicamente, le modifiche non sono contenute nel file di zona testuale, ma bensì nel journal, il cui contenuto è visionabile con
named-journalprint /etc/bind/example.com.db.jnl 
add test.example.com. 60      IN      A       1.2.3.4
  • Se si vuole modificare il fiel di zona, ANCHE PER RECORD NON GESTITI DINAMICAMENTE, bisogna prima trasferire queste modifica nel file di zona, tramite un freeze della zona stessa. Per comodità, effettuiamo un freeze di tutte le zone
sudo rndc -k /etc/bind/rndc.key -s localhost freeze
  • Questo comando sposterà tutte le modifiche dai journal nei file di zona stessi, ELIMINANDO i file di journal
  • Terminate le modifiche, si riabilita l'aggiornamento dinamico della zona, ed al primo update, verrà ricreato il journal
sudo rndc -k /etc/bind/rndc.key -s localhost thaw
  • Se si ricevono errori durante il freeze o thaw, verificare i diritti sulla diretcory di zona e che non ci siano errori nei files di descrizione delle zone
  • ANCHE QUANDO SI FA UN RELOAD DI BIND, È NECESSARIO FARE UN FREEZE, RELOAD, THAW

Configurazione del Client

Installazione delle chiavi

Cancellare le chiavi dal Server e copiarle sul client in /etc/bind/ddns-keys:

sudo mkdir -p /etc/bind/ddns-keys
sudo mv Kemail.example.com.+157+31772.key /etc/bind/ddns-keys
sudo mv Kemail.example.com.+157+31772.private /etc/bind/ddns-keys
sudo chown root:bind /etc/bind/ddns-keys/*
sudo chmod 640 /etc/bind/ddns-keys/*

Configurazione dello script di aggiornamento per una connessione ppp

Creaiamo lo script che ad ogni collegamento di PPP, aggiorni il nome DNS:

cat | sudo tee /etc/ppp/ip-up.d/05-sendipaddress > /dev/null <<'EOFscript'
#!/bin/sh -e
NAME=$(hostname | cut -b5-)
nsupdate -k /etc/bind/ddns-keys/Kemail.example.com.+157+31772.private -v <<EOFile
server ns1.example.com
zone example.com
update delete ${NAME}.example.com. A
update add ${NAME}.example.com. 60 A $PPP_LOCAL
show
send
EOFscript
chmod +x /etc/ppp/ip-up.d/05-sendipaddress 

Provare ad eseguirlo, (NON TRAMITE SUDO PERCHE' NON PASSA LE VARIABILI DI AMBIENTE, quindi cambiando le permission delle chiavi) e se tutto è corretto, il nome verrà aggiornato al valore indicato:

sudo chmod a+r /etc/bind/ddns-keys/*
PPP_LOCAL=1.2.3.4 /etc/ppp/ip-up.d/05-sendipaddress
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags: ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; UPDATE SECTION:
test.example.com.   0       ANY     A
test.example.com.   60      IN      A       1.2.3.4

Risistemare le permission delle chiavi:

sudo chmod 640 /etc/bind/ddns-keys/*

Testare:

host test.example.com
test.example.com has address 1.2.3.4


  • Script di scollegamento: se esistesse la possibilità di eseguire uno script di PRE-DOWN, si potrebbe fare un delete del nome dns, ma non esiste ...

Riferimenti