Wiresharkでssh越しにパケットキャプチャをする

この記事は約6分で読めます。

Openwrtを利用していると設定してもうまく行かない場合や、広告ブロックの設定する際の接続先確認などに、パケットの中身を確認したくなることがあります。

そこでパケットキャプチャのやり方を備忘録的に残しておきます。やり方は色々ありそうでネット上にもゴロゴロ転がっていますが、まとめておいたほうが自分で使いやすいと思います。

最初に手順を記載し、仕組みについては最後に簡単に記載しようかと思います。

tcpdumpをインストール

まず、Openwrtにtcpdumpパッケージをインストールします。

luci上でtcpdumpパッケージをインストールすることができます。もちろん、コマンドでも可能です。

wiresharkでsshdumpをインストール

Openwrtとは別端末のWindows端末でwiresharkをインストールします。(2024.4月時点でのバージョンは、4.2.4。バージョンによってインタフェースは変わります)
https://www.wireshark.org/download.html

インストール時にデフォルトのインストールでは「sshdump」はインストールされないので、インストール時の「Choose Compornent」のExternal capturetools(extcap)で、「sshdump and ciscodump」にチェックを入れてインストールする必要があります。

そのまま進めると、その他にもnpcap(windows向けのパケットスニファ)などがインストールされますが、そのままインストールしておいて問題はないと思います。

wiresharkの設定

Wiresharkを起動すると、画面の下の方に認識するインターフェイスの一覧画面があります。

その中の下の方に、「SSH remote capture」が表示されているのでダブルクリックします。(もしくは左側の歯車マークをクリックします)

Serverタブ:
 Remote SSH server address:パケットキャプチャーしたいサーバー(Openwrt)のIPを指定します。

Authenticationタブ
 Remote SSH server username:sshで接続する際のユーザー名(root)を指定します。
 Remote SSH server password:sshで接続する際のパスワード

Captureタブ
 Remote Interface:br-lan(確認したいOpenwrt上のInterface) 
 Remote capture filter:not <接続するPCが持っているinterfaceのIP> and port 22
(デフォルトでキャプチャするPCが持っているinterfaceのIPとport 22はキャプチャしない設定になっています)

※一度設定してもパスワードは保存されず、毎回パスワードの入力が必要となっているため、実行(開こうと)すると、エラーが起こってキャプチャが開始されません。毎回、開始する前にパスワードだけ設定し直す必要があります。
ちなみに、メニューバーの「編集」→「設定」を開き、「高度」の中でパスワードの設定を編集することもできます。(以下のその他の項目は上記で設定したもの)

No項目設定備考
1extcap.sshdump_exe.remotecapturecommandselecttcpdump実行されるコマンド
2extcap.sshdump_exe.remotefilter not <使用している端末が持っているinterfaceのIP> and port 22使用している端末とのsshの通信はフィルターして表示させない。※デフォルト表示で問題なし
3extcap.sshdump_exe.remotehost<OpenwrtのIP>キャプチャしたいサーバーのIP
4extcap.sshdump_exe.remoteinterfacebr-lan確認したいOpenwrt上のInterface
5extcap.sshdump_exe.remotenopromfalseNoプロミスキャスモードにするかどうか。通常、falseでプロミスキャスモード。
6extcap.sshdump_exe.remoteusername<ユーザ名>例:rootsshで接続するユーザ名
7extcap.sshdump_exe.remotepassword<ユーザーのパスワード>パスワードは一度終了すると空白に戻るため、毎回設定が必要
「高度な設定」での設定項目

ちなみに設定の中で以下のように似た設定があるので注意です。

  1. remote-capture-command
  2. remote-capture-command-select

sshdumpのドキュメント--remote-capture-command-select の説明には、以下の記載があります。

The selection of the build-in support for remote capture commands. Either dumpcap for a remote capture command using dumpcap, tcpdump for a remote capture command using tcpdump, or other, where the remote capture command is to be given with the –remote-capture-command option.

--remote-capture-command-selecttcpdump を選択すると、ビルドインのtcpdumpが使用され、 --remote-capture-command でのコマンド指定が無視されます。そのため、remote-capture-commandで直接コマンドを指定してtcpdumpを実行させる場合、--remote-capture-command-selectはotherにする必要があります。

パケットキャプチャの実行

設定ができたら後はキャプチャの実行なので、メニューバーの「キャプチャ」から「開始」でキャプチャが開始されます。「停止」で終わります。

パケットの分析

パケットキャプチャした内容を分析するにはipやプロトコルでフィルタをかけながら内容を確認していきます。以下の内容が良く使う表示フィルタです。

No条件書き方内容
1ipアドレスip.addr == <対象のIPアドレス>対象の端末とルーターのやり取りのみ表示します。
2プロトコルtcp,udp,dns,icmpなど対象のプロトコルのみ表示します。
3port番号tcp.port == <port番号>対象のport番号のみ表示します。
4and条件&& または and複数の条件をandでつなぎます。
5or条件|| または or複数の条件をorでつなぎます。
表示フィルタの記載方法

全てのパケットを拾ってからフィルタリングしていくのが基本です。フィルタの仕方については、他にも色々ありますが、詳しくは詳細を記載されているサイトがたくさんあるので、別途確認してください。

必要なパケットが把握できているのであればそれのみを拾うようにフィルタリングすれば良いと思いますが、それもきちんと拾えているか確認が必要になってくるので、全て拾うのが基本となっています。

sshdumpの仕組み

最後に、ざっくりとsshdumpの仕組みを整理しておきます。

インストールしたtcpdumpがopenwrtサーバー上で動いており、実行した結果ををssh経由でwiresharkが取得して表示しているものです。詳細は不明ですが、wireshark側でdumpcap(wiresharkの一部)を動作させ、tcpdumpの結果をssh経由でsshdumpとして受け取り、表示させているようです。

実際にopenwrtのプロセスを見ると、wiresharkで設定したコマンドが残っていることがわかります。