Tecnologie

Dettaglio dell'articolo:
domenica 28 gennaio 2007

Aggiornamento dinamico delle tabelle DNS

Supponiamo che il nostro client sia www.foo.bar ed il nostro server DNS sia dns.foo.bar (server autoritativo per la zona foo.bar)
Prima di tutto dobbiamo tenere a mente due cose:

  • sul server DNS non si deve aggiungere manualmente l'indirizzo IP di www.foo.bar; i record aggiunti dinamicamente vengono salvati dal server all'interno di un file binario con estensione .jnl (journal file); il contenuto del journal file viene quindi trasferito ogni 15 minuti nel file di zona vero e proprio.
  • client e server devono avere gli orologi sincronizzati.
Il nostro lavoro sarà quindi suddiviso in 4 fasi
  1. lettura dell'IP
  2. creazione chiavi per la connessione TSIG e configurazione DNS server
  3. creazione dello script per l'aggiornamento del DNS
  4. pianidicazione dell'esecuzione periodica dello script (crontab)
1.
Abiamo già detto che il nostro host www.foo.bar è connesso ad Internet tramite l'interfaccia eth0
Per leggere l'indirizzo IP assegnato si utilizza il comando:

[root@www.foo.bar ~]# ip addr show dev eth0
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:b0:d0:9a:0a:e8 brd ff:ff:ff:ff:ff:ff
inet 172.20.20.25/16 brd 172.20.255.255 scope global eth0
inet6 fe80::2b0:d0ff:fe9a:ae8/64 scope link
valid_lft forever preferred_lft forever

per estrarre l'indirizzo IP dall'output riportato qui sopra utilizziamo i comandi grep e sed

Isoliamo la riga contenente l'IP address
[root@www.foo.bar ~]# /sbin/ip addr show dev eth0 |grep "global eth0"
inet 172.20.83.7/16 brd 172.20.255.255 scope global eth0
[root@www.foo.bar ~]#

eliminiamo i caratteri presenti prima dell'indirizzo IP
[root@www.foo.bar ~]# ip addr show dev eth0 |grep "global eth0" |sed 's/^.*inet //'
172.20.20.25/16 brd 172.20.255.255 scope global eth0
[root@www.foo.bar ~]#

A questo punto dobbiamo togliere tutti i caratteri successivi all'indirizzo IP. Il comando completo è:

[root@www.foo.bar ~]# ip addr show dev eth0 |grep "global eth0" |sed 's/^.*inet //' | sed 's/\/.*$//'
172.20.20.25
[root@www.foo.bar ~]#

Creiamo uno script getip contenente il comando visto sopra.

# getip

#!/bin/sh
INTERFACE=$1

if [ -z $1 ]; then
echo "Uso: getip nominterfaccia (es.: getip eth0)"
else
/sbin/ip addr show dev $INTERFACE |grep "global "$INTERFACE |sed 's/^.*inet //' | sed 's/\/.*$//'
fi


2.
Creiamo la chiave che il client ed il server utilizzeranno per instaurare la comunicazione e criptare i dati scambiati
Sul client eseguiamo il seguente comando
client# dnssec-keygen -a HMAC-MD5 -b 256 -n HOST www

Il comando genera 2 files denominati
Kwww.+157+xxx.key
Kwww.+157+xxx.private

dove xxx è un numero random

NB: Entrambi i files devono essere presenti affinché nsupdate funzioni correttamente

Il contenuto del file .private è del tipo

Private-key-format: v1.2
Algorithm: 157 (HMAC_MD5)
Key: hqqs3zNW7dRTW1lBepI5vESLsGBDJTH5h30eqNNnjcs=

Sul DNS server bisogna creare un file contenente la chiave.

file /etc/nomechiave.key

key "nomechiave" {
algorithm hmac-md5;
secret "shared secret contenuta nel file Knomechiave+157+xxx.key";
};


e modificare il file /etc/named.conf aggiungendo nella sezione relativa alla zona interessata la direttiva allow-update e, alla fine, l'inclusione del file contenente la chiave

file /etc/named.conf

zone "foo.bar" in {
type master;
file "db.foo.bar";
allow-transfer { 50.60.70.80; };
allow-update { key www; };
};

include "/etc/www.key";

3.
Per aggiornare l'indirizzo IP del nostro client si usa il comando nsupdate

[root@www.foo.bar ~]# nsupdate -k Knomechiave.+157+xxx.key -d upns

dove upns è un file contenente le seguanti righe

/root/upns

server dns.foo.bar
zone foo.bar
update delete www.foo.bar A
update add www.foo.bar 600 A 172.20.20.25

send

Creiamo script.sh e inseriamo i comandi per la lettura dell'indirizzo IP e la connessione criptata con il server DNS.
/root/script.sh

#!bin/sh
cd /root
IP=`./getip eth0`
if [ -n $IP ]; then
sed 's/600 A.*$/600 A '$IP'/' upns > upns.new
mv upns upns.old
mv upns.new upns
/usr/bin/nsupdate -k Kwww.+157+xxx.key -d upns
fi

4.
Facciamo eseguire il nostro script ogni 10 minuti
[root@www.foo.bar ~]# crontab -e

5,15,25,35,45,55 * * * * /root/script.sh > /dev/null 2>&1


Commenti:

ciao....mi chiedevo se questo modo di usare nsupdate e' fattibile anche su un dns nn proprietario. Mi spiego meglio: ho un dominio registrato sul dns di aruba.it (62.149.128.2). Siccome ho l'ip dinamico vorrei che il dominio si aggiornasse in automatico con il nuovo ip. E' sufficiente secondo te avere l'account su aruba per poter aggiornare il dns? O ci sono comunque delle restrizioni?

Inviato da: flashboss il: 2007-04-19 22:38:05.255

Scrivi un commento:


Archivio