DnsHiveをリリースしました

DnsHiveはパケットキャプチャによってDNS名前解決情報の蓄積とネットワーク監視を同時に実行し、ツールです。tcpdumpコマンドを使ったことがある人に端的に機能を説明すると、以下の様な使い方ができます。

# dnshive -i eth0 | grep google.com
1391871175.057028 TCP 10.0.0.5/63906 -> safebrowsing.google.com.(173.194.126.233)/443 Len:107
1391871175.102049 TCP safebrowsing.google.com.(173.194.126.233)/443 -> 10.0.0.5/63906 Len:66
1391871332.255500 TCP 10.0.0.5/63921 -> www3.l.google.com.(173.194.117.131)/443 Len:78
1391871332.294297 TCP www3.l.google.com.(173.194.117.131)/443 -> 10.0.0.5/63921 Len:74

これによって、特定のドメインとの通信をネットワーク監視することができます。

なぜtcpdumpではできないのか

クライアントPCのブラウザなどから見えているドメイン名とパケットキャプチャソフトから見えるドメイン名は異なる場合がある

有名なパケットキャプチャソフトであるtcpdumpWiresharkでは、取得したパケットを表示する際にIPアドレスからドメイン名を検索する「逆引き」機能が備わっています。この時、IPアドレスとドメイン名が1対1の対称構造になっていれば問い合わせ時と同じドメイン名を取得できますが、近年はDNSの設定が複雑化しており対称構造になっていないことが多々有ります。(こちらもご参照ください)そのため、パケットに含まれるIPアドレスだけでは元々どのドメインと通信をしようとしていたのかを判断するのは難しくなっています。

なぜDnsHiveだとできるのか

DnsHiveの仕組み

DnsHiveの構造

本ツールは監視している通信の中からDNSの応答パケットを読み取り、どのドメイン名とIPアドレスが紐づくかを調べ、記録する機能があります。DNSの応答はAレコード、AAAAレコード、CNAMEについて調べます。あとはパケットの内容を表示したり、ファイル(msgpack形式)やメッセージキュー(ZMQ PUB)で出力する際に、IPアドレスだけではなくドメイン名の情報を検索して、一致するものがあればそれも付随させて出力します。

これによって、ツール内でCNAMEを含むドメイン名とIPアドレスのマッピング情報を持つことができ、プログラムが知りたいときに「正引きの逆をたどる」(「逆引き」ではない)をすることができるようになります。仕組みとしてはとても単純ですが、tcpdumpやwireshark、netflowなどでは基本的にIPアドレスまでしか辿れないため、低レイヤで見た統計・計測情報とその通信がどのような意図で実施されたのかをひもづけるのが難しい、という実情があったように思えます(自分が本職のネットワークオペレータではないので想像ですが)このツールでそういった分析の幅が広がればと考えてます。

制限事項

ツールを使うにあたって、いくつか技術的な制限があります。

  • 基本的には監視してるネットワーク上のDNS通信を分析するため、DNS通信が含まれているトラフィック/データでないと効果を発揮できません
  • DNSの問い合わせ・応答を見るため、あらかじめホスト上にあるキャッシュやホスト上で定義されたホスト名などは知ることができません
  • 現在は取得したIPアドレスとドメイン名のマッピングを上書きしていく仕組みになっているため、同じIPアドレスを返す別のドメイン名が出現した場合は新しく出現したものが優先して表示されます

使い方

githubにレポジトリをおいてあるので、cloneして利用していただければと思います。導入にはdnshiveの他にパケット解析ライブラリのswarmも必要になりますのでそちらも合わせて導入してください。今のところはバイナリなどでの提供はありません。

https://github.com/m-mizutani/dnshive

Comments