twNetMap

スキャンしたデータからネットワークマップを自動生成する、AI搭載ネットワーク検出ツールです。Go、Wails v2、およびSvelteで構築されています。
主な機能
- アクティブ&パッシブネットワークスキャン
- Pingチェック: ICMPを用いてホストの到達性を確認します(非特権UDP ping、OSネイティブコマンドへのフォールバック対応)。
- ARPテーブル解析: ローカルシステムおよびアクティブなSNMPエージェントからIP-MACマッピングテーブルを自動的に抽出します。
- ポートスキャン: 一般的なTCPポート(21, 22, 23, 25, 80, 110, 143, 161, 443, 3306, 3389, 5432, 8080, 9100)をスキャンします。スキャンの挙動はポートスキャンモードで設定可能です:
- OFF(デフォルト): アクティブなポートスキャンは行いません。主要ポート(21, 22, 23, 25, 80, 110, 143, 443, 8080)へのバナー取得・TCP接続試行のみで開放を確認します。ファイアウォールでブロックされやすい環境に適しています。
- 安全性重視: 1ホストあたりの同時接続数を2に制限し、スキャン間に100msのウェイトを設けてゆっくりスキャンします。
- 高速: 高並行で全ポートを並列スキャンします(従来の動作)。
- SNMPクエリ (v2c/v3): リモートエージェントに対してクエリを実行し、システム情報(
sysName、sysDesc)、物理MACアドレス、およびLLDP(Link Layer Discovery Protocol)ネイバー情報を取得します。SNMP対応デバイスでは、ポートスキャンの代わりにtcpConnTableMIB(.1.3.6.1.2.1.6.13.1.1)からオープンなTCPポート情報を取得します。 - サービスバナー取得: オープンポートに接続してSSH/FTPバナーをキャプチャし、HTMLレスポンスのタイトル等をパースしてクリーンアップします。
- AI駆動トポロジー推論
- langchaingo を使用して、複数のLLMプロバイダー(Ollama、OpenAI、Google Gemini)と連携します。
- デバイスタイプを標準カテゴリ(
router、switch、wifi、mobile、pc、server、printer、unknown)に分類します。 - LLDPトポロジー情報などの構造的推論を活用し、デバイス間のリンク関係を自動的に構築します。
- フィードバックループ: ユーザーによる手動の編集(ノード情報の修正やリンクの削除)を履歴データとして保存し、次回のAIプロンプトに優先反映することで、推論の精度をユーザーの好みに適合させていきます。
- インタラクティブなネットワークマップ可視化
vis-networkを使用して、マップを動的かつレスポンシブに描画します。- ユーザーは手動でノードやリンクの追加、編集、削除を行うことができます。
- ノードのドラッグ&ドロップによるレイアウト調整や、自動再配置を実行可能です。
- 充実したデータエクスポート機能
- 画像/ドキュメント: PNG、SVG、PDF
- 図面: Draw.io (
.drawio) - データ: JSON形式のマップデータ、JSON形式のスキャン生結果、CSV形式のノードリスト、Excelドキュメント (
.xlsx)
インストール方法
GitHubリリースからのダウンロード
GitHub Releases ページから、ビルド済みのスタンドアロンバイナリをダウンロードしてインストールできます。
macOS版
- macOS版は、署名および公証済みの PKG 形式のインストーラー(
.pkg)として提供されています。 - PKGファイルをダウンロードし、ダブルクリックして起動し、インストールウィザードの指示に従ってください。
Windows版
- Windows版はデジタル署名されていません。ダウンロードしたZIPファイルを解凍しただけでは、Windows Defender SmartScreenによって起動がブロックされる場合があります。
- ブロックを解除して起動する方法:
- ダウンロードしたZIPファイルを解凍します。
- 解凍したフォルダー内にある
twNetMap.exeを右クリックし、「プロパティ」 を選択します。 - 「全般」タブの一番下にあるセキュリティ項目で、「許可する」 または 「ブロックの解除」 にチェックを入れて「OK」をクリックします。
- または、起動時に「WindowsによってPCが保護されました」という警告画面(青い画面)が表示された場合は、「詳細情報」 をクリックし、表示された 「実行」 ボタンを押して起動してください。
Linux版
- Linux版は、スタンドアロンの実行可能バイナリを含む tar.gz アーカイブとして提供されています。
- tar.gzファイルをダウンロードして展開するだけで使用できます。特別な権限設定は不要です。
- ネットワーク環境によっては、SNMPによる情報取得(UDPポート161)やポートスキャン(各種TCPポート)の送信トラフィックが、ローカルのファイアウォール(UFWやfirewalldなど)でブロックされることがあります。その場合はファイアウォールの設定を確認してください。
操作方法
以下の手順でネットワークの検出とマップ生成を行います:
1. スキャン設定 (Scan Settings)
スキャン対象のIPアドレス範囲を設定します(192.168.1.0/24 のようなCIDR形式、192.168.1.1-192.168.1.50 のような範囲形式、またはカンマ区切りの複数ターゲット)。SNMPエージェントから情報を取得する場合は、SNMPの認証パラメータ(コミュニティ名やSNMP v3のユーザー名/パスワード)を設定します。また、ポートスキャンモード(OFF / 安全性重視 / 高速)を選択することで、TCPポートへの接触の積極性を調整できます。ファイアウォールでスキャンがブロックまたは検知されやすい環境では「OFF」または「安全性重視」の使用を推奨します。

2. AI設定 (AI Settings)
トポロジー推論に使用するLLMプロバイダー(Google Gemini、OpenAI、またはローカルで動作する Ollama)を選択し、APIキーやモデルパラメータを設定します。このLLMは、デバイス間の隣接関係の分析やデバイスタイプの自動分類に使用されます。

3. ネットワーク検出とトポロジー生成
ネットワークスキャンを実行します。スキャン完了後、検出されたデバイス情報やLLDP等の情報をAIが分析し、スイッチやルーターなどの接続関係を推論してネットワークマップを自動生成します。

4. マップの調整とエクスポート
生成されたマップは、vis-network の機能により、ドラッグ&ドロップでノードの位置を変更したり、手動でノードやリンクの追加、編集、削除を行うことができます。手動で行った編集内容はシステムに学習データとして記憶され、次回のAI推論の精度向上に役立ちます。また、デバイス情報をテーブル形式で確認したり、マップをPNG、SVG、PDF、CSV、Excel、Draw.ioファイル形式でエクスポートすることも可能です。

5. カスタムノードの追加
自動検出されなかったデバイスや、手動でエンドポイントをマップに追加したい場合は、ダッシュボード上の「+ ノード追加」ボタンをクリックします。IPアドレスまたはユニークID、表示ラベルを入力し、デバイス種別を選択して追加します。

6. ノード間の接続追加・編集・削除
手動でデバイス間にリンク(接続)を作成するには、ダッシュボード上の「+ ノード接続」ボタンをクリックします。接続元のノードと接続先のノードをドロップダウンリストから選択し、必要に応じてリンクのラベル(例:「10G, トランク, vpn」)や表示スタイルを設定して「接続追加」をクリックします。
また、Shiftキーを押しながらマップ上の2つのデバイスを順番にクリックすることでも、リンクの追加ダイアログを表示できます。

リンクの編集と削除
- 編集: マップ上のリンクをクリックして選択すると、ダッシュボードの「接続編集」ボタンが有効になります。
- 削除: リンクの編集ダイアログを開き、ダイアログ内にある「削除」ボタンをクリックします。
7. ネットワークマップのエクスポート
作成したマップや検出データを外部に保存するには、ダッシュボード上の「エクスポート」ボタンをクリックします。以下の多彩なフォーマットに対応しています:
- PNG / SVG画像: マップの視覚的なレイアウトを画像またはベクター形式で出力します。
- PDFドキュメント: マップをPDFページとして出力します。
- Draw.io ダイアグラム (.drawio): diagrams.net (Draw.io) で直接読み込んで編集可能なダイアグラムを出力します。
- マップJSON: ノードやリンク、レイアウト情報を含んだ構造化データを出力します。
- スキャンJSON: IP/MACやSNMPサービス等のスキャン結果生データを出力します。
- ノード一覧 (CSV): 検出されたデバイス詳細をCSV形式で出力します。
- Excelドキュメント: マップ画像とデバイス詳細シートを含んだ構造化されたスプレッドシートを出力します。

8. ネットワークマップの自動再配置
マップ上のノードの配置を自動で整理するには、ダッシュボード上の「自動配置」ボタンをクリックします。以下のいずれかの再配置オプションを選択できます:
- 手動配置を維持(自動配置されたノードのみ再配置): ユーザーが手動で位置を調整したノードの場所を固定したまま、新しく追加されたノードや自動検出されたノードのみを再配置します。
- すべての位置をリセット(すべてのノードを再配置): これまでの手動配置をすべてリセットし、マップ全体を再整理します。接続関係(トポロジー)が存在する場合はデバイスタイプごとに階層化(グループ化)して配置され、接続関係がないノードはIPアドレス順に10列のグリッド状に整理して並べられます。

9. 配置モード(Layout Mode)
マップ画面の左上には「⚙️ 配置モード」パネルが常時表示されており、ノードの自動レイアウト方式をリアルタイムに切り替えることができます。
| アイコン | モード | 説明 |
|---|---|---|
| 🌲 | 階層型 (Hierarchical) | デバイスタイプに基づいてノードを階層状に自動配置します。ルーター・スイッチ・PCなどが上位から下位へ整理され、ネットワーク構造が把握しやすくなります。 |
| ⚛️ | 力学モデル (Force-Directed) | ノード間の引力・斥力をシミュレートし、接続関係に応じて自然な位置に自動配置します。複雑なトポロジーを視覚的に整理するのに適しています。 |
| 📌 | 固定配置 (Static) | 自動レイアウトを無効にし、ユーザーが手動でドラッグして配置した位置を固定します。意図した通りのカスタムレイアウトを維持したい場合に使用します。 |
階層型または力学モデルを選択した場合、パネル下部に間隔(Spacing)スライダーが表示されます。このスライダーを調整することで、ノード間の距離(50px〜300px)を変更できます。
選択した配置モードと間隔の設定はブラウザの localStorage に保存されるため、次回アプリを起動した際にも引き継がれます。
10. マップのナビゲーションボタン
マップ画面の右上と右下には、vis-network の組み込みナビゲーションボタンが表示されます。
右上:パン(スクロール)ボタン
| ボタン | 機能 |
|---|---|
| ↑ | マップを上にスクロール |
| ← | マップを左にスクロール |
| ↓ | マップを下にスクロール |
| → | マップを右にスクロール |
右下:ズームボタン
| ボタン | 機能 |
|---|---|
| 🔍(中心円) | マップ全体が画面に収まるように一括表示(フィット) |
| + | ズームイン |
| − | ズームアウト |
キーボードショートカット: 矢印キー(↑←↓→)でマップをスクロール、
+/-キーでズーム操作も行えます。
データの保存場所
本アプリケーションのデータは、各OSのユーザー設定ディレクトリ内の twNetMap フォルダに保存されます。
デフォルトの保存先
- macOS:
~/Library/Application Support/twNetMap - Windows:
%APPDATA%\twNetMap(例:C:\Users\<ユーザー名>\AppData\Roaming\twNetMap) - Linux:
~/.config/twNetMap
保存されるファイル
twnetmap.db: 設定、スキャン結果、マップ情報、編集履歴などを保存する bbolt (BoltDB) データベースファイル。secret.key: APIキーやパスワードなどの機密情報をAES-256-GCMで暗号化するための暗号化キーファイル。
保存場所の変更
アプリケーション起動時に -datadir パラメータを指定することで、データの保存場所を任意のディレクトリに変更できます。
./twNetMap -datadir /path/to/custom/dir
注意事項・セキュリティについて
[!WARNING] スキャンの許可について: 本ツールは、アクティブなネットワークスキャン(ICMP Ping、TCPポートスキャン、SNMPクエリ、サービスバナー取得など)を実行します。所有していないネットワークや、スキャンの明示的な許可を得ていないネットワーク・ホストに対して実行すると、セキュリティポリシー違反や法的問題に発展する可能性があります。必ずご自身が管理しているネットワーク、またはスキャンが許可されている対象にのみ実行してください。
技術スタック
- バックエンド (Go)
- フロントエンド (Svelte & CSS)
- UIライブラリ: Svelte 5
- ビルドシステム: Vite
- スタイル: Tailwind CSS 3
- 可視化:
vis-network
プロジェクト構成
- main.go: Wailsアプリケーションを起動するデスクトップ版のエントリーポイント。
- app.go: コアデータベース操作、スキャン制御、AIロジック、およびファイルダイアログを公開するWailsバインディングメソッド群。
backend/:- ai/ai.go: システム/ユーザーLLMプロンプトの構築、およびプロバイダー認証(Gemini、OpenAI、Ollama)の処理。
- scanner/scanner.go: IP範囲の解析、ICMP/Ping、TCPポートスキャン、SNMPウォーク、およびバナー取得の実行。
- datastore/db.go: スキャン結果、ノード設定、ユーザー編集履歴を管理するローカル
bboltバケットの操作。 - datastore/crypto.go: APIキーおよびSNMPパスワードを保護するAES-256-GCM暗号化ユーティリティ。
frontend/:src/App.svelte: レイアウトとページルーティングを管理するルートビュー。src/routes/:NetworkMap.svelte: ノード/リンクを表示し、マップに対する操作を処理する可視化画面。NodeList.svelte: 検出されたデバイスをリスト/テーブル形式で編集できる画面。ScanDataModal.svelte: スキャン生データ(JSON)を参照するためのモーダルダイアログ。ScanSettings.svelte/AISettings.svelte: スキャン対象やAIプロバイダー等の管理設定画面。
ビルド方法
mise を使用することで、必要なツールチェーン(Go、Node.js)のバージョン管理と、開発やビルドのタスク実行をすべて一括で簡単に行うことができます。
前提条件
- システムに mise がインストールされていること。
- Wails CLI(miseでGoをインストール後、
go install github.com/wailsapp/wails/v2/cmd/wails@latestでインストールできます)。
ツールのセットアップ
.mise.toml で定義されている必要なバージョンの Go と Node.js をインストールします:
mise install
開発モードでの実行
ホットリロードを有効にして、デバッグモードでアプリケーションを起動します(Gitタグ情報からバージョンを自動的に取得して wails dev を実行します):
mise run dev
プロダクションビルドの作成
お使いのOS向けに、スタンドアロンのプロダクション実行可能バイナリをコンパイルします(フロントエンドアセットのビルドと、バージョンフラグを付与したGoバックエンドのビルドを自動的に実行します):
mise run build