iPadで発生する通信を確認するため、MacとWiresharkを使ってパケットキャプチャを取得しました。
基本的には参考記事と同じ手順でしたが、次の2点でつまずきました。
-
rvictlが実行できない、またはRVIの作成に失敗する - Wiresharkでキャプチャを開始すると権限エラーになる
この記事では、実際に行った手順とエラーの解消方法をまとめます。
使用したもの
今回使用したものは次のとおりです。
- Mac
- iPad
- MacとiPadを接続するUSBケーブル
- Xcode
- Wireshark
macOS、iPadOS、Xcode、Wiresharkのバージョンによって、表示や挙動が異なる可能性があります。
全体の流れ
作業の流れは次のとおりです。
- MacとiPadをUSBケーブルで接続する
- iPadのUDIDを取得する
-
rvictlを使ってRemote Virtual Interfaceを作成する - Wiresharkで作成したインターフェースを選択する
- パケットキャプチャを開始する
- 作業終了後にインターフェースを削除する
Remote Virtual Interface、以下RVIを作成すると、Mac上にiPadの通信を取得するための仮想ネットワークインターフェースが追加されます。
Wiresharkでは、このインターフェースを選択してキャプチャします。
1. MacとiPadを接続する
MacとiPadをUSBケーブルで接続します。
初めて接続する場合、iPad側に「このコンピュータを信頼しますか?」と表示されるため、「信頼」を選択します。
必要に応じて、iPadのパスコードも入力します。
Finderを開き、サイドバーにiPadが表示されることを確認します。
2. iPadのUDIDを取得する
FinderでiPadを選択します。
デバイス名の下に表示されるシリアル番号などの情報をクリックすると、表示内容が切り替わります。
UDIDが表示されたら、右クリックしてコピーします。
Xcodeを使用する場合は、次の画面でも確認できます。
Xcode
└─ Window
└─ Devices and Simulators
対象のiPadを選択し、表示されたIdentifierを確認します。
このUDIDは、後続のコマンドで使用します。
3. rvictlで仮想インターフェースを作成する
ターミナルを開き、次のコマンドを実行します。
rvictl -s <iPadのUDID>
例えば、UDIDが00000000-0000000000000000の場合は、次のようになります。
rvictl -s 00000000-0000000000000000
成功すると、次のようなメッセージが表示されます。
Starting device 00000000-0000000000000000 [SUCCEEDED] with interface rvi0
この例では、rvi0がWiresharkで選択するインターフェースです。
環境によってインターフェースの番号は異なる可能性があります。
作成状況は、次のコマンドで確認できます。
rvictl -l
つまずいた点1:rvictl: command not found
最初にrvictlを実行したところ、コマンドが見つからない状態になりました。
zsh: command not found: rvictl
command not foundと表示された場合は、主に次の点を確認します。
- Xcodeがインストールされているか
- Xcodeを一度起動したか
- Xcodeの初期セットアップが完了しているか
- 追加コンポーネントのインストールが完了しているか
- Macを再起動したか
-
/usr/binがシェルの検索パスに含まれているか
Xcodeをインストールしただけで起動していない場合は、一度Xcodeを起動します。
追加コンポーネントのインストールを求められた場合は、画面の案内に従って完了させます。
コマンドが認識されるかは、次のように確認できます。
which rvictl
認識されている場合は、次のようなパスが表示されます。
/usr/bin/rvictl
Xcodeのセットアップ後も認識されない場合は、Macの再起動も試します。
bootstrap_look_up(): 1102または[FAILED]になる場合
rvictlコマンド自体は実行できるものの、次のようなエラーになる場合があります。
bootstrap_look_up(): 1102
Starting device <UDID> [FAILED]
これは、rvictl: command not foundとは別の問題です。
この場合は、Remote Package Multiplexerのデーモンであるcom.apple.rpmuxdが読み込まれているかを確認します。
今回の環境では、次のコマンドを実行しました。
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.rpmuxd.plist
パスワード入力中は、ターミナル上に文字や記号が表示されません。
何も表示されなくても、そのまま管理者パスワードを入力してEnterキーを押します。
デーモンの状態は、次のコマンドで確認できます。
sudo launchctl list com.apple.rpmuxd
その後、もう一度RVIを作成します。
rvictl -s <iPadのUDID>
今回は、これでrvi0が作成されました。
4. Wiresharkをインストールする
WiresharkのmacOS版をインストールします。
使用しているMacのCPUに対応するパッケージを選択します。
- Appleシリコン搭載Mac:Arm版
- Intel搭載Mac:Intel版
ダウンロードしたディスクイメージを開き、WiresharkをApplicationsフォルダへ移動します。
5. Wiresharkのキャプチャ権限を設定する
Wiresharkを起動したところ、次の警告が表示されました。
You don't have permission to capture on that device
環境によっては、次のように表示されることもあります。
You don't have permission to capture on local interfaces.
You can fix this by installing ChmodBPF.
つまずいた点2:BPFデバイスの権限不足
macOSでは、Wiresharkがパケットを取得するために、BPF(Berkeley Packet Filter)デバイスへアクセスする必要があります。
今回は、Wiresharkに表示された警告メッセージ内のリンクからChmodBPFをインストールしました。
手順は次のとおりです。
- Wiresharkの警告メッセージ内にあるChmodBPFのリンクを開く
-
Install ChmodBPF.pkgを起動する - インストーラーの案内に従って進める
- macOSの管理者パスワードを入力する
- Wiresharkを終了する
- Wiresharkを再度起動する
警告メッセージ内にリンクがない場合は、Wiresharkのインストールに使用したディスクイメージを開き、Install ChmodBPF.pkgを直接実行します。
ChmodBPFのインストール後、権限エラーは表示されなくなりました。
参考記事には、次のコマンドで/dev/bpf*の所有者を変更する方法も掲載されています。
sudo chown "$(whoami)":admin /dev/bpf*
ただし、デバイスファイルの権限を手動で変更する前に、Wireshark公式パッケージに含まれるChmodBPFを利用するのがよさそうです。
今回も、ChmodBPFのインストールで解消しました。
6. Wiresharkでキャプチャを開始する
Wiresharkを起動すると、キャプチャ可能なインターフェースの一覧にrvi0が表示されます。
rvi0をダブルクリックすると、iPadの通信のキャプチャが始まります。
目的の通信だけを確認しやすくするため、今回は次の順序で操作しました。
- iPad上の対象アプリを終了する
- Wiresharkで
rvi0のキャプチャを開始する - iPad上で確認したい操作を行う
- 操作が終わったら、すぐにキャプチャを停止する
- 必要に応じてpcapng形式で保存する
パケットキャプチャは対象時間を短くし、確認したい通信だけを発生させると解析しやすくなります。
表示フィルターの例
DNS通信だけを表示する場合は、次のフィルターを使用します。
dns
特定のIPアドレスとの通信を確認する場合は、次のように指定します。
ip.addr == 192.0.2.1
TCP通信だけを確認する場合は、次のように指定します。
tcp
TLS通信だけを確認する場合は、次のように指定します。
tls
RVIではiPadのネットワークスタックを通過する通信を取得できます。
ただし、HTTPSなどで暗号化された通信は、パケットを取得しただけではアプリケーションデータの内容まで確認できない場合があります。
7. 仮想インターフェースを削除する
キャプチャ終了後は、次のコマンドでRVIを削除します。
rvictl -x <iPadのUDID>
成功すると、次のように表示されます。
Stopping device <iPadのUDID> [SUCCEEDED]
RVIが削除されたことは、次のコマンドで確認できます。
rvictl -l
エラーと対処方法の整理
rvictl: command not found
次の内容を確認します。
- Xcodeがインストールされているか
- Xcodeを一度起動したか
- 初期セットアップが完了しているか
- 追加コンポーネントがインストールされているか
- 必要に応じてMacを再起動したか
-
/usr/binがPATHに含まれているか
bootstrap_look_up(): 1102またはRVI作成失敗
次の内容を確認します。
-
com.apple.rpmuxdが読み込まれているか - MacとiPadがUSBケーブルで接続されているか
- iPad側でMacを「信頼」したか
- UDIDが正しいか
- FinderやXcodeからiPadを認識できているか
You don't have permission to capture on that device
次の内容を確認します。
- Wireshark公式パッケージに含まれるChmodBPFをインストールしたか
- Wiresharkを再起動したか
- 必要に応じて、MacからログアウトまたはMacを再起動したか
注意点
パケットキャプチャには、次のような機密情報が含まれる可能性があります。
- 接続先のホスト名
- IPアドレス
- DNSの問い合わせ内容
- Cookieや認証に関係する情報
- 利用しているサービスやアプリを推測できる情報
取得したファイルを第三者へ共有する場合は、内容を確認し、不要なパケットや個人情報を削除してから共有します。
業務端末や第三者が利用するネットワークでキャプチャする場合は、所属組織の規則や許可範囲も確認する必要があります。
まとめ
iPadのパケットキャプチャは、Mac上にRVIを作成し、Wiresharkでそのインターフェースを選択することで取得できます。
今回つまずいたのは、次の2点でした。
-
rvictl周辺のセットアップ - WiresharkからBPFデバイスへアクセスする権限
rvictl: command not foundの場合は、Xcodeのインストール状態や初期セットアップ、PATHを確認します。
bootstrap_look_up(): 1102などのエラーでRVIを作成できない場合は、Remote Package Multiplexerのデーモンを確認します。
Wiresharkの権限エラーは、警告メッセージ内のリンクからChmodBPFをインストールすることで解消しました。
エラーの種類ごとに原因を切り分けることが、解決への近道でした。