仙豆のレシピ

ちょっとしたことでも書いていく姿勢で

DNS「いつからUDPしか使わないと錯覚していた?」

BINDでいろいろ遊んでたら、DNSで通常のUDPではなくTCPを使うこともあるということがわかったので書いておきます


通信のキャプチャファイルは以下のような感じ↓

f:id:senz:20140315212031p:plain

環境

まずDNS応答のサイズを大きくするために、架空のゾーン(.kmb)からサブドメイン(sonya.kmb)を委任しそのサブドメインのネームサーバ(ns0.sonya.kmb,ns1.sonya.kmb ...)がたくさんあるという設定の環境をつくりました。そして.kmbのネームサーバに長い架空のドメイン名(すごく長い.sonya.kmb)をdigで問い合わせたのが上のキャプチャです。つまり回答のauthority sectionとadditional sectionにsonya.kmbのネームサーバがたくさん並びDNS応答のサイズが大きくなるという仕組みです。

キャプチャの説明

上のキャプチャのまず①を見ると、②でもわかるようにUDPDNSの通信をしています。ここまでは普通のDNS通信と一切変わらなく見えます。その後なぜか問い合わせる側(10.0.4.4)がおもむろに3way handshakeを始めます(③)その後④でTCPDNS応答がなされています。(mtuを小さくしていたのでフラグメントされている)

一瞬なんでいきなり3way handshakeはじめたんだ??と思いましたが、冷静に考えるとその直前のDNS応答に「UDPムリだからTCPにして!」という情報が含まれているはずなので、探したらありました。
f:id:senz:20140315215136p:plain
DNSヘッダーのTruncatedが1になってる!


ここまでやってから、いろいろとググってみましたがどうやらDNSメッセージが512オクテットを超えるとUDPではなくTCPが使われるそうです。(参考:http://www.7key.jp/nw/technology/protocol/resolver.html

終わりに

教科書とかを読んでて「へー」って思ってそれを試してみることはよくあるけど、それとは反対に別なことやってて「ん?」ってなって自分でいろいろ試してから調べて「へー」ってなるのはなかなかない気がするので楽しかったです。