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に記載がある通り以下を実施する。

1
2
$ 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通信をフィルターしないと再帰的にキャプチャされて通信量が増加する。

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

3. ZMTPを有効化

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

Enabled Protocols を選ぶ Enabled Protocols を選ぶ
ZMTPをチェックする ZMTPをチェックする
  1. 実験用のプログラムを起動する ===============================

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

tmux使ってZMTPを使う tmux使ってZMTPを使う

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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)
}
1
2
3
4
5
puller.Connect(endpoint)
for updateNbr < 100 {
  msg, _ := puller.Recv(0)
  fmt.Println("Recv(zmq.PULL):" + msg)
}
  1. Wiresharkで観察する ======================

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

ProtocolにZMTPが含まれている ProtocolにZMTPが含まれている
comments powered by Disqus