EDNS
隨著業務的復雜化和多樣化,RFC1035中定義的DNS消息格式和它支持的消息內容已經不足以滿足一些DNS服務器的需求,于是,RFC2671 中提出了一種擴展DNS機制EDNS(Extension Mechanisms for DNS),并在其中推薦了一種傳遞包大小的EDNS0。我將EDNS0中的一些關鍵內容總結在這篇文章中,以便日后翻閱,同時希望能夠幫助到像我這樣迷茫 過的、探尋EDNS很久才知道其概貌的新人。
? ? 一,什么是EDNS?
? ? ?EDNS就是在遵循已有的DNS消息格式的基礎上增加一些字段,來支持更多的DNS請求業務。
? ? ?需要注意的是,像DNS服務器這樣一個大型且廣泛應用的系統軟件,新增加擴展協議的時候一定要考慮到向后兼容性(backward compatibility),即你增加了你這個特性的消息傳輸給未支持該特性的服務器時,后者依然能正確處理。
? ? 二,為什么要有EDNS?
? ? ??RFC2671中指出EDNS被提出來的幾個理由:
? ? ? ? ?1)DNS協議頭部的第二個16字節中都已經被用的差不多了,需要添加新的返回類型(RCODE)和標記(FLAGS)來支持其他需求;
? ? ? ? ?2)只為標示domain類型的標簽分配了兩位,現在已經用掉了兩位(00標示字符串類型,11表示壓縮類型),后面如果有更多的標簽類型則無法支持;
? ? ? ? ?3)當初DNS協議中設計的用UDP包傳輸時包大小限制為512字節,現在很多主機已經具備重組大數據包的能力,所以要有一種機制來允許DNS請求方通知DNS服務器讓其返回大包;
? ? ? ? 以后我們會看到,DNSSEC機制和edns-client-subnet機制等都需要有EDNS的支持。
? ? ?三,EDNS的內容是什么?
? ? ? ??怎樣在DNS消息協議的基礎上再增加一些字段呢?為了保持向后兼容性,更改已有的DNS協議格式是不可能的,所以只能在DNS協議的數據部分中做文章。
? ? ? ? 所以,EDNS中引入了一種新的偽資源記錄OPT(Resource Record),之所以叫做偽資源記錄是因為它不包含任何DNS數據,OPT RR不能被cache、不能被轉發、不能被存儲在zone文件中。OPT被放在DNS通信雙方(requestor和responsor)DNS消息的Additional data區域中。
? ? ? ? 1,OPT偽資源記錄中的內容有哪些呢?
? ? ? ? ? OPT pseudo-RR中的內容包含固定部分和可變部分。它的結構如下:
? ? ? ? ? ? ? ? 圖1 OPT內容
?
? ? 圖1中最下面的RDATA是可變部分,其余的部分都是固定部分:Name字段目前為空;TYPE字段是OPT RR的類型編號,IANA為其分配的是41(0x29);TTL中是擴展的DNS消息頭部,下面會有介紹;RDLEN是可變部分RDATA的長 度;RDATA是KV類型的可變部分。
? ? ?原來的TTL字段被用來存儲擴展消息頭部中的RCODE和flags,它的格式如下:
? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2?extended RCODE and flags Detail
? ? ?圖2中高位8個bit是擴展RCODE(返回狀態碼),這8個bit加上DNS頭部的4bit總共有12bit(8bit在高位),這樣就可以表示更多的返回類型;
? ? ? VERSOION字段表示EDNS的版本(EDNS根據支持不同的擴展內容會有很多版本),這篇文章提到的內容的VERSION=0
? ? ? RFC2671中Z一般情況下被發送者設置為0,接收方可以忽略它。但是后續的擴展協議中會用到這16bit。
?
? ? ? ?OPT RR中可變部分RDATA的結構如下圖所示:
圖3 RDATA格式
? ? 圖3中OPTION-CODE由IANA分配;OPTION-LENGTH是OPTION-DATA的長度;OPTION-DATA是具體長度。
? ? ? 上面三個圖之間的關系用下圖看或許會清晰一點:
需要注意的是,每個DNS 消息中只能有一個OPT偽資源記錄,當有多中EDNS擴展協議時,各個{attribute, value}對一個緊接一個存儲在RDATA中。如下圖所示
? ?
可以看到當有NSID和CSUBNET的時候,兩個RDATA緊密排列在OPT的RDATA字段中,它們兩的總長度由Data length指定。
? ? ? ? 2,example
? ? ? ?好苦澀的理論啊,我們拿一個實例看看EDNS0的格式吧!
? ? ? ?我在自己的機器上用bind-9.8.1-p1中的dig請求Google首頁,并把包大小參數設置為768:
? ? ? ? ? ? ? ? ? ? ? ? ./dig www.google.com.hk +bufsize=768
? ? ? ?用tcpdump抓包,然后用ethereal查看UDP包的內容,下圖是請求包的詳細內容:
圖4 request message
? ?圖4中藍色的是請求消息中的Additional data中的所有內容,我們可以看到有一個OPT RR,需要注意的是:
? ? ? 1)TTL字段中的extended RCODE、VERSION和Z被ethereal拆分來顯示了;
? ? ? 2)RDATA length為0說明沒有可變消息RDATA,從下面的消息中可以看到確實沒有RDATA(...)
?
?下圖是響應消息:
圖5 response message
圖5中可以看出,Additional data中除了四個google權威域名服務器詳細信息外還有OPT RR,響應消息包的大小為4096字節。
? ? ? 3,Others
? ? ? RFC2671中還包含了很多EDNS0實現時請求方和響應方注意的事項,以及EDNS0帶來的問題,對它們感興趣的可以移步這里。
? ? ?四,參考文獻
? ? ? 1,RFC2671
? ? ? 2,維基百科 ?http://en.wikipedia.org/wiki/EDNS
總結
- 上一篇: lua-nginx-module dir
- 下一篇: Lua的require使用