tcpdum(8)による調査
次に、tcpdump(8)でどのような通信をBINDが行っているかを確認することにしました。
tcpdump(8)の表示の読み解き
少し脇道な話となりますが、tcpdump(8)の-vv
オプションを指定した場合のDNSを含んだパケットのログを読み解くのに役立つかもしれない、少し気がついた事項です。
- DNSのパケットはtcpdump(8)ではID(16bitの値)の10進数による表示から始まります。
- AAやTC等のビットを文字で表現していますが、その意味はtcpdump(8)のソースを読む方が速いでしょう。(
print-domain.c
のns_print()
) - UDPの場合は
[udp sum ok]
の後に続く部分がUDPで運んでいるデータです。 - TCPの場合で
lenght 0
で終わっている場合はは、データを運んでいないTCPの制御セグメントなので無視できます。 - それ以外のデータを含んだTCPのログでは、セグメントのデータの長さとDNSのIDのそれぞれの10進数による値の間に空白を入れずに表示されています。
DNSのやりとりの読み解き
DNSの通信内容を追う場合に、次のような問い合わせと応答が続く場合がよくあります。
- TCPでの再度の問い合わせ
- UDPでネームサーバーに問い合わせ
- ネームサーバーから応答が返るもTCビットがセット: 長すぎるので切り詰め
- このためTCPで同じIPアドレスのネームサーバーに問い合わせ
- DLVレコードの問い合わせ
- 得られたリソースレコードに
.dlv.isc.org
を付加したDLVレコードの取得を試み dnssec-lookaside
をno
にして抑止すべき?
- 得られたリソースレコードに
tcpdump(8)の結果
tcpdump(8)の結果を2つ紹介します。