2010-11-09 76 views
1

我試圖代碼我自己的DNS服務器,我通過在DNS RFC1035閱讀,但我有幾個疑問:DNS響應數據包

1)我希望我的服務器與CNAME特定響應請求,但沒有A記錄 - 我可以這樣做嗎?例如,接收'server1.com'的請求,響應'CNAME server2.com',然後客戶端查詢另一臺DNS服務器以獲取'server2.com'的A記錄。 我目前已經將標頭設置爲:'\ x84 \ x00'這樣說,這是授權服務器,但遞歸是不可能的。這是正確的嗎?

2)我希望我的服務器響應任何其他請求沒有記錄,以便客戶端然後查詢不同的DNS服務器的記錄。我目前已經將標題設置爲'\ x83 \ x03',以便發出NAME ERROR回覆代碼的信號。這是正確的嗎?那麼我應該怎麼做呢,在其他所有領域都是零,或者只是在那裏結束數據包?我不想用'這個名字不存在'作爲迴應,而是'我不知道這個名字,嘗試別人' - 我該怎麼做?

非常感謝:)

回答

1
  1. 聽起來是正確的 - 事實上,CNAME A記錄不正確(RFC1034 section 3.6.2:「如果一個CNAME RR存在於一個節點,沒有其他數據應該存在「)。

  2. 這將是一個非常不尋常的行爲從權威的名稱服務器 - 我會建議重新考慮它,或者至少測試一些真實生活的解析器,以確保他們做你想做的。 RCODE#3(「名稱錯誤」或NXDOMAIN)是肯定確認名稱不存在。這會導致解析器終止解析並可能緩存該名稱的不存在,這聽起來不像你所追求的。如果你想解析器查詢委託給該區域的其他名稱服務器之一,我猜SERVFAIL(RCODE#2)是最合適的/可能有所需的效果。

順便說一句,用於調試您的DNS數據包的確切格式我強烈推薦Wireshark其解碼精度粘貼十六進制代碼到堆棧溢出比較;)

+0

謝謝西蒙 - 我問CNAME與A記錄的原因是,看着wireshark捕獲,來自DNS服務器的單個響應有多個記錄,一個CNAME,然後附加的A記錄。但是,如果只返回一個CNAME是有效的,那很好。是的,我會嘗試RCODE#2,看看更多的數據包捕獲:)謝謝! – Technosites 2010-11-10 16:46:37

+0

實際上,沒有A記錄的CNAME似乎不起作用。我可以NSLOOKUP和檢索CNAME記錄罰款,但如果我嘗試ping它仍然沒有得到一個記錄,所以迴應'未知主機' - 任何想法? – Technosites 2010-11-10 18:09:24

+0

您是使用'nslookup'直接查詢授權的域名服務器,還是通過遞歸的域名服務器? – SimonJ 2010-11-10 18:20:31

1

在CNAME情況下,你(權威)服務器只應返回答案部分中的CNAME,除非它對CNAME指向的域也具有權威性,在這種情況下,它還應包含跟隨CNAME的結果。

對於第二種情況,您應該返回RCODE 5(「REFUSED」) - 這是權威服務器在問一個未配置域的問題時應該給出的首選錯誤。

接下來,您仍然需要發送四個16位計數字段和來自原始請求的問題的副本。在這種情況下,四個計數將是(1,0,0,0) - 一個問題,沒有答案,沒有ns記錄,沒有額外的記錄。