概要 スマホの通信をパケットキャプチャする。動機としてはスマホゲームをやってるときにかなりの頻度でロード中に固まってそのままタイムアウトする現象が引っ越してから発生しており、何らかの原因がわかるかなと思ったため。 結果的には現時点では原因は不明だが、パケットキャプチャ環境を作っていたら色々勉強になったのでやり方をメモしておくことにする。 手順の概要 最終的には下記のような構成で"PC"にてパケットをキャプチャした。 図を見ると明らかだと思うが、PCにはNICが2つ搭載しているのでこれを利用して、PCをルーターのように使いスマホ側のNICのパケットを取るという手法。ちなみにPC2というのがあるが、これは疎通確認やRouter2の設定などスマホではやりにくい操作を行うためのノートPCでキャプチャには無くても良い。むしろキャプチャ中はPCからではPC2のパケットなのかスマホからのパケットなのかがわからなくなるので外していた。 大まかな手順は下記の通り。 図のように各種機器を接続する(Router2とスマホの間はWi-Fiであり、それ以外は有線) PCのインターネット側のNICはDHCPによるIP割当を受ける、スマホ側(図下側)のNICは手動にて192.168.10.1/24を設定する PCについてipv4がフォワード設定ONとなっていることを確認する PCについてスマホ側のNICにてiptablesを用いてNATを設定する PCについてスマホ側のNICにてdhcpdを起動してIP自動割当を可能にする PCについてスマホ側のNICにてiptablesでDNSとDHCPのパケットを遮断しないよう設定する Router2をルーターモードで起動してPCからDHCPでIP割当を受ける(ローカルルーターモード) スマホを接続して疎通確認する 問題なければキャプチャする これを見ると、Router2はブリッジモードのほうが良いように思うが、ブリッジモードだと何故かうまく動かなかったので今回は面倒だったがルーターモードで実施した。 以下に詳細な手順を残しておく。 手順に関するメモ 前提 PCのOSはArch Linuxである PCのインターネット側のNICをeno1とする(実際にはKVM向けのブリッジを作っていたのでbr0だが、eno1と置き換えて記載する) PCのスマホ側のNICをeno2とする Router2はAterm WX1500HPである スマホはAndroidスマホである NICに手動でIPアドレスを設定する PCにてスマホ側のNICには手動でIPアドレスを設定する。今回は192.168.10.1とした。 $ ip addr add 192.168.10.1/24 dev eno2 PCのipv4フォワードがONになっていることを確認する net.ipv4.ip_forwardがON(1)になっていなければならない。下記のようにして確認する。 $ sudo sysctl -a | grep 'ip_forward' net.ipv4.ip_forward = 1 net.ipv4.ip_forward_update_priority = 1 net.ipv4.ip_forward_use_pmtu = 0 なっていなければ、設定を変更する。パケットキャプチャ環境は永続させるようなものではないので今回の起動中だけONであれば良い。そのためコマンドで下記のように一時的に変更する。 $ sudo sysctl net.ipv4.ip_forward=1 また、念の為デフォルトルートを次の通りに変更しておく。 $ sudo ip route del default $ sudo ip route add default via 192.