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)
>
bind 8裡面,nsupdate使用 -k keydir:keyname的格式來使用
keyname 是 dnskeygen 生成key的時候指定的 keyname,但是要加一個點"."
5. 最後實現
使用一個程序(cgi或者其他服務程序)調用 nsupdate, 並指定正確的驗證密鑰,就可以實現動態dns
6. 參考
named.conf(5), nsupdate(1), dnskeygen(1)