■ 河南 劉進京
編者按: 在活動目錄域環境下,使用DHCP動態分配IP時,有時也會出現多個主機域名使用相同IP的問題,給網絡管理造成困難。本文則是另辟蹊徑找到解決該類問題的方法。
在活動目錄域環境中,會使用DNS和DHCP服務對IP地址進行管理。很多情況下,在DNS中查看A記錄列表時,會發現出現多臺設備使用相同IP的情況,給網絡管理造成了不利影響。如果是手工為客戶機指定IP,出現這樣IP沖突問題就不奇怪。例如PC1的IP為192.168.1.100,那么當關機后,在PC2上手工設置相同的IP,當PC2加入域后,在DNS管理器中就會顯示這兩臺主機使用相同IP。但是在使用DHCP動態分配IP時,依然會出現多個主機域名使用相同IP的問題。
之所以會出現上述問題,還需要從DNS和DHCP工作機制談起。如果使用靜態IP地址分配方式,即手工為客戶端指派IP的話,那么當其加入到域中,就會自動在DNS中為自己注冊A記錄和PTR反向記錄。
例如,當該客戶機(例如PC1)登錄到域環境后,管理員在域控上打開DNS控制臺,在左側選擇“正向查找區域”→“xxx”項,“xxx”為具體的區域ID,點擊工具欄上的刷新按鈕,在右側會看到該機自動注冊的A記錄。
在該記錄的屬性窗口中打開“安全”面板,在組和用戶列表中選擇該機的賬號(例如“PC1$”),可以看到其擁有完全控制的權限。點擊“高級”按鈕,在打開窗口中顯示該記錄的所有者為“PC1$”。在左側選擇“反向查找區域”-“xxx”,其中的“xxx”為具體的區域ID,在其中會顯示該機自動創建的PTR反向記錄,在該記錄的屬性窗口中點擊“高級”按鈕,會顯示其所有者為“PC1$”。
如果開啟了DHCP自動分配IP功能后,當客戶機獲取IP后登錄到域環境中后,情況則會發生一些變化,即其可以向DNS服務器自動注冊A記錄,但是PTR反向記錄卻是由DHCP服務器為其產生的。
例如PC2使用DHCP得到IP后,登錄到域環境。管理員在DNS管理器中按照上述方法查看時,會發現與其對應的A記錄的擁有者為“PC2$”,但是反向PTR記錄的擁有者卻是DHCP服務器。
在DHCP控制臺左側選擇“IPv4”→“作用域”項,在其右鍵菜單上點擊“屬性”項,在打開窗口中的“DNS”面板中顯示默認了選擇“僅在DHCP客戶端請求時動態更新DNS記錄”項。這表示當啟用了DHCP自動分配IP后,DHCP會和DNS服務進行交互,幫助客戶端注冊PTR反向記錄。
在默認情況下,“在租用被刪除時丟棄A和PTR記錄”項處于選擇狀態,這說明不管采用靜態或動態設置IP,A記錄的所有者均為客戶機自身,所以DHCP服務器沒有權限丟棄A記錄的,其僅僅可以丟棄后者的PTR記錄。
例如,當在PC1上執行“ipconfig /release”命令釋放IP地址后,會自動在DNS中刪除A和PTR記錄。但在PC2上釋放IP后,僅可以自動刪除A記錄,必須依靠DHCP來為其刪除PTR記錄。
在實際的企業環境,即使所有的客戶端都使用DHCP來獲取IP,也會在DNS中產生多個指向同一個IP的A記錄。產生該問題有多方面原因。當DHCP客戶端在DNS中注冊了自己的A記錄后,當DHCP租約過期(默認為8天)后,DHCP就會對回收其IP,分配給別的客戶端使用。
如果某客戶端長期關機,例如PC1注冊自己的A記錄后,很長時間處于關機狀態,該A記錄會一致保存在DNS數據庫中。雖然DNS提供了自動清理功能,但是該功能默認沒有打開。實際上,當開啟該功能后,會存在一定的風險,這種風險指的是DNS服務器可能會誤刪記錄信息。那么當租約過期后,DHCP服務器將其回收后分配給PC2使用,PC2就會使用該IP注冊自己的A記錄,這樣,兩條A記錄就會指向相同的IP。那么,當對PC1進行Ping探測時,從表面上看是沒有任何問題的,但是在進行訪問(例如登錄遠程桌面等),訪問到的卻是PC2。
如果在預先規劃時,在地址池中的設置IP數量不夠,出現眾多客戶端頻繁搶用IP地址的情況,也會造成上述問題。例如當某些設備一段時間沒有開機,其之前獲取的IP已經分配給了其他主機,那么當其開機獲取IP后,必然會注冊自己的A記錄,這樣DNS就會產生多個A記錄指向相同IP的狀況。
對于規模較大的網絡,上述情況很常見。將IP地址和MAC地址綁定,可以解決上述問題,例如在DHCP管理器左側選擇“IPv4→作用域→保留”項,在其右鍵菜單上點擊“新建保留”項,將目標客戶端IP和MAC地址綁定起來即可。
但對于數量眾多不斷變化的客戶端來說,該方法操作起來很繁瑣,如果打開DHCP作用域屬性窗口,在“DHCP客戶端租用期限”欄中選擇“無限制”項,不再回收已經分配的IP,雖然也可以解決上述問題,但很容易耗盡該作用域中的IP地址。
比較好的方法是在作用域屬性窗口中打開“DNS”面板,選擇“始終動態更新DNS記錄”項,讓DHCP服務器為所有的客戶端注冊A和PTR記錄,即A和PTR記錄的所有者變成DHCP服務器。當然,對DHCP租期也需要進行合理設置。這樣,當租約到期后,當DHCP服務器將對應的IP分配給其他客戶端時,就會自動刪除之前的A和PTR記錄。但是,默認該配置是無效的。
因為在實際的企業網絡中,為了防止單點故障,會使用多臺DCHP服務器為客戶提供服務。例如某客戶從DHCP1服務器上獲取IP,客戶機自動注冊A記錄,DHCP1服務器為其注冊PTR反向記錄。當DHCP1服務器出現故障后,該客戶就會向DHCP2服務器申請IP,但是原先的PTR記錄的所有者為DHCP1服務器,所以DHCP2服務器無權對這些記錄進行更改。為此可以打開Active Directory用戶和計算機窗口,在其中創建一個普通的域賬戶(例如“dhcpgl”),其密碼設置為永不過期。
之后選擇雙擊名為“DnsUpdateproxy”的 組 賬戶,在其屬性窗口中的“成員”面板中點擊“添加”按鈕,將上述“dhcpgl”賬戶添加進來,讓其擁有代表客戶端向DNS注冊記錄信息的權限。之后在DHCP管理器左側選擇“IPv4”項,在其屬性窗口中的“高級”面板中的“DNS動態更新注冊憑據”欄中點擊“憑據”按鈕,輸入上述賬戶的名稱和密碼以及域名等信息,點擊確定按鈕保存配置信息。
如果存在多臺DHCP服務器,在每臺服務器上都執行同樣的配置。如此即可解決上述問題。這樣,在客戶機上執行“ipconfig /renew”命令獲取IP時,在DNS控制臺上選擇其注冊的A或PTR記錄,會發現其所有者為上述“dhcpgl”賬戶。但是,在實際使用時,會發現當客戶端的DHCP租期過期后,DHCP服務器僅僅從控制臺中刪除了對應的IP,沒有立即進行清理,對應的IP信息依然保存在DHCP數據庫中。這樣,過期的IP實際上沒有進行真正的回收和重新分配。
對于DHCP服務器來說,其租期過期的寬限期為4小時,數據庫清理間隔默認為1小時。也就是說,在默認狀態下,當客戶的IP租期過期后,要經過5個小時后,DHCP服務器才真正清理和回收,將其分配給其他用戶。執行“regedit.exe”程序,在注冊表編輯器中打開“HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesDHCPServerParameters”分支,在右側雙擊 名 為“DatabaseCleanup Interval”的鍵值名,里面存儲這DHCP數據庫清理的間隔值,默認為60分鐘,可將其修改合理的時間(例如1分鐘)。在右側窗口新建名為“LeaseExtension”,類 型為DWORD的鍵值名,作用是控制租期過期的寬限期,例如可以將其值修改為30,這樣經過30分鐘后,DHCP服務器就會將其標記為可刪除狀態,再經過預設的清理間隔后,就會將其回收并重分配。
除了利用DHCP服務器,來排除多個A記錄使用同一IP的問題外,在DNS控制臺中選擇主機名,在其屬性窗口中的“高級”面板中選擇“啟用過時記錄自動清理”項,雖然可以實現DNS記錄的老化和清理功能,不過默認其并沒有處于選擇狀態,這和DNS記錄的刷新和清理機制有關。TTL是DNS記錄可以在客戶端緩存中存儲的時間,如果對應的DNS記錄中的IP發生了變化,那么客戶端緩存的DNS記錄就與之匹配了。因此,當TTL時間到期后,客戶端就會向DNS服務器發出新的請求,來查詢對應的IP地址。
在DNS管理器中點擊菜單“查看→高級”項,使其處于選中狀態。當雙擊某條DNS記錄時,自其屬性窗口中的“生存時間(TTL)”欄中會顯示其TTL值(默認為20分鐘),管理員可以手動進行修改。當在客戶端上執行Ping命名對目標主機進行探測后,執行“ipconfig /displaydns”命令,會顯示具體的TTL時間(單位為秒)。DNS時間戳主要用來記錄DNS記錄創建的時間和后續刷新的狀態,可以據此判斷DNS記錄是否老化。當創建DNS記錄后,會產生時間戳信息??蛻舳藭扛?4小時對DNS記錄進行刷新,注意刷新可能成功也可能失敗。
刷新是客戶端對應DNS沒有任何變化,僅僅是更新其時間戳信息。對于規模較大的網絡中,存在多臺DNS服務器,當大量客戶端向DNS服務器發起更新請求后,不同DNS服務器之間會復制這些請求信息。這樣會產生很大流量,在多數情況下,客戶端的計算機名和IP地址都沒有發生變化,而僅僅更新對應DNS記錄的時間戳信息,在實際上沒有太大的意義。如果開啟了上述DNS老化和清理功能,就會激活非刷新間隔和刷新間隔兩個參數。
對于前者來說,主要用來降低DNS復制流量,避免DNS記錄被快速清除。在此期間(默認為7天),如果客戶端僅僅是更新時間戳信息,那么DNS服務器是拒絕接受的。對于其他的更改請求,DNS服務器可以接受。
對應地,在刷新間隔(默認為7天)內,DNS服務器是可以接受客戶端的時間戳刷新請求的。所以,如果客戶端長時間(例如大于14天)處于關機狀態,沒有執行刷新操作,那么DNS服務器會認為對應的DNS記錄是老化的,就會將其從DNS數據庫中清除,這就很可能帶來風險。當然,對于手工配置的靜態DNS記錄來說,DNS服務器是不會將其刪除的。