WireShark で ポートの名前解決をやめて数字表示にさせる
WireShark で新規のカラムを追加する。
例えば、トレースが表示される画面に Source IP Address の MAC アドレスのカラム(列)を追加したい場合の手順。
① 「Edit」→ 「Preferences」 を選択
②この設定画面からカラムを追加できる。
(1) 「Columns」のメニューを選ぶ
(2) 「Format」で追加するカラムを選ぶ。 ここでは、「Hwr src addr (unresolved)」を選択。
(3) 「Add」する
(4) 選択したカラムが追加される。カラムの並び順は、マウスでドラッグする事で変更できる。カラム名も指定できる。
③トレース画面に新しいカラムが追加される。
ここでは、「New Column」に成っているが、ステップ②でカラム名は任意に指定できる。
WireSharkでタイムスタンプのフォーマットを変更する。
WireSharkで特定のIPとの通信だけトレースを取る
画面の一番目立つ所にあるフィルタリングの機能は、既に取得したトレースをフィルタリングするためにあります。
そもそも取得するトレース量をあらかじめフィルターするには・・・
1)「Capture」→ 「Options」を選択
2) ボックスの部分に式を入れる
host <キャプチャーしたい通信先のIP>
でOKです。
私の場合、殆どのケースで IPアドレスのフィルタリングだけで足りてしまいます。
WireShark の負荷を減らす工夫には・・
パケットの量が多いトラフィックのキャプチャーを取っている場合は、PCがとても重くなります。
効果があるのかわかりませんが、トレースの対象となるインターフェイスをあらかじめ選択しておくことで、WirShark の処理量を減らす事ができます。(と思います)
「Capture」→「Interfaces」を選ぶとキャプチャーを取る対象を選ぶ事ができます。
例えば外部の機器との通信を計る場合は、VMware や Virtual Box の仮想インターフェイスのトレースを監視する必要はありませんし、無線LANを使う必要がなければ、無線LANをオフにしてチェックを外しておくと WireShark側としてもフィルタリングする対象が減って軽くなるんじゃないかと思います。(焼け石に水かもしれませんが)
WireShark で TCP の SEQ とACK の番号を表示させる。
TCPの通信では、データの送り手と受け手が、SEQ と ACK の交換をしながら確実にデータが相手に届いたか確認しながら、次のデータを送る。という作業を繰り返していきます。
SEQ番号 → データ送信元が受信先に送る番号。「xxxx バイト目から、1000 Byte のデータを送るよ」という時の開始の xxxxx を指す番号。
ACK番号 → データ受信先が送信元に送る番号。「yyyy バイトまでデータを受け取ったよ」という番号。
です。
WireShark の場合、デフォルトの表示画面にこの値が表示されません。これを表示させてみます。(以下、この記事作成時点での WireShark デフォルトのカラム)
1) 適当なTCP パケットを選びます。
2) 画面下部に表示される「Transmission Control Protocl」のセクションを開いて、「Sequence number: xxxx (relative sequence number) 」という部分を選択して右クリックします。
3) 「Apply as Column」を選択します。
このカラム追加の作業を他のデータに対しても行います。
「Acknowlegement number:xxxxx (relative ack number)」 と
「TCP segment Len: xxxx]
に対して同じ作業を行います。
まとめると下図のように全部で②の3つの項目をカラムとして追加する事になります。
5) 最終的に以下のように3つの列が増えているはずです。
列の順番は、マウスのドラッグで変更する事ができます。
ここでは、「TCP Segement Len」→「Sequence number」→「Acknowledgement number」の順番で入れ替えました。
ACK番号とSEQ番号の関係を WireShark上で見てみる。
せっかくなので、SEQ番号と ACK 番号がきちんと並んでいるか見てみます。
オレンジの枠で囲んだ所に注目します。
上3行は、「Source」→「Destination」の通信です。
Length の所を見るとわかるように、この3つのパケットのデータ部分のサイズ( TCP Segment Len) は、全て 1460 Byte というサイズです。
上の3つのパケットのSEQ番号(Sequence Number) の数字の番号は、1733、3193、4653 です。つまり、
「1733Byteから 1460 Byte送るよ」
「3193Byteから 1460 Byte 送るよ」 (※ 3193 = 1733 + 1460)
「4653Byteから 1460 Byte 送るよ」 (※ 4653 = 3193 + 1460)
と3回立て続けに言っています。最終的に、4653 + 1460 Byte のデータを送っているはずです。
ここで4行目の通信は、向きが変わって「Destination」→「Source」への通信です。Ack番号(Acknowledgement number) は、6113 になっています。
ACK番号は、「6133 Byte受け取ったよ」という確認の通信を意味します。
「Source」→「Destination」の通信で最終的に送信したよ。と言っているのは、「4653 + 1460 Byte」です。
4653 + 1460 = 6133 なので、ACKの番号(受け取った Byte数)と同じで、きちんとつじつまが合っています。
WireShark の生データ pcapng を CSV にエクストポートする
tshark.exe というコマンドが WireShark 内に含まれているので、これを使って生データである、*.pcapng から必要なデータだけ CSV に抽出する事ができます。
tshark.exe は、標準で WireSharkをインストールした場合はパスが通ってないので、パスを通す必要がありました。
標準的な WireShark の GUI に表示されるカラムであれば、以下の方法で CSV に抽出する事ができます。
tshark -n -E quote=d –r [pcapngファイル] -T fields -E separator=, -e frame.number -e frame.time_epoch -e ip.src -e ip.dst -e _ws.col.Protocol -e frame.len -e _ws.col.Info > [出力 CSV ファイル名]
オプションの解説は以下の通りです。
-n: 名前解決をしない (デフォルトでは enable)
-r : <pcapng ファイル名>
-T fields : アウトプットの種類が fields
-E separator=, : セパレーターに, (カンマ) を使う
-E quote=d : 各要素を ” (double quote) でくくる。(Info カラムが “[SYN, ACK]”のように、, (カンマ)を含んでいる場合があるので )
-E header=n : ヘッダーを付けない(デフォルト no なので指定しなくて良い)
-e <フィールド名> : 出力するフィールド名を指定します。
TIPS1 ) ”Info” のデータのカラムは、 「-e _ws.col.Info」と指定する事で CSV に出力できます。
TIPS2) “プロトコル”は、「-e ip.proto」でも指定できますが、これだと数字で出力されます(例:UDPだと 17)。 「-e _ws.col.Protocol」の様に指定すると、”UDP”のような文字列でCSVに出力されます。
TIPS3) 出力したいフィールド名は WireShark の GUI から確認できます。
以下のように、データを選ぶと(この例では、[Protocol: TCP (6)]) 、ステータスバー上に、該当するデータが、WireShark 上でどのように表すか(この例では、[ip.proto])が表示されます。
処理をバッチ化する
pcapng ファイルがたくさんあると大変なので、バッチファイル化しました。
バッチを実行したディレクトリで、拡張子が、pcapng のファイルを探し、[オリジナル pcapng ファイル名].csv と言うファイルを出力します。
@echo off
setlocal enabledelayedexpansionfor %%f in (*.pcapng) do (
echo “————————————–“
echo !time! “Start Processing:” %%f
tshark -n -E quote=d -r %%f -T fields -E separator=, -e frame.number -e frame.time_epoch -e ip.src -e ip.dst -e _ws.col.Protocol -e frame.len -e _ws.col.Info > %%f.csv
echo !time! “End Procdessing ” %%f
echo “————————————–“
TIPS1) time 変数は、単純に %time% とやるとバッチ内で常に同じ値になる。
setlocal enabledelayedexpansion を宣言して
!time! を使うとOK
TIPS2) バッチファイルの中で変数を使うばあいは、
%a では無く、 %%a のようにしてあげる。
WireShark で ポートの名前解決をやめて数字表示にさせる
WireShark で新規のカラムを追加する。
例えば、トレースが表示される画面に Source IP Address の MAC アドレスのカラム(列)を追加したい場合の手順です。
① 「Edit」→ 「Preferences」 を選択します。
②この設定画面からカラムを追加
(1) 「Columns」のメニューを選ぶ
(2) 「Format」で追加するカラムを選ぶ。 ここでは、「Hwr src addr (unresolved)」を選択。
(3) 「Add」する
(4) 選択したカラムが追加される。カラムの並び順は、マウスでドラッグする事で変更できますし、カラム名も指定できます。
③トレース画面に新しいカラムが追加
ここでは、「New Column」に成っていますが、ステップ②でカラム名は任意に指定できます。
WireSharkでタイムスタンプのフォーマットを変更する。
WireSharkで特定のIPとの通信だけトレースを取る
画面の一番目立つ所にあるフィルタリングの機能は、既に取得したトレースをフィルタリングするためにあります。
そもそも取得するトレース量をあらかじめフィルターするには・・・
1)「Capture」→ 「Options」を選択
2) ボックスの部分に式を入れる
host <キャプチャーしたい通信先のIP>
でOKです。
私の場合、殆どのケースで IPアドレスのフィルタリングだけで足りてしまいます。
WireShark の負荷を減らす工夫には・・
パケットの量が多いトラフィックのキャプチャーを取っている場合は、PCがとても重くなります。
効果があるのかわかりませんが、トレースの対象となるインターフェイスをあらかじめ選択しておくことで、WirShark の処理量を減らす事ができます。(と思います)
「Capture」→「Interfaces」を選ぶとキャプチャーを取る対象を選ぶ事ができます。
例えば外部の機器との通信を計る場合は、VMware や Virtual Box の仮想インターフェイスのトレースを監視する必要はありませんし、無線LANを使う必要がなければ、無線LANをオフにしてチェックを外しておくと WireShark側としてもフィルタリングする対象が減って軽くなるんじゃないかと思います。(焼け石に水かもしれませんが)
WireShark で TCP の SEQ とACK の番号を表示させる。
TCPの通信では、データの送り手と受け手が、SEQ と ACK の交換をしながら確実にデータが相手に届いたか確認しながら、次のデータを送る。という作業を繰り返していきます。
SEQ番号 → データ送信元が受信先に送る番号。「xxxx バイト目から、1000 Byte のデータを送るよ」という時の開始の xxxxx を指す番号。
ACK番号 → データ受信先が送信元に送る番号。「yyyy バイトまでデータを受け取ったよ」という番号。
です。
WireShark の場合、デフォルトの表示画面にこの値が表示されません。これを表示させてみます。(以下、この記事作成時点での WireShark デフォルトのカラム)
1) 適当なTCP パケットを選びます。
2) 画面下部に表示される「Transmission Control Protocl」のセクションを開いて、「Sequence number: xxxx (relative sequence number) 」という部分を選択して右クリックします。
3) 「Apply as Column」を選択します。
このカラム追加の作業を他のデータに対しても行います。
「Acknowlegement number:xxxxx (relative ack number)」 と
「TCP segment Len: xxxx]
に対して同じ作業を行います。
まとめると下図のように全部で②の3つの項目をカラムとして追加する事になります。
5) 最終的に以下のように3つの列が増えているはずです。
列の順番は、マウスのドラッグで変更する事ができます。
ここでは、「TCP Segement Len」→「Sequence number」→「Acknowledgement number」の順番で入れ替えました。
ACK番号とSEQ番号の関係を WireShark上で見てみる。
せっかくなので、SEQ番号と ACK 番号がきちんと並んでいるか見てみます。
オレンジの枠で囲んだ所に注目します。
上3行は、「Source」→「Destination」の通信です。
Length の所を見るとわかるように、この3つのパケットのデータ部分のサイズ( TCP Segment Len) は、全て 1460 Byte というサイズです。
上の3つのパケットのSEQ番号(Sequence Number) の数字の番号は、1733、3193、4653 です。つまり、
「1733Byteから 1460 Byte送るよ」
「3193Byteから 1460 Byte 送るよ」 (※ 3193 = 1733 + 1460)
「4653Byteから 1460 Byte 送るよ」 (※ 4653 = 3193 + 1460)
と3回立て続けに言っています。最終的に、4653 + 1460 Byte のデータを送っているはずです。
ここで4行目の通信は、向きが変わって「Destination」→「Source」への通信です。Ack番号(Acknowledgement number) は、6113 になっています。
ACK番号は、「6133 Byte受け取ったよ」という確認の通信を意味します。
「Source」→「Destination」の通信で最終的に送信したよ。と言っているのは、「4653 + 1460 Byte」です。
4653 + 1460 = 6133 なので、ACKの番号(受け取った Byte数)と同じで、きちんとつじつまが合っています。
WireShark の生データ pcapng を CSV にエクストポートする
tshark.exe というコマンドが WireShark 内に含まれているので、これを使って生データである、*.pcapng から必要なデータだけ CSV に抽出する事ができます。
tshark.exe は、標準で WireSharkをインストールした場合はパスが通ってないので、パスを通す必要がありました。
標準的な WireShark の GUI に表示されるカラムであれば、以下の方法で CSV に抽出する事ができます。
tshark -n -E quote=d –r [pcapngファイル] -T fields -E separator=, -e frame.number -e frame.time_epoch -e ip.src -e ip.dst -e _ws.col.Protocol -e frame.len -e _ws.col.Info > [出力 CSV ファイル名]
オプションの解説は以下の通りです。
-n: 名前解決をしない (デフォルトでは enable)
-r : <pcapng ファイル名>
-T fields : アウトプットの種類が fields
-E separator=, : セパレーターに, (カンマ) を使う
-E quote=d : 各要素を ” (double quote) でくくる。(Info カラムが “[SYN, ACK]”のように、, (カンマ)を含んでいる場合があるので )
-E header=n : ヘッダーを付けない(デフォルト no なので指定しなくて良い)
-e <フィールド名> : 出力するフィールド名を指定します。
TIPS1 ) ”Info” のデータのカラムは、 「-e _ws.col.Info」と指定する事で CSV に出力できます。
TIPS2) “プロトコル”は、「-e ip.proto」でも指定できますが、これだと数字で出力されます(例:UDPだと 17)。 「-e _ws.col.Protocol」の様に指定すると、”UDP”のような文字列でCSVに出力されます。
TIPS3) 出力したいフィールド名は WireShark の GUI から確認できます。
以下のように、データを選ぶと(この例では、[Protocol: TCP (6)]) 、ステータスバー上に、該当するデータが、WireShark 上でどのように表すか(この例では、[ip.proto])が表示されます。
処理をバッチ化する
pcapng ファイルがたくさんあると大変なので、バッチファイル化しました。
バッチを実行したディレクトリで、拡張子が、pcapng のファイルを探し、[オリジナル pcapng ファイル名].csv と言うファイルを出力します。
@echo off
setlocal enabledelayedexpansionfor %%f in (*.pcapng) do (
echo “————————————–“
echo !time! “Start Processing:” %%f
tshark -n -E quote=d -r %%f -T fields -E separator=, -e frame.number -e frame.time_epoch -e ip.src -e ip.dst -e _ws.col.Protocol -e frame.len -e _ws.col.Info > %%f.csv
echo !time! “End Procdessing ” %%f
echo “————————————–“
TIPS1) time 変数は、単純に %time% とやるとバッチ内で常に同じ値になる。
setlocal enabledelayedexpansion を宣言して
!time! を使うとOK
TIPS2) バッチファイルの中で変数を使うばあいは、
%a では無く、 %%a のようにしてあげる。