はじめに
Wiresharkのパケットキャプチャの結果 (pcapファイル) からIPアドレスの繋がりを可視化しました.
本当はネットワークのグラフのようなものを作りたかったのですが,Wiresharkでは第三者同士の通信は見られないことにコードを書いている最中に気づきました……
読み込み
雑に実装.コマンドライン引数でファイル名を指定
import pyshark
import networkx as nx
import matplotlib.pyplot as plt
import sys
args = sys.argv
pcap_file = args[1]
cap = pyshark.FileCapture(pcap_file)
cap.set_debug()
グラフの作成
おなじみNetworkX.
pcapファイルはfor文でパケットごとに分割でき,送信元と送信先のIPアドレスを取れます.
通信回数をカウントしてそれを重みにします.
重みを指定すると辺の太さだけでなくノードの位置も調整してくれるんですね,すごく便利.
G = nx.Graph()
edge_count = {}
for packet in cap:
if 'IP' in packet:
src_ip = packet.ip.src
dst_ip = packet.ip.dst
if (src_ip, dst_ip) in edge_count:
edge_count[(src_ip, dst_ip)] += 1
elif (dst_ip, src_ip) in edge_count:
edge_count[(dst_ip, src_ip)] += 1
else:
edge_count[(src_ip, dst_ip)] = 1
for (src_ip, dst_ip), count in edge_count.items():
G.add_edge(src_ip, dst_ip, weight=count)
グラフの描画
plt.figure(figsize=(12, 8))
pos = nx.spring_layout(G) # ノードの位置を決定
nx.draw(G, pos, with_labels=True, node_size=50, font_size=8, font_color='black')
plt.title('Network IP Graph from pcap file')
plt.show()
結果
適当に手元の通信を直で取りましたが,良い感じに通信量が可視化できていると思います.
やはりプライベートの通信が一番多いですね.
(IPアドレスは塗りつぶしていますが,真ん中の2ノードのようにちゃんと表示されます)