cname的解析過程:是local dns server把cname直接解析成ip。而不是 dns resolver先請求cname拿到被指向的域名,再做一次dns請求解析到ip。對於nslookup、dig工具,會解析成cname所指向的域名,而不是直接到ip。
1, 概述
DNS中的CNAME可以減輕運維壓力,使得已有的DNS配置具有一定的靈活性和可擴展性。本文對CNAME中的一些細節做闡述, 使DNS服務器的運維人員和開發人員能合理地使用CNAME。
2, zone的CNAME
你可能想把一個zone的DNS解析轉發到另一個zone的DNS解析,比如這樣配置
old.taobao.com. IN CNAME new.taobao.com.
實際上上面的CNAME意圖是錯誤的,因為old.taobao.com已經有了SOA和NS的記錄。如果你為old.taobao.com配置了CNAME, 那么old.taobao.com在CNAME鏈中的角色是一個別名alias,在SOA和NS的角度看它的角色是一個權威名canonical name, 一個domain是不能同時承擔這兩種角色的。
所以,正確的做法應該是為zone下面的domain設置CNAME,像下面這樣:
img01.old.taobao.com. IN CNAME img.new.taobao.com. img02.old.taobao.com. IN CNAME img.new.taobao.com.
3, 指向CNAME的CNAME
標准DNS協議是不鼓勵指向CNAME的CNAME的,因為這樣會導致cname loop,同時會增加解析時間。我遇到的一個DNS服務器 就因為沒有做CNAME loop的檢查,不斷向系統申請資源從而導致內存暴增直至宕機。
如果你決定你的DNS服務器不遵循標准DNS協議,支持多層CNAME的話,那么對於CNAME鏈的長度限制和CNAME loop的檢查是 十分有必要的。
4, 多個CNAME值
一個domain name或許會有對應的對個CNAME,像下面這樣:
img.taobao.com. IN CNAME img01.taobaocdn.com.
img.taobao.com. IN CNAME img02.taobaocdn.com.
img.taobao.com. IN CNAME img03.taobaocdn.com.
這看起來好像是一個不可思議的配置。但是你可以這樣實現你的DNS服務器來做基於CNAME的負載均衡(sounds pathologicall), 方法就是你的DNS服務器每次會隨機返回上面三個CNAME中的一(當然也可以是你設計的任何選擇策略)。
值得一體的是,BIND9不支持這種多值的CNAME。
5, CNAME作為alias
下面就是CNAME作為一個alias的配置:
mail.taobao.com. IN MX mail.taobaocdn.com.
mail.taobaocdn.com IN CNAME mail.alibaba.com.
DNS標准協議的建議是不要把一個alias當作某種資源類型的值。
當然,跟上面所有的情況一樣,你怎么實現都是你自己的事情,倒是后踩到自己挖的坑還得自己填。