iPhoneのパケットキャプチャ

Mac(本投稿ではOS X 10.9〜で説明)でのiPhoneのパケットキャプチャについて投稿します。

色々なやり方があると思いますが、自分は
・HTTPリクエストとレスポンス内容を確認する場合はCharles。
・ネットワーク関連のエラー解析を行う場合はWireShark
を使っております。

上記２つについて手順や自分が思う良いところ（個人的な見解ですが。。）などついて記載します。

# Charlesを使用する場合
HTTPプロキシとしてPC上で動作し、iPhoneからのリクエストとレスポンスをモニタリングします。
参考：
http://www.charlesproxy.com/

## 手順
### Mac側
１．下記Webページの”Download a free trial”からCharlesをダウンロード/インストール。
　　　http://www.charlesproxy.com/download/
２．MacをWifiに接続。
３．Charlesのメインメニュー"Proxy"→"Proxy Settings..."を開いて下記を設定。
　　・Proxies タブでPortを8888 にセット。
      ![charlesProxy2.png](https://qiita-image-store.s3.amazonaws.com/0/37373/4be11505-5c48-b055-9dca-15eaf2a55bac.png "charlesProxy2.png")

　　・SSL タブで"Enable SSL Proxying"をチェック。
　　・Locationsに*を追加。
　　　　![charlesProxy.png](https://qiita-image-store.s3.amazonaws.com/0/37373/3411d24f-8ff6-466d-79c0-0c17b56cff82.png "charlesProxy.png")


### iPhone側
１．設定→Wi-FiでMac側と同じWifiに接続。
２．接続したWifiの( i )ボタンをタップ。
　　![config1.png](https://qiita-image-store.s3.amazonaws.com/0/37373/f7f844ac-e027-45d8-9e79-738334eb804c.png)

３．下側にスクロールして、HTTPプロキシ「手動」を選択後、下記をセット。
　　・サーバ：MacのIPアドレス（Mac側で設定→ネットワークで確認）
　　・ポート：8888
　　![  httpProxy.png](https://qiita-image-store.s3.amazonaws.com/0/37373/c2c96af0-7fa9-52e0-6dbf-ddd4ba44f6d3.png)

　　設定後、Charles上でiPhone側のHTTPパケットが見える。

４．上記HTTPプロキシ設定をした状態で、下記リンクからCharlesのSSL証明書をダウンロード＆インストール。
　　http://charlesproxy.com/getssl
　　　　　　　↓
　　![CharlesSSLProxy.png](https://qiita-image-store.s3.amazonaws.com/0/37373/9bc040b1-1c1b-e061-9313-a1b3dc95552c.png "CharlesSSLProxy.png")

設定後、Charles上でiPhone側のHTTPSパケットが見える。



## 良いと思う点
* HTTPのリクエスト/レスポンス内容が確認しやすい。
* HTTPSのリクエスト/レスポンス内容も確認できる（自分は特にこれが素晴らしいと思っています）。

## 使いづらい、惜しいと思う点
* 3G,LTEなどの電話回線でのキャプチャが出来ない。Wifi でのみキャプチャ可能（HTTPプロキシなので）。
* HTTP/HTTPS以外がキャプチャできない。
* ネットワークエラー発生時に原因がよくわからないがある（"504 Gateway timeout"発生時に”Broken Pipe”になってることがあった）。
* 無料版（トライアル版）はアプリ起動後30分で終了する。正式版は有料($50)。


# WireShark(+tcpdump)を使用する場合

iPhone側のネットワークデバイスを仮想インターフェイスとしてMac側にマウントしてパケットキャプチャする方法。
参考：
http://qiita.com/ionis_h/items/661a9a9d41cb1574e357
http://qiita.com/isaoshimizu/items/da3e74d5a8e9b1d6b6a4



## 手順
１．下記からWireSharkをダウンロード/インストール。
　　XQuartz（WireSharkで使用）も必要になるのでこれもダウンロード/インストール。
　　http://www.wireshark.org/download.html
　　https://xquartz.macosforge.org/landing/
２．MacにiPhoneをUSB接続。
３．ターミナルで下記コマンドを実行（iPhone側のネットワークをMACにアタッチ、キャプチャ開始）。
> $rvictl -s iPhoneのudid（オーガナイザに表示されるiPhoneのidentifer）
> $tcpdump -i rvi0 -w [ダンプファイル名]

４．iPhoneで適当に通信を伴う操作（アプリでwebページを開くなど）をする。
５．ターミナルで下記コマンドを実行（キャプチャ終了）。
> $rvictl -x iPhoneのudid（オーガナイザに表示されるiPhoneのidentifer）

→これでターミナルのカレントフォルダにダンプファイルが作成される。

６．WireSharkを起動。
　　※たまにWireSharkが起動しないときがありますが、Macへ再ログインすると解消する場合があります。
７．WireShark上でメインメニュー"File"→"Open..."を選択。
８．tcpdumpで作成したダンプファイルを選択。
![スクリーンショット 2014-10-13 16.01.25.png](https://qiita-image-store.s3.amazonaws.com/0/37373/dff06db5-0f7e-5a6d-ccd3-199b5109f8ed.png "スクリーンショット 2014-10-13 16.01.25.png")

上記でWireShark上でiPhone側のパケットが見える。HTTPSはSSLやTLSで暗号化されている。

##### ※Wiresharkインストールした状態でYosemite(OS X 10.10)にアップデート後、Wiresharkが起動しなくなったらターミナルで以下を試してみる。
> cd /usr; sudo ln -s /opt/X11 .
>   #Yosemiteインストーラーがシンボリックリンク/usr/X11を削除してしまうので、上記コマンドで再作成。

参考：http://kurokawh.blogspot.jp/2014/11/mac-yosemite.html


##### ※iPhone5の端末だとrvictlコマンドでiPhoneのNICにアタッチすれば、WireSharkでリアルタイムで流れているパケットが見れました。でも、iPhone5S以降の端末(arm64端末)だと、WireShark上でリアルタイムに見るとパケットが文字化けするので、上記手順の通りにtcpdumpコマンドを使わないとパケットが見れませんでした。


## 良いと思う点
* HTTP以外もキャプチャできる。
* Wifiでも電話回線(3G,4Gなど)でもキャプチャできる。
* EhternetフレームやTCP/IPレベルからキャプチャされるので詳細なエラー解析ができる。
* 無料。

## 使いづらい、惜しいと思う点
* HTTPだけ見たいときはCharlesより見づらい。
* HTTPで大きなデータがHTTPとしてキャプチャされず、TCPとしてキャプチャされているときがある。
* (Charlesと比べると)当然だが、HTTPSなどの暗号化通信は暗号化されたままキャプチャされる。


# まとめ
最初に書いた通り、自分はHTTPリクエストとレスポンス内容を確認する場合はCharles。
細かいエラー解析を行う場合はWireSharkを使っています。

これ違うよ！とかありましたらお手数ですがコメントお願いしますm(_ _)m
今回、初めての投稿でしたが誰かのお役に立つことがあれば嬉しく思います。