当前位置:Linux教程 - 域名服务 - 域名服务 - DyDNS原理以及实现

域名服务 - DyDNS原理以及实现

DyDNS原理以及实现
2004-04-23 15:18 pm
来自:www.geekbone.org/~chaos/
现载:Www.8s8s.coM
地址:[email protected]

2003,04,20
1. DyDNS i.e. 动态域名
可以让不固定ip的用户使用一个固定的域名,每次他们的ip改变的时候,只要更新这个dns数据,就可以让他们的机器通过域名被访问到
2. 原理
每个internet domain name 记录都有一个 ttl(time-to-live) 标识,域名缓存服务器根据这个标识决定每隔多长时间更新一次它的数据。那么,只需要把动态dns的ttl值设的小一点,就可以保证域名的改变能及时生效。
3. bind 与动态dns的实现
A. bind 是linux/unix上用的非常普遍的域名服务器软件。bind本身就提供了动态更新域名数据的机制。
bind 的 named.conf里面的 zone 语句,有一个参数 allow-update
语法: allow-update { address_match_list }
即指定了能向bind发起 域名更新 指令的机器的ip/地址列表。
缺省情况下,任何机器都不能发起域名更新指令。
例:
zone "abc.com" {
type master;
file "abc.com";
allow-update {127.0.0.1; 10.240.0.1; 192.168.1.1;};
};

安全: 如果使用了 ip地址匹配机制,那么相应的机器上的所有用户都可以发起域名更新指令,如果这个机器上有很多普通用户的话,这可能是一个麻烦。这种情况下,需要用bind的高级验证机制来解决(使用密钥)。
B. nsupdate 工具
随bind一起发行的工具除了 named ,nslookup之外,还有一个 nsupdate工具,用来发起域名更新指令。
用法:
nsupdate [ -d ] [ -k keydir:keyname ] [ -v ] [ filename ]

-d 表示运行于debug模式
-k 指定一个用于验证的密钥
-v 表示使用tcp而不是udp

nsupdate的指令从 filename 指定的文件内获得,如果没有指定文件,就从标准输入获得

nsupdate 缺省与/etc/resolve.conf里面指定的主域名服务器通讯
主要指令 :
增加一个域名:
update add domainname ttl [class] type value
ttl是增加的域名记录的 time-to-live属性, class是缺省 IN ( internet )
type 可以是 A/CNAME/NS/SOX 一般用于dydns是 A
value是这个域名记录的值 ,对于 A类型记录,值一般是ip地址

删除一个域名:
update delete domainname
这些指令可以与先决条件一起使用:
以 domainname 不存在为条件:
prereq nxdomain domainname
以 domainname 存在为条件
prereq yxdomain domain-name
任何空行表示commit
例:
i. 增加一个域名
# nsupdate
>update add new.abc.com 60 IN A 127.0.0.1
>

# nslookup new.abc.com
Server: 127.0.0.1
Address: 127.0.0.1#53

Name: new.abc.com
Address: 127.0.0.1
ii. 删除一个域名
为了保证不会出错,这里首先检查该域名是否存在
# nsupdate
> prereq yxdomain new.abc.com
> update delete new.abc.com
>
# nslookup -sil new.abc.com
Server: 127.0.0.1
Address: 127.0.0.1#53

** server can't find new.abc.com: NXDOMAIN

注释:
以prereq开头,空行结束的指令段可以看作一个条件语句段,只有在prereq所要求的条件满足的时候才会被执行。
因此,一段通用的用于动态dns 注册/登录 的nsupdate指令可以写成:
# nsupdate
> prereq yxdomain xxx.abc.com
> update delete xxx.abc.com
>
> update add xxx.abc.com 60 IN A xxx.xxx.xxx.xxx
>
4. bind的高级验证机制 (基于密钥)
bind支持用密钥进行的验证机制,只有拥有这个密钥的nsupdate进程 ( 可以用nsupdate的 -k 参数指定给nsupdate)才能进行特定的操作,特别有用的是域名更新操作。
i. 为验证生成密钥
# dnskeygen -H 128 -h -n abc.com
Generating 128 bit HMAC-MD5 Key for abc.com
Generated 128 bit Key for abc.com. id=0 alg=157 flags=513
生成两个文件 Kabc.com.+157+00000.private 和 Kabc.com.+157+00000.key
内容分别为
# cat /etc/bind/sec/Kabc.com.+157+00000.private
Private-key-format: v1.2
Algorithm: 157 (HMAC)
Key: /G9ZaFJIyeG1roPSlJbfyw==

# cat /etc/bind/sec/Kabc.com.+157+00000.key
abc.com. IN KEY 513 3 157 /G9ZaFJIyeG1roPSlJbfyw==

确认使这两个文件只对拥有者可读写

ii. 修改named.conf, 使之能够使用密钥验证
key abc.com. {
algorithm hmac-md5;
secret "/G9ZaFJIyeG1roPSlJbfyw==";
};
// 这里的 secret key就是 Kabc.com.+157+00000.private 文件中的 key
zone "abc.com" {
type master;
allow-update { key abc.com.;};
file "abc.com";
};
iii. 在调用nsupdate的时候,使用密钥
nsupdate -k /etc/bind/sec/:abc.com.
>
bind 8里面,nsupdate使用 -k keydir:keyname的格式来使用
keyname 是 dnskeygen 生成key的时候指定的 keyname,但是要加一个点"."
5. 最后实现
使用一个程序(cgi或者其他服务程序)调用 nsupdate, 并指定正确的验证密钥,就可以实现动态dns
6. 参考
named.conf(5), nsupdate(1), dnskeygen(1)