在很多大的網絡中為了簡化維護量,都使用了DHCP來動態分配IP地址。這樣就要求DNS也能夠動態的添加和刪除記錄。BIND 8和9就支持DNS動態更新機制。
主DNS和輔DNS在處理收到的動態更新記錄是有區別的,輔DNS在收到更新消息的時候,由於它不是該區的主DNS,它就會將這個更新消息轉發給它的主DNS,這稱作“更新轉發”。而主DNS當然就簡單地做更新而已。
如何來創建動態更新消息呢?第一種是用軟件編程方式,采用ns_update()解析器例程來創建。第二種則是用命令行程序nsupdate命令手工創建。這裡主要講一下第二種,命令格式如下:
prereq yxrrset domain name type
prereq nxrrset domain name type
prereq yxdomain domain name
prereq nxdomain domain name
update delete domain name [type] [rdata]
update add domain name ttl [class] type rdata
看起來似乎挺復雜,其實很容易。prereq 表示預先必須符合的條件,yxrrset表示存在記錄,nxrrset表示不存在記錄,而yxdomain則表示存在域名了。例如:
# nsupdate
> prereq nxdomain www.xmgd.com.
> update add www.xmgd.com. 600 A 210.52.83.228
>
這個例子告訴服務器只有在域名不存在時才對域名 www.xmgd.com 添加一個地址。注意最後一個空行表示nsupdate發送這個更新消息。
# nsupdate
> prereq yxrrset xmgd.com. MX
> update delete xmgd.com. MX
> update add xmgd.com. 600 MX 10 mail.xmgd.com.
> update add xmgd.com. 600 MX 50 pop.xmgd.com.
>
這個例子告訴服務器檢查服務器是否有xmgd.com.的MX記錄,如果有的話就刪除原有的MX記錄,重新添加兩個。
如何來限制動態更新呢?我們可以使用allow-update參數來限制動態更新,如:
zone “xmgd.com” {
type master;
file "zone.xmgd.com";
allow-update { x.x.x.x; }; // IP 地址
};
不過,要注意的是如果我們允許從輔DNS向主DNS進行地址更新,那麼任何人只要向輔DNS發送更新消息,經過轉發更新也能進行原本不能進行的動態更新,如何防止這一點呢?可以在輔DNS上使用allow-update-forwarding參數來做轉發更新的限制,如:
zone “xmgd.com” {
type slave;
file "zone.xmgd.com";
allow-update-forwarding { x.x.x.x; }; // IP 地址
};