本記事では、Docker を活用して Wireshark の pcap データを解析するアプリを構築する方法を紹介します。今回は Streamlit
を使用した Web アプリを Ollama
と連携させる環境を docker-compose
で構築します。
前提条件
Ollamaのコンテナはすでに作成されていることを前提としています。
手順
Dockerfile の作成
まず、アプリを動作させるための Docker イメージを作成するために Dockerfile
を作成します。Dockerfile
の保管場所は任意です。今回の検証では、/home/<ユーザー名>の配下に作成しました。
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と同場所です。
streamlit
pyshark
requests
Webアプリの作成
Webアプリ(app.py)を作成します。ファイル場所はDockerFileと同場所です。
# 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
を基にコンテナのビルドを行います。
docker build . -t リポジトリ名:タグ名
# 例)docker build . -t wireshark:20250402
# 正常にビルドされると、以下のようなメッセージが表示されます:
# Successfully built 5fe65b4b0bc1
# Successfully tagged wireshark:20250402
コンテナの実行と動作確認
ビルドしたコンテナを実行し、正しく動作するか確認します。
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
で解釈する機能を追加すると、より高度な解析が可能になるでしょう。