mcpField
R
routeros-sniffer

routeros-sniffer

github.com/tikociクラウド・DevOps8346 回インストール5 日前に更新
リポジトリ

routeros-sniffer について

RouterOSのネットワーク調査を行う管理者やエージェント向けのパケットキャプチャスキルです。内蔵スニファー、ファイル保存、TZSP配信、ファイアウォールmangleによる対象トラフィックのミラーリングと制約を説明します。

主な機能

  1. 01インターフェース、プロトコル、アドレスでのキャプチャ絞り込み
  2. 02PCAPNGファイルまたはメモリバッファへの保存
  3. 03TZSPによるパケットのライブ配信
  4. 04mangleルールによる対象トラフィックのミラーリング
  5. 05キャプチャの制約と後片付けの確認

活用シーン

  1. 01RouterOS上のネットワークプロトコルの調査
  2. 02ライブトラフィックをWiresharkへ送り分析
  3. 03後から分析するためのパケット保存
  4. 04QEMU CHRでのキャプチャ設定のテスト

MCP 対応

READMEでは、RouterOSドキュメントの検索にrosetta MCPサーバーを利用できると説明されています。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/tikoci/routeros-skills --skill routeros-sniffer

インストール後、Claude Code で/routeros-snifferを入力して読み込まれたか確認します。

同梱ファイルreferences/tzsp-receivers.md

詳細

RouterOS のパケットキャプチャと TZSP ストリーミング

RouterOS には、組み込みのパケットスニファー(/tool/sniffer)と、トラフィックをミラーリングするファイアウォールのマングルアクションが用意されています。トラフィックは、ルーター上のファイルに保存するか、TZSP(TaZmen Sniffer Protocol)を介してリモートホストにライブストリーミングできます。tcpdump などの標準ツールは存在しないため、RouterOS でパケットをキャプチャする主な方法です(routeros-fundamentals スキルを参照)。

エージェントにとっての重要性

RouterOS でネットワークプロトコルの問題をデバッグする際、エージェントは次の方法を利用できることを把握しておく必要があります。

  1. TZSP を介してルーターからホストマシンにパケットをライブストリーミングできます。CHR VM を使用する場合、ハードウェアは不要です
  2. ルーターのフラッシュにpcap/pcapng ファイルを保存し、ダウンロードして分析できます
  3. ファイアウォールのマングルルールを使って、スニファーの設定に触れずに、フロー単位で対象を絞ったパケットミラーリングを行えます

QEMU CHR インスタンスと組み合わせると(routeros-qemu-chr スキルを参照)、物理ハードウェアなしで、パケットレベルのデバッグワークフローを一通り実行できます。

方法 1:/tool/sniffer(フル機能のキャプチャツール)

組み込みのスニファーは、指定したインターフェース上のパケットを、幅広いフィルターを使ってキャプチャします。3 つの独立した出力モードに対応しており、組み合わせて使用できます。

出力設定備考
メモリーバッファー(常時有効)quick、packet、protocol、host、connection の各サブメニューで表示できます。パケットは 10 分間利用できます
フラッシュ上のファイルfile-name=capture.pcapRouterOS 7.20 以降は PCAPNG 形式です
TZSP ストリームstreaming-enabled=yesstreaming-server の streaming-port に UDP で送信します(デフォルトは 37008)
ライブ TZSP ストリーミング
# Configure sniffer to stream via TZSP to a remote host
/tool/sniffer
set streaming-enabled=yes streaming-server=<RECEIVER-IP>:37008

# Optional: filter to a specific interface or protocol
set filter-interface=ether1
set filter-ip-protocol=icmp

# Start capture (runs until stopped or router reboots)
/tool/sniffer/start

# Stop when done
/tool/sniffer/stop

受信ホストでは、Wireshark、tshark、または TZSP 対応の別のツールを実行します(TZSP 受信ツールのリファレンスを参照)。

ファイルベースのキャプチャ
# Capture to file on router flash
/tool/sniffer
set file-name=capture.pcap filter-interface=ether1

/tool/sniffer/start
# ... let it capture ...
/tool/sniffer/stop

# Or save the memory buffer to a file manually
/tool/sniffer/save file-name=/flash/debug.pcap

# Download via SCP or fetch
# From the host:
# scp admin@<ROUTER-IP>:/flash/debug.pcap .

ファイルへの保存とストリーミングは同時に実行できます。

/tool/sniffer
set file-name=capture.pcap streaming-enabled=yes streaming-server=<RECEIVER-IP>:37008
/tool/sniffer/start
クイックモード(対話型 CLI)

ルーターのコンソール上で手早く単発の調査を行う場合は、次の方法を使用します。

# Quick-capture ICMP traffic on ether1
/tool/sniffer/quick ip-protocol=icmp interface=ether1

コンソールに、送信元/宛先 MAC、IP、プロトコル、サイズを含む、リアルタイムでスクロールするテーブルが表示されます。

スニファーフィルターのプロパティ

/tool/sniffer/set で使用できる主なフィルターオプションは次のとおりです。

プロパティ説明
filter-interfaceインターフェース名または all(デフォルト:all)
filter-ip-address最大 16 個の IP/マスクエントリー
filter-dst-ip-address最大 16 個の宛先 IP/マスクエントリー
filter-src-ip-address最大 16 個の送信元 IP/マスクエントリー
filter-port最大 16 個のポート(! による否定に対応)
filter-ip-protocol最大 16 個のプロトコル(tcp、udp、icmp など)
filter-mac-protocol最大 16 個の MAC プロトコル(ip、arp、ipv6、vlan など)
filter-directionany、rx、または tx
filter-streamyes/no — スニファー自身の TZSP パケットを除外します(デフォルト:yes)
filter-vlan最大 16 個の VLAN ID
memory-limitメモリーバッファーのサイズ(デフォルト:100 KiB)
file-limitファイルの最大サイズ(デフォルト:1000 KiB)
only-headersパケット全体ではなく、ヘッダーのみを保存します

重要: filter-stream=yes(デフォルト)にすると、キャプチャからスニファー自身の TZSP ストリームパケットが除外されます。フィードバックループを避けるため、この設定は有効のままにしてください。

方法 2:ファイアウォールマングル(対象を絞ったミラーリング)

ファイアウォールのマングルルールでは、ファイアウォールのマッチャー全体を使って、フロー単位で細かくミラーリングできます。スニフ関連のアクションは 2 つあります。

action=sniff-tzsp(リモート TZSP 受信ツールへのストリーミング)

一致するパケットを TZSP としてリモートホストにミラーリングします。ファイアウォールのマッチングエンジン全体(送信元/宛先アドレス、プロトコル、ポート、接続状態、インターフェースなど)を使用します。

# Mirror all forwarded ICMP to a TZSP receiver
/ip/firewall/mangle
add action=sniff-tzsp chain=forward protocol=icmp \
    sniff-target=<RECEIVER-IP> sniff-target-port=37008 \
    comment="TZSP mirror ICMP to Wireshark"

# Mirror traffic from a specific host
/ip/firewall/mangle
add action=sniff-tzsp chain=forward src-address=192.168.88.100 \
    sniff-target=<RECEIVER-IP> sniff-target-port=37008

# Mirror DNS queries
/ip/firewall/mangle
add action=sniff-tzsp chain=forward protocol=udp dst-port=53 \
    sniff-target=<RECEIVER-IP> sniff-target-port=37008

sniff-tzsp のプロパティ:

  • sniff-target(IP)— TZSP UDP パケットの宛先 IP
  • sniff-target-port(ポート、デフォルトは 37008)— 宛先 UDP ポート
  • sniff-id — 任意の識別タグ

主な動作: sniff-tzsp は passthrough のように動作します。一致した後、パケットは次のマングルルールに進みます。元のパケットは変更もドロップもされず、コピーのみが TZSP として送信されます。

Mangle と /tool/sniffer:どちらを使うか
シナリオ使用するもの
インターフェース上のすべてのトラフィックをキャプチャする/tool/sniffer
特定のフロー(IP、ポート、プロトコル別)をミラーリングするMangle sniff-tzsp
ルーターのフラッシュに pcap ファイルを保存する/tool/sniffer と file-name
Wireshark/tshark にリアルタイムでストリーミングするどちらでも可 — /tool/sniffer と streaming-enabled、または Mangle sniff-tzsp
異なる受信先へ複数の独立したミラーを送るMangle ルール(ターゲットごとに1つ)
CLI で素早く対話的に表示する/tool/sniffer/quick

TZSP プロトコルの概要

TZSP はシンプルな UDP カプセル化方式です。ルーターは元の Ethernet フレームを TZSP ヘッダーで包み、UDP データグラムとして送信します。

UDP (port 37008) → TZSP header (4 bytes) → tags (variable) → TAG_END → original Ethernet frame
  • デフォルトポート: 37008(0x9090) — IANA 登録ポートではありませんが、RouterOS/Wireshark の標準です
  • カプセル化: 通常は Ethernet(タイプ 1)です。ワイヤレスキャプチャでは 802.11 を使用します
  • タグ: オプションのメタデータ(WLAN の信号強度、チャネルなど)です。Ethernet キャプチャには通常タグがありません
  • キープアライブ: タイプ 4(Null)パケットが定期的に送信されます。内部フレームはないため、処理時にこれらをフィルタリングしてください

CHR テストパターン

QEMU CHR インスタンスを使うと、ハードウェアなしで完全なパケットキャプチャラボを構築できます。無料の CHR ライセンスには速度制限 1 Mbpsがありますが、プロトコルのデバッグやスニファーのテストには十分です。

# 1. Boot a CHR instance with port forwarding for REST API and SSH
qemu-system-x86_64 -M q35 -m 256 \
  -drive file=chr.img,format=raw,if=virtio \
  -netdev user,id=net0,hostfwd=tcp::9180-:80,hostfwd=tcp::9122-:22 \
  -device virtio-net-pci,netdev=net0 \
  -display none -serial stdio

# 2. Configure sniffer via REST API once booted
curl -u admin: -X POST http://<router-ip>/rest/tool/sniffer/set \
  -H 'Content-Type: application/json' \
  -d '{"streaming-enabled":"yes","streaming-server":"10.0.2.2:37008"}'

# 3. Start capture
curl -u admin: -X POST http://<router-ip>/rest/tool/sniffer/start

# 4. Listen for TZSP on the host
tshark -i any -f "udp port 37008" -O tzsp

# 5. Generate test traffic (e.g., ping from the CHR)
curl -u admin: -X POST http://<router-ip>/rest/ping \
  -H 'Content-Type: application/json' \
  -d '{"address":"8.8.8.8","count":"3"}'

QEMU のユーザーモードネットワークに関する注意: CHR のデフォルトゲートウェイ(10.0.2.2)はホストです。QEMU の -netdev user を使用する場合は、この IP を streaming-server に指定してください。TZSP パケットを受信するには、ホストがすべてのインターフェース(または 10.0.2.2 のみ)でリッスンしている必要があります。

QEMU のセットアップの詳細については、routeros-qemu-chr スキルを参照してください。CHR ライセンスの詳細(無料プラン、60 日間のトライアル、速度制限)については、CHR ライセンスを参照してください。

注意点

  • ハードウェアオフロードされたブリッジトラフィックはスニファーに表示されません。表示される可能性があるのは、フラッディングされたパケット(宛先不明のユニキャスト、ブロードキャスト、マルチキャスト)のみです
  • ワイヤレスクライアント間のユニキャストは、フォワーディングが有効でも表示されません
  • メモリー内のスニファーパケットは10分後に期限切れになります。 永続的にキャプチャするには、ファイルに保存するかストリーミングを使用してください
  • PCAPNG 形式(RouterOS 7.20 以降)が保存ファイルのデフォルトです。古いツールでは PCAP が必要な場合があります
  • filter-stream=yes(デフォルト)は重要です。これを無効にすると、スニファーが自身の TZSP ストリームパケットをキャプチャし、フィードバックループが発生します
  • CHR の速度制限 1 Mbpsにより、キャプチャが「遅く」なる場合があります。これは無料ライセンスの制限であり、スニファーの問題ではありません。CHR ライセンスを参照してください
  • file-limit は空きメモリーを超えないようにしてください。 ルーターがクラッシュしたり、予期しない動作をしたりする可能性があります

クリーンアップ

デバッグ後は、必ずスニファー設定と Mangle ルールを削除してください。

# Stop sniffer
/tool/sniffer/stop

# Reset sniffer config to defaults
/tool/sniffer
set streaming-enabled=no streaming-server=0.0.0.0 file-name=""

# Remove mangle rules (find by comment)
/ip/firewall/mangle/remove [find comment~"TZSP"]

その他のリソース

リファレンスファイル:

関連スキル:

  • QEMU CHR のセットアップと起動パターンについては、routeros-qemu-chr スキルを参照してください
  • CHR ライセンス(無料プラン、60 日間のトライアル、速度制限)については、routeros-qemu-chr スキルを参照してください
  • RouterOS CLI/REST の基本については、routeros-fundamentals スキルを参照してください
  • /console/inspect コマンドツリーについては、routeros-command-tree スキルを参照してください

MCP ツール:

  • RouterOS ドキュメントの検索には、rosetta MCP サーバーのツール(routeros_search、routeros_get_page)を使用してください

コメント