鱒身(Masu_mi)のブログ

知った事をメモする場所。

Wireshark: ZeroMQを解析する

今回はZeroMQを支えるZMTPプロトコルをWiresharkでみてみる。 前回のように仮想マシン2台を立ててTCP上で PUSH/PULL する。

手順

  1. WiresharkのZMTP用dissectorをインストール
  2. tcpdumpして手元で起動したWiresharkで解析できる状態にする
  3. ZMTPを有効化する
  4. 実験用のプログラムを起動する
  5. Wiresharkで表示される解析結果を観察する

1. ZMTP-Wireshark(Dissector)のインストール

プラグインのREADMEに記載がある通り以下を実施する。

mkdir -p ~/.wireshark/plugins
git clone git://github.com/whitequark/zmtp-wireshark ~/.wireshark/plugins/zmtp-wireshark

2. tcpdumpする

以下の様にtcpdumpした結果を標準出力に吐き出す。ローカル側ではsshの結果をパイプを経由してwiresharkに渡す。 tcpdumpの書き込み先オプション(-w), wiresharkの読み込み先オプション(-i)がともに伝統的な標準入出力(-)になっている。

tcpdumpの対象インタフェース(enp0s8)は事前に調べて決定している。 (VirtualBoxの仮想内部ネットワークを利用する) 注目するべき事はパケットキャプチャに用いるsshが対象デバイスを通過していないということ。 通過しないためtcpdumpでフィルターをかけずに済んでいる。 通過する場合は利用ポートなどでSSH通信をフィルターしないと再帰的にキャプチャされて通信量が増加する。

ssh default sudo tcpdump -U -i enp0s8 -w - | wireshark -k -i -

3. ZMTPを有効化

プラグインをインストールした直後では解析が有効化されていないので、Wiresharkの設定を変更しておく。

../../../_images/wireshark-config-protocol.png

Enabled Protocols を選ぶ

../../../_images/wireshark-config-zmtp.png

ZMTPをチェックする

4. 実験用のプログラムを起動する

ZeroMQでPushしたりPullしたりする。 ZMTP自体は特にportに制約がないはずだがdissectorの実装では5550-5560でしか機能しないように登録されているので範囲内のポートで実験するようにする。 (dissectorはLuaスクリプトなので簡単に変更可能)

../../../_images/start-push-pull-on-zmtp.png

ソースコードの雰囲気は大体下な感じ。

pusher.Bind(endpoint)
rand.Seed(time.Now().UnixNano())
// loop for a while apparently
for {
fmt.Println("TOP of for")
msg := util.CreateMessage()
fmt.Println("PRE pusher.Send")
pusher.Send(msg, 0)
if verbose {
  fmt.Println("SEND(zmq.PUSH):" + msg)
}
puller.Connect(endpoint)
for updateNbr < 100 {
  msg, _ := puller.Recv(0)
  fmt.Println("Recv(zmq.PULL):" + msg)
}

5. Wiresharkで観察する

下みたいにデータやコマンド情報が閲覧できることを確認する。

../../../_images/wireshark-capture-zmtp.png

ProtocolにZMTPが含まれている