エンジニア向け

Docker を使ったWiresharkデータ解析アプリの構築

本記事では、Docker を活用して Wireshark の pcap データを解析するアプリを構築する方法を紹介します。今回は Streamlit を使用した Web アプリを Ollama と連携させる環境を docker-compose で構築します。

前提条件

Ollamaのコンテナはすでに作成されていることを前提としています。

手順

Dockerfile の作成

まず、アプリを動作させるための Docker イメージを作成するために Dockerfile を作成します。Dockerfileの保管場所は任意です。今回の検証では、/home/<ユーザー名>の配下に作成しました。

Dockerfile
FROM python:3.10

WORKDIR /app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py ./

CMD ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]

この Dockerfile では以下の処理を行っています:

  • python:3.10 の公式イメージをベースに使用
  • 作業ディレクトリ /app を作成
  • requirements.txt をコピーし、必要なライブラリをインストール
  • app.py をコピーし、Streamlit アプリを起動
  • CMD で Streamlit のサーバーを 0.0.0.0:8501 で起動

requirements.txt の作成

requirements.txt を新規作成し、アプリで必要な Python ライブラリを 記述します。ファイル場所はDockerFileと同場所です。

Bash
streamlit
pyshark
requests

Webアプリの作成

Webアプリ(app.py)を作成します。ファイル場所はDockerFileと同場所です。

Python
# app.py
import streamlit as st
import pyshark
import requests
import json

OLLAMA_API_URL = "http://localhost:11434/api/generate"

def parse_pcap(file):
    cap = pyshark.FileCapture(file, display_filter="tcp")  # TCPパケットのみ取得
    packets = []

    for packet in cap[:10]:  # 解析対象のパケット数を制限
        info = {
            "src_ip": packet.ip.src if hasattr(packet, "ip") else "N/A",
            "dst_ip": packet.ip.dst if hasattr(packet, "ip") else "N/A",
            "protocol": packet.highest_layer,
            "length": packet.length,
            "info": str(packet)[:500],  # 長すぎる情報を制限
        }
        packets.append(info)

    cap.close()
    return packets

def analyze_with_ollama(packets):
    prompt = f"以下のネットワークトラフィックを解析してください: {json.dumps(packets, indent=2)}"
    response = requests.post(OLLAMA_API_URL, json={"model": "mistral", "prompt": prompt})

    if response.status_code == 200:
        return response.json().get("response", "解析に失敗しました。")
    return "Ollamaとの通信に失敗しました。"

# Streamlit UI
st.title("Wireshark pcap 解析ツール")
uploaded_file = st.file_uploader("PCAPファイルをアップロード", type=["pcap", "pcapng"])

if uploaded_file is not None:
    st.write("ファイルを解析中...")
    packets = parse_pcap(uploaded_file)

    if packets:
        st.write("解析結果:")
        st.json(packets)

        st.write("Ollamaによる分析:")
        analysis = analyze_with_ollama(packets)
        st.text_area("解析結果", analysis, height=200)
    else:
        st.error("パケットが解析できませんでした。")

コンテナのビルド

次に、作成した Dockerfile を基にコンテナのビルドを行います。

Bash
docker build . -t リポジトリ名:タグ名
# 例)docker build . -t wireshark:20250402

# 正常にビルドされると、以下のようなメッセージが表示されます:
# Successfully built 5fe65b4b0bc1
# Successfully tagged wireshark:20250402

コンテナの実行と動作確認

ビルドしたコンテナを実行し、正しく動作するか確認します。

Bash
docker run -it -p ホストのポート:コンテナのポート コンテナID
# 例)docker run -it -p 8501:8501 5fe65b4b0bc1

docker ps
# 作成したコンテナが表示される
# CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS         PORTS                                           NAMES
# fa17d269a008   5fe65b4b0bc1    "streamlit run app.p…"   2 minutes ago   Up 2 minutes   0.0.0.0:8501->8502/tcp, :::8501->8502/tcp       optimistic_ramanujan

これで http://localhost:8501 にアクセスすると、Streamlit のアプリが開きます。

まとめ

本記事では、Wireshark の pcap データを解析するアプリを Docker 環境で構築する方法を紹介しました。

  • Dockerfile を作成し、Streamlit ベースのアプリをコンテナ化
  • docker build でアプリを起動

今後の拡張として、pcap の解析結果を Ollama で解釈する機能を追加すると、より高度な解析が可能になるでしょう。

-エンジニア向け
-