はじめに
PCとLAN機器の通信を解析したりログに残したいなーと思いたち、市販のUSB-LANアダプタの代わりにRaspberry Pi 4をUSB Ethernet Gadgetとして動作させ、さらに通信をmicroSDへ自動保存するパケットロガーを構築してみました。
最終的に以下の構成を実現しました。
パソコンなど
│
USB (RNDIS)
│
usb0
│
br0
│
eth0
│
家庭内LAN
Pi自身はルータではなくLinux Bridgeとして動作し、tcpdumpで通信を常時記録します。
パソコンとPiの間はUSB TypeCケーブルで接続しました。Piへの電源供給も、このTypeC端子経由でパソコン側から行う形としています。
上記構成のセットアップ作業と本記事の作成にあたっては、ネット上の様々な記事は勿論、ChatGPT先生にも全面協力頂きました(笑)。これはその成果物です。
動作確認済の環境
- Raspberry Pi 4
- Raspberry Pi OS (Bookworm/Trixie系)
- NetworkManager
- Windows 11
- USB Type-C(データ通信対応ケーブル)
0. パッケージをインストール
sudo apt update
sudo apt install rpi-usb-gadget tcpdump
事前にラズパイ4と有線LAN等で接続して apt install しておきます。
1. USB Ethernet Gadgetを有効化
まずEthernet Gadgetを有効化します。
今回は Raspberry Pi Foundation が公開している rpi-usb-gadget を利用しました。
Windowsでは標準では認識されませんでしたが、Raspberry Pi公式の RNDIS Driver をインストールすることで正常にUSB Ethernetとして認識されました。このドライバは rpi-usb-gadget のGitHubリポジトリのReleaseページからダウンロードできます。
2. Linux Bridgeを構築
Bridgeを作成します。
sudo nmcli connection add type bridge ifname br0 con-name br0
eth0をBridgeへ追加します。
sudo nmcli connection modify "Wired connection 1" \
connection.master br0 \
connection.slave-type bridge
usb0もBridgeへ追加します。
sudo nmcli connection modify "USB Gadget (shared)" \
connection.master br0 \
connection.slave-type bridge
Bridgeを起動します。
sudo nmcli connection up br0
sudo nmcli connection up "Wired connection 1"
sudo nmcli connection up "USB Gadget (shared)"
3. 動作確認
Piで
bridge link
を実行すると
eth0 master br0 state forwarding
usb0 master br0 state forwarding
となればBridge構成は成功です。
Windows側をDHCP取得へ変更すると、
192.168.0.xxx
Default Gateway 192.168.0.1
などとなり、家庭内ルータから直接IPアドレスを取得できます。
パソコンのブラウザでインターネットへ接続できることを確認しておきます。
では、続いてパケットのキャプチャ機能を追加していきます。
4. tcpdumpをインストール
sudo apt update
sudo apt install tcpdump
5. 保存ディレクトリ作成
sudo mkdir -p /data/pcap
sudo chown tcpdump:tcpdump /data/pcap
sudo chmod 755 /data
sudo chmod 775 /data/pcap
6. systemdサービス作成
/etc/systemd/system/usb-logger.serviceを以下の通り作成します。
[Unit]
Description=USB Ethernet Packet Logger
After=NetworkManager.service network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStartPre=/bin/mkdir -p /data/pcap
ExecStartPre=/bin/chown tcpdump:tcpdump /data/pcap
ExecStartPre=/bin/chmod 755 /data
ExecStartPre=/bin/chmod 775 /data/pcap
ExecStart=/usr/bin/tcpdump -i br0 -nn -U -C 50 -W 50 -w /data/pcap/capture.pcap
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
which tcpdump で実行ファイルの場所を確認してください。環境によって /usr/bin/ または /usr/sbin/ の場合があります。
7. サービス登録
sudo systemctl daemon-reload
sudo systemctl enable usb-logger.service
sudo systemctl start usb-logger.service
状態確認
sudo systemctl status usb-logger.service
正常時は
Active: active (running)
となります。
8. 動作確認
パソコンのブラウザでWebアクセスしたあと
ls -lh /data/pcap
を実行すると
capture.pcap00
capture.pcap01
...
のようなファイルが作成されているはずです。
今回は
- 50MB毎に分割
- 最大50ファイル
- 約2.5GBで循環保存
という構成にしました。
ハマりどころ
以下にハマりどころだけまとめておきます。
- WindowsではRNDIS Driverが必要だった
- rpi-usb-gadgetのGitHubリポジトリのreleaseページからインストーラを入手可能
- PiをPCに繋いでもデバイスマネージャー上で何も表示されない場合はこれが原因
- Windows Defender FirewallでICMP受信を許可すると疎通確認しやすい
- PC→Pi4の方向は通ってもPi4→PCの方向のpingが通らない現象に遭遇したがこれが原因だった
-
which tcpdumpで実行ファイルの場所を確認しておくとよい- 自分のpi4環境ではsbinでなくbin以下にあった
-
tcpdumpユーザーが保存先へ書き込めるよう権限設定が必要- そのためのExecStartPre行をusb-logger.serviceファイル中に追記した
-
bridge linkでmaster br0 state forwardingを確認すると安心
おわりに
最終的に
- Raspberry Pi 4がUSB Ethernet Gadgetとして動作
- Linux Bridgeによる透過接続
- DHCP透過
- 自動起動
- tcpdump常時保存
- 循環ログ保存
まで実現できました。
USB-LAN変換アダプタとして利用しながら、そのまま通信ロガーとして使えるため、パソコンなどとLAN機器間の通信解析に非常に便利です。
本記事が同じ用途を検討している方の参考になれば幸いです。