Linux基础服务 ·

动态DNS搭建

动态DNS理念

如果我们本身是以拨接制的 ADSL 连上 Internet 时,我们的 IP 通常是 ISP 随机提供的,因此每次上网的 IP 都不固定,所以, 我们没有办法以常规的 DNS 设定来给予这种连上 Internet 的方法一个适当的主机名,这时就可以使用动态 DNS(Dynamic DNS, DDNS) 服务。

如果我们想要利用这种没有固定 IP 的联机方法架设网站时,就得要有特殊的管道了, 其中之一的方法就是利用 Internet 上面已经提供的免费动态 IP 对应主机名的服务!

提供这样的服务利用的原理基本上, DNS 主机提供 Internet 相关的 zone 的主机名与 IP 的对应数据,,DDNS 主机 就提供一个机制,让客户端可以通过这个机制来修改他们在 DDNS 主机上面的 zone file 内的资料。

我们的 BIND 9 就有提供类似的机制!那就是利用 update-policy 这个选项,配合认证用的 key 来进行数据文件的更新。

简单的说:

1) 我们的 DDNS 主机先提供 Client 一把 Key (就是认证用的数据, 你可以将他想成是账号与密码的概念)。

2) Client 端利用这把 Key ,并配合 BIND 9 的 nsupdate 指令, 就可以连上 DDNS 主机,并且修改主机上面的 Zone file 内的对应表。

DDNS Server 端的设定:

假设我有一个朋友,他使用的 Linux 主机的 IP 是会随时变动的,但是他想要架设 Web 网站, 所以他向我申请了一个域名,那就是 web.getlinux.cn ,此时我必需要给他一把密钥, 并且设定我的 named.conf 让 getlinux.cn 这个 zone 能够接受来自客户端的数据更新!首先来建立这把密钥!

dnssec-keygen -a [算法] -b [密码长度] -n [类型] 名称
选项与参数:
-a :后面接的 [type] 为加密方式,主要有 RSAMD5, RSA, DSA, DH 与 HMAC-MD5 等。建议你可以使用常见的 HMAC-MD5 来加密密码;
-b :密码长度;
-n :客户端能够更新的类型,主要有底下两种,建议给 HOST 即可:
ZONE:客户端可以更新任何标志及整个 ZONE;
HOST:客户端仅可以针对他的主机名来更新。

接下来需要:将公钥的密码复制到 /etc/named.conf 当中,将私钥传给 web.getlinux.cn 那部主机上!好了,那就开始来修改 named.conf 内的相关设定吧!

注意到上面的 grant web name web.getlinux.cn. A; 那一行, grant 后面接的就是 key 的名称,也就是说,我这把 web 的 key 在这个 zone (getlinux.cn) 里面可以修改主机名 web.getlinux.cn 的 A 的标志,即修改主机的 IP 对应!语法也就是: grant [key_name] name [hostname] 标签 也就是说,我的一把 key 其实可以给予多种权限!就看你如何规范了。

设定好之后,由于未来客户端传来的信息是由我们主机的 named 所写入, 写入的目录在 /var/named/ 当中,所以你必需要修改一下权限! 然后重新启动 DNS,然后观察一下 /var/log/messages 里面有没有错误即可! 如此一来,DDNS 主机端就设定妥当了!

Client 端的更新:

接下来则是 DDNS Client 端的更新了。首先,你必须要由 Server 端取得刚刚建立的那两个密钥文件, 请将刚刚建立的 Kweb.+010+43850.key 及 Kweb.+010+43850.private 传送到客户端, 即那部 web.getlinux.cn 主机上头, 假设你已经将这两个文件放置到 /usr/local/ddns 里面去,然后测试看看:

请注意到『 update add web.getlinux.cn 600 A 172.16.250.56 』这行, 他的意义说的是,新增一笔数据, ttl 是 600 ,给予 A 的标签,对应到 172.16.250.56 的意思~ 至于 nsupdate -k 后面加的则是我们在 Server 端产生的那个 key 文件!

然后你就会发现到在 DNS 服务器端的 /var/named/ 里面多出一个临时文件,那就是 named.getlinux.cn.jnl 当然,/var/named/named.getlinux.cn 就会随着客户端的要求而更新数据!

我们在主 DNS 查看一下有没有变化。

由于手动更新好像挺麻烦的,我们就让 Client 自动更新吧!利用底下这个 script 即可!

当然,你可以让这个脚本更加完善。

参与评论