発端
以前書いたとおり、僕の家のネットワークはミニPCをルーター化して運用しています
ちなみに上記記事でMinisforum N40を買ったと言ってますが、色々あり結局Skynew IN-1も買ってます
最近記事を見たASUSのミニPCも良さそうですね?
で、ルーターが普通にLinuxで動いているのでパケットキャプチャ出来るよね?
となりまして
ということはスマホ-wifi-ルーター-モデムという経路なのでルーター上でパケットキャプチャしたらスマホのパケットキャプチャも出来るよね?
となりました
リモートのパケットを標準出力に出す
標準出力に出せればsshでコマンド流してリモートのパケットをローカルに持ってこれますね?
ルーター上にパケットダンプしたファイルを置いても良いのですが、無駄にストレージ消費するのもね
ルーターだし
man tcpdump
で調べると -w
オプションでファイルに保存される模様で -w -
なら標準出力に出るようでした
他、 -w
オプションの説明に -U
オプションでバッファリングしないですぐに書き込むという説明があったので -U
オプションも追加します
NICの指定とMACアドレスでのフィルタリングが可能なので、その指定もします
LAN側のNICを出入りするパケットに対してターゲットにしたいスマホのMACアドレスを指定します
IPアドレスでのフィルタリングも出来るようでしたが、IPv4/IPv6混在してるなどがあり、MACアドレスでフィルタリングできるならそちらの方が楽そうなのでMACアドレスでのフィルタリングをします
NICの指定は -i
オプションを利用し、MACアドレスでフィルタリングする際は ether host MACアドレス
とします
ルーターのLAN側のNICが enp3s0
と認識されており、ターゲットのスマホのMACアドレスが 01:23:45:ab:cd:ef
とするとルーター上で実行するtcpdumpのコマンドラインは以下のようになります
sudo tcpdump -U -w - -i enp3s0 ether host 01:23:45:ab:cd:ef
wiresharkで標準入力を解析する
まずはヘルプを確認する
wireshark --help
どうやら -r
オプションでファイルを指定できるとの事だけど set the filename to read from (no pipes or stdin!)
とあり標準入力は入れられないらしい?
しかし -i
オプションで -
を指定すると標準入力を解析することができそうでした
標準入力にコマンドの結果を与える際に <(コマンド)
という記法が使えます
これを使うと例えばローカルとリモートのdiffなんかも見れますので便利です
diff -u /path/to/file <(ssh remote "cat /path/to/file")
こんな感じでdiff見れるし、なんならリモートAとリモートBのdiffを見るとかも出来ちゃう
wiresharkは -k
オプションを利用することで起動後すぐにパケットキャプチャの画面に移る模様
これより、ローカルマシンで実行するwiresharkのコマンドラインは以下のようになります
wireshark -k -i <(リモートのtcpdump)
まとめ
wireshark -k -i <(ssh router "sudo tcpdump -U -w - -i enp3s0 ether host 01:23:45:ab:cd:ef")
(注) .ssh/config
の設定で ssh router
でルーターにログイン出来るようにしてあります
これでwiresharkが立ち上がり、スマホを操作すると色々パケットが飛んでいることが確認できるようになりました
若干標準エラーに出る出力で邪魔だったので、最終的には以下のように標準エラーを握り潰しました
wireshark -k -i <(ssh router "sudo tcpdump -U -w - -i enp3s0 ether host 01:23:45:ab:cd:ef 2>/dev/null") 2>/dev/null
それでは良いパケットキャプチャライフを