天天看点

A DDNS Server Using BIND and Nsupdate

A DDNS Server Using BIND and Nsupdate

If you have your own UNIX machine with a static IP somewhere on the public

internet, it's possible to roll your own secure DDNS server using BIND 8 (or

greater) and its nsupdate tool on your dynamic UNIX client.

Let's assume that you have a machine on the internet called

my.inet.server and a dynamically assigned address on your home

machine, my.cable.machine, attached to the net by a cable modem. You

own the domain my.home.domain and want to use that name space to

statically refer to your cable modem.

On the client side (my.cable.machine), you'll need to:

  • Install BIND 8 or

    greater

  • Generate a TSIG ID key (needed for security)
  • Set up a script that will notify

    my.inet.server via nsupdate when your IP changes

On the master nameserver, my.inet.server, you'll need to:

  • Create a zone for your home network (or you can

    add to an existing zone)

  • Create a key entry in

    /etc/named.conf

  • Add an allow-update entry for your zone in
  • Make sure that the timeout in your zone file for

    your dynamically addressed hosts is very low

To create the TSIG key on my.cable.machine, you

can run the following command (as root), substituting whatever name you want

for keyname:

dnskeygen -H 128 -h -n keyname
      

This creates two files, Kkeyname.+157+00000.key

and Kkeyname.+157+00000.private. The base64 encoded

key included in these files is what you'll later want to put in the key

directive in /etc/named.conf on your my.inet.server. I'd

suggest putting these two files in with your zone records on

my.cable.machine, making sure that they are

unreadable/unwritable/unexecutable by normal users.

For our example, we'll say that the files are called

/etc/namedb/tsig/Kbob.+157+00000.key, which has the following

contents:

bob. IN KEY 513 3 157 hrCDCUNBtlY3sgF8NPnJrg==
      

And /etc/namedb/tsig/Kbob.+157+00000.private, which

contains:

Private-key-format: v1.2
Algorithm: 157 (HMAC)
Key: hrCDCUNBtlY3sgF8NPnJrg==
      

Use an existing zone entry for your domain, or create

a new one. It should look something like the following, though there are

other options and keywords that you may want to include:

zone "my.home.domain" {
    type master;
    allow-transfer {
        10.0.0.0; // put your slave servers here
    };
    file "my.home.domain.zone";
};
      

Be sure that the domain name is registered with the correct nameserver

information and that you populate the initial zone file with the proper

records (NS, A, CNAME, MX, whatever is required). If you don't know how to do

this, invest some time reading the documentation at ISC's BIND site.

On my.inet.server you need to make the following entry in /etc/named.conf:

key bob {
    algorithm HMAC-MD5.SIG-ALG.REG.INT;
    secret hrCDCUNBtlY3sgF8NPnJrg==;
};
      

And then add the allow-update directive to

my.home.domain:

zone "my.home.domain" {
    type master;
    allow-transfer {
        10.0.0.0; // replace this with your real slave servers
    };
    allow-update {
        key bob;
    };
    file "my.home.domain.zone";
};
      

Be sure to HUP named on my.inet.server after making the changes to

/etc/named.conf.

my.inet.server is now ready to accept dynamic updates from

my.cable.machine. To send an update, you need to use the nsupdate

command on my.cable.machine.

There are lots of DDNS client scripts out there

writtin in shell, perl, and even C that will allow you to automatically use

nsupdate to change the information on my.inet.server. Do a web or a

news search for something that will fit your specific platform and versions of

DHCP and DNS.

If you wanted to do an interactive update, instead of an automated one,

you'd do:

nsupdate -k /etc/namedb/tsig:bob.
      

This will bring you to a > prompt. Let's say, for example, that you

wanted to add an record for mail.my.home.domain to be the IP of

my.cable.machine with a TTL of 10 minutes (600

seconds). You want to keep your timeout low so that changes will propagate

rapidly in the event of an IP change. I'll use the loopback address of

127.0.0.1 as an example, but be sure to put the correct address in when you're

making your actual changes. You'd do the following:

update add mail.my.home.domain. 600 IN A 127.0.0.1
      

Then hit return again so that nsupdate executes the command you typed in on

the previous line. You can do multiple lines of changes destined for the same

zone file before you hit return the second time, but if you want to make

changes to two different zone files, you need to make the changes in two

blocks.

Once you hit return a second time, a lookup is performed on

my.home.domain to extract the nameserver information, and then that

nameserver (my.inet.server) is contacted and they key authentication

takes place. On my.inet.server, you should now see a log file appear

wherever you keep your zone file. The log file will be called

my.home.domain.zone.log, and it contains the directives to make the

changes you specified with the nsupdate command. Eventually, these changes

will be rolled into the actual zone file and the log file will be removed.

For the time being, though, these entries are merely in named's cache.

Take a look at the nsupdate man page for more information on the nsupdate

syntax and usage for your particular version of BIND.