LoginSignup
0
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

WiresharkのpcapファイルからIP間の通信頻度を可視化する

Last updated at Posted at 2024-06-21

はじめに

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ノードのようにちゃんと表示されます)

イラスト.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0