DNS flag day 2020

DNS Flag Days 2020

相較於2019年的DNS flag day主要是專注在解決DNS協定中的EDNS支援程度,2020年的DNS flag day想要嘗試解決的是UDP封包碎片(fragmentation)的問題。

什麼是封包碎片

每一種網路傳輸介面都有其最大的單一傳輸封包大小(MTU, Maximum Transmission Unit),例如Ethernet的MTU是1.5K bytes左右,但如果要傳送的封包大於1.5K bytes(如DNS EDNS0最大的封包可為4096 bytes)時怎麼辦? 那就必須要進行切割後傳送,到目的地後再進行組合成原本的大封包。

封包分割有什麼問題

從傳送端到目的端會經過不同的網路,這些不同網路的MTU都不一定一樣大,如果下一個網路的MTU大於上一個網路的MTU那沒問題,但如果下一個網路的MTU比較小時怎麼辦? 此時IPv4和IPv6的作法就不一樣了,在IPv4是由路由器依下一個網路的MTU進行封包進行分割,除非封包的IP表頭的DF flag(Don’t Fragment)設為1。但在IPv6的環境下路由器是不作這件事的,它只會將這個封包丟掉並送一個ICMP封包給傳送端告知封包因太大而被丟掉了。其實IPv6是要由傳送端先查出傳送路徑中最小的MTU,在依那個大小進行封包切割(請參考RFC 1191 Path MTU Discovery, PMTUD),但這個動作有好幾種原因造成無效,例如路由是動態的,上一個封包和下一個封包走的是不一樣的路徑,或是RFC 4443提到的傳送ICMP限制(IPv6 node MUST limit the rate of ICMPv6 error messages it originates.)等等因素都有可能造成PMTUD失效。
另一個問題IPv6封包分割後不像IPv4每個封包都有標準的表頭,因此一些低端的網路設備或路由器會將切割後的封包,除了第一個有標準表頭可以處理外,會將其餘的封包丟掉。這樣的結果造成即使分割後的封包即使都符合MTU的大小也會造成傳輸失敗。

那要如何避免?

依照DNS flag day 2020的建議,(1) 將EDNS buffer size調成1232 bytes。(2)確保DNS伺服器在封包大小過大時會改用TCP來傳送。
你可以到 https://dnsflagday.net/2020/ 進行檢查自己的網域名稱伺服器或目前使用的DNS解析器是否有問題。