はじめに
Pythonを使ってネットワークのパケットを分析してみる。
今回はキャプチャーファイル(tcpdumpの結果)から作ったCSVをPythonで読み込み、プロトコル別にパケットを集計してグラフ化する。
キャプチャーファイルからCSVを作成する方法はこちらを参照。
前提
- JupyterNotebook
- 適当なtcpdumpから作ったCSVファイル(サンプルではYahooのトップページにアクセスした際のキャプチャーを使用)
必要なモジュールのインポート
今回使用するモジュールをインポートする。
なお、以降は全てJupyterNotebook上で実行している。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
CSVの読み込み
CSVをデータフレームdfに読み込む。
df = pd.read_csv('test002.csv', index_col=0)
dfの内容を表示してみる。
df
プロトコル別に集計する
データフレームのProtocol列を集計してみる。
df.Protocol.value_counts()
結果
TCP 3119
TLSv1.3 1435
TLSv1.2 599
DNS 294
OCSP 70
QUIC 39
HTTP 6
SSLv2 3
NTP 2
Name: Protocol, dtype: int64
これを新しいデータフレームdf2に入れる。
df2=pd.DataFrame(df.Protocol.value_counts())
累積(Cumulative_sum)と累積比率(Cumulative_ratio)を計算し、df2に列を追加する。
df2["Cumulative_sum"] = np.cumsum(df2["Protocol"])
df2["Cumulative_ratio"] = df2["Cumulative_sum"] / sum(df2["Protocol"]) * 100
この時点でのdf2の内容を表示してみる。
df2
パレート図を作成する
df2の内容をもとにパレート図を描画してみる。
fig = plt.figure()
ax = fig.add_subplot(111)
data_num = len(df2)
ax.bar(range(data_num), df2["Protocol"])
ax.set_xticks(range(data_num))
ax.set_xticklabels(df2.index.tolist(), rotation=90)
ax.set_xlabel("(Protocol)")
ax.set_ylabel("(Packets)")
ax_add = ax.twinx()
ax_add.plot(range(data_num), df2["Cumulative_ratio"], color='red')
ax_add.set_ylim([0, 100])
ax_add.set_ylabel("(Percent)")
このように、通信パケットの中で使用されているプロトコルをパケット数が多い順に可視化することができた。
以上。