在CentOS下配置DDNS并实现动态更新

由于项目需要,最近在CentOS 6系统中配置了一个DDNS(Dynamic DNS)服务器,
从而实现了动态对域名的添加删除等操作,记录一下步骤,备忘。

第一步 安装BIND

BIND全称是Berkeley Internet Name Daemon,是现今互联网上最常用的DNS服务
器软件,现在由互联网系统协会(Internet Systems Consortium)负责开发与维护。

在CentOS上安装BIND非常的简单,只需要使用root权限执行:

yum install bind bind-utils

就可以安装好BIND以及DNS相关的一些工具,包括dig以及nsupdate等,需要注意的是,在CentOS上,BIND实际的服务名是named,因此需要使用:

service named start|stop|restart

来对BIND进行操作。

第二步 配置静态DNS

在配置动态DNS之前,首先配置一个静态的DNS,来测试一下BIND能否正常工作。
打开/etc/named.conf文件:

vim /etc/named.conf

在文件的末尾,加上:

zone “mytest.com” IN {
type master;
file “mytest.com”;
allow-update { none; };
};

这里,声明了一个新的zone:”mytest.com”,并且指明了zone文件为”mytest.com”,根据文件上方指定的目录,默认的zone文件存放在/var/named目录下。
因此,我们需要在这个目录下,新建一个”mytest.com”文件,用来存放zone描述。

vim /var/named/mytest.com

在文件中输入以下内容:

$TTL 1D ;声明了TTL时间为1天
@ IN SOA @ mytest.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
$ORIGIN mytest.com. ;表示接下来的配置都已mytest.com.为根
;如果不写这一行,就需要写全整个域名
;如test1.mytest.com.而不是下面的test1
NS @ ;NS记录,指向根
@ A 127.0.0.1 ;根,指向127.0.0.1
test1 A 1.1.1.1 ;A记录test1,指向1.1.1.1
test2 A 2.2.2.2 ;A记录test2,指向2.2.2.2

保存文件,需要注意的是,named运行时是以named组的named用户来执行的,因此必须给named这个用户访问/var/named/mytest.com这个文件的权限,我们直接把这个文件的所有者设置为named。

chown named:named /var/named/mytest.com

好了,设置完成,启动named。

service named start

启动完成之后,来测试一下:

dig test1.mytest.com @127.0.0.1

看一下结果:

...
;; ANSWER SECTION:
test1.mytest.com.       86400   IN      A       1.1.1.1
...

指向了1.1.1.1,说明静态DNS配置成功。

第三步 配置动态DNS

首先,我们需要生成一个Key,用于更新记录的授权。这里使用了HMAC-MD5算法来生成Key。运行:

dnssec-keygen -r /dev/urandom -a HMAC-MD5 -b 512 -n HOST mytest.com

会得到2个文件,分别以.key和.private结尾:

Kmytest.com.+157+54894.key  Kmytest.com.+157+54894.private

我们需要的是.private Key的内容:

Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: Tf2lJsSSrSMcu2RvfnLWqwno9drVpQFLk8XkR7BIYWuQF17q/miYa6HfDhDaUCH2x4Bc3ea/Q6Bntod9/sLGdg==
Bits: AAA=
Created: 20141206031434
Publish: 20141206031434
Activate: 20141206031434

;

在/etc/named.conf中,zone “mytest.com”之前加上:

key “mytestcom” {
algorithm hmac-md5;
secret “Tf2lJsSSrSMcu2RvfnLWqwno9drVpQFLk8XkR7BIYWuQF17q/miYa6HfDhDaUCH2x4Bc3ea/Q6Bntod9/sLGdg==”;
};

其中key的名字随便起,secret就是刚刚生成的Key那个字段。
然后继续修改文件末尾zone的定义:

zone “mytest.com” IN {
type master;
file “mytest.com”;
allow-update { key mytestcom; };

允许mytestcom的key对zone进行更新。
同时,由于动态更新需要在/var/named写入jnl文件。所以需要将/var/named的所有者更改为named:

chown named:named /var/named

同时,selinux也有可能限制named写入文件,需要关闭:

# setsebool named_write_master_zones true

设置完成后。重启named:

# service named restart

第四步 动态更新DNS

使用nsupdate命令对DNS进行更新:

# nsupdate
> server 127.0.0.1 53
> zone mytest.com
> key mytestcom Tf2lJsSSrSMcu2RvfnLWqwno9drVpQFLk8XkR7BIYWuQF17q/miYa6HfDhDaUCH2x4Bc3ea/Q6Bntod9/sLGdg==
> update add test3.mytest.com 600 A 3.3.3.3
> send

完成后使用dig测试一下:

dig test3.mytest.com @127.0.0.1

结果:

;; ANSWER SECTION:
test3.mytest.com.       600     IN      A       3.3.3.3

成功!