Domain-Name-System

具有多個 IP 的 DNS 記錄 + 512 字節 UDP 限制

  • March 9, 2022

我有一個指向單個 IP 的 DNS 記錄(例如:test.example.com):

test.example.com IN A 192.0.2.1

工作正常。現在我有 +30 個 IP 來回答它,例如:

teste.example.com IN A 192.0.2.1
teste.example.com IN A 192.0.2.2
(...)
teste.example.com IN A 192.0.2.31

現在它不穩定(“找不到主機”錯誤)。使用dig我得到一個警告“截斷,在 TCP 模式下重試”。經過一番Google搜尋,我發現一個多IP查詢必須不超過512字節才能保證會使用UDP,並避免額外的查詢(或no-tcp dns客戶端或提供程序的問題,舊的dns sw, ETC)。

那麼,我如何知道在單個 dns 條目中可以擁有多少個 v4 IP 以保證最大 512 字節的 UDP 應答?

或者

是否可以將 ISC 綁定配置為在多 IP 查詢中僅返回一個 IP?我知道IP可以循環使用rrset-order { order cyclic; };

像:

> test.example.com
Server: x.x.x.x
Address: x.x.x.x:53

Name: test.example.com
Address: 192.0.2.6

所以,只有其中之一?謝謝。

現在它不穩定(“找不到主機”錯誤)

從哪裡/如何?

正如您所注意到的,所有正確設置的解析器都會在他們第一次通過 UDP 查詢時獲得一個截斷標誌,然後將切換到 TCP,一切都會好起來的。

當然,您記得 DNS 是基於 UDPTCP(與流行的神話相反),因此您需要確保可以通過 TCP 查詢您的權威名稱伺服器,一切都會好起來的。

經過Google搜尋,我發現一個多IP查詢必須不超過512字節才能保證使用UDP

這取決於。有時你可以超過 1000。但最重要的是,事情回退到 TCP,所以應該不是問題(也許只是性能上的輕微損失)。

並避免額外的查詢(或無 tcp dns 客戶端或提供程序、舊 dns sw 等問題)。

“無 tcp dns 客戶端或提供者”不應該存在,因為它沒有任何意義,並且違反了 40 多年前編寫的 DNS 規範!或者你有這些案例的具體證據嗎?

不要試圖繞過這樣的事情。如果存在這些軟體,它們就會被破壞,並且會出現大量其他問題,例如 DNSSEC 安全域。

那麼,我如何知道在單個 dns 條目中可以擁有多少個 v4 IP 以保證最大 512 字節的 UDP 應答?

這通常無法回答(因為取決於名稱),但最重要的是,嘗試以這種方式優化事物是徒勞的。

無論如何,您可以輕鬆地進行計算:

  • UDP 數據包在數據前有 8 個字節的標頭(RFC 768)
  • 一個 DNS 數據包,見 RFC 1035,有一個標頭(12 個字節),然後是問題(可變數量的字節,見下文),然後是答案(見下文),我們將考慮附加和權限部分為空。

所以我們已經在 512-8-12 = 492 字節的 DNS 問題 + 答案。

作為回答,一條A記錄將是名稱(可變長度)+ 類型(2 個字節)+ 類(2 個字節)+ TTL(4 個字節)+ 長度(2 個字節),然後是數據。因為A數據是 4 個字節(一個 IPv4 地址)。

問題是名稱(可變長度)+ 類型(2 個字節)+ 類(2 個字節)。

DNS 數據包中的名稱具有以下兩個屬性:

  • 它們被編碼為以長度為前綴的標籤列表
  • 可能會被壓縮,以使給定名稱或名稱的一部分僅出現一次。

因此,例如example.com在 DNS 中編碼為 7,e,x,a,m,p,l,e,3,c,o,m,0 ,其中每個長度為一個字節,但如果以後需要名稱,它將是替換為僅使用 2 個字節的指針。

如果我們取這個名字:

  • 有問題的名稱部分的大小將是:13 個字節,所以問題的總大小:13 + 2 + 2 = 17
  • 在答案中,每個名稱都可以是引用問題中名稱的 2 個字節的指針,因此答案中的每條記錄的長度將是 2 個字節的名稱,然後是上面的其餘部分,因此是 16 個字節。

因此,完整的 DNS 數據包的大小為 12(標頭)+ 17(問題)+ x 乘以 16,其中 x 是A記錄數。

所以我們必須解決:512 = 8 + 12 + 17 + 16x對於x,它產生x=29了左右。請記住,這是在最好的情況下(沒有附加/授權記錄,並且完全使用名稱壓縮)和特定名稱(但如果使用壓縮,則名稱僅在有問題的情況下完整出現一次,因此只有大小發生變化)。

【另外,對了,別被上世紀遺留的網際網路所困;現在 IPv6 應該是標準;AAAA當然,與 IPv4 相比,您在固定大小的 DNS 數據包中放置的記錄類型更少:-)]

是否可以將 ISC 綁定配置為在多 IP 查詢中僅返回一個 IP?

我不這麼認為,如果它存在,bind 將如何選擇返回哪個 IP?如果您在這裡,您可以在區域文件中僅列出一個 IP。或者如果你真的很喜歡這個想法(但你一直鬆懈並不會阻止其他問題,因為客戶端是越野車,所以你無論如何都在嘗試與無限的山丘作鬥爭),你可以嘗試dnsdist這是一種瑞士軍刀,並允許微調。

PS:還要記住,DNS 有一個擴展,允許一方指定它可以接收的 (UDP) 緩衝區大小。請參閱 RFC 6891。最近dig使用1232的預設設置。您可能有興趣查看https://kb.isc.org/docs/aa-01219或https://dnsflagday.net/2020/上的 2020 年 DNS 標誌日,這正是關於此的。

引用自:https://serverfault.com/questions/1095769