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 | 項目 | 設定 | 備考 |
1 | extcap.sshdump_exe.remotecapturecommandselect | tcpdump | 実行されるコマンド |
2 | extcap.sshdump_exe.remotefilter | not <使用している端末が持っているinterfaceのIP> and port 22 | 使用している端末とのsshの通信はフィルターして表示させない。※デフォルト表示で問題なし |
3 | extcap.sshdump_exe.remotehost | <OpenwrtのIP> | キャプチャしたいサーバーのIP |
4 | extcap.sshdump_exe.remoteinterface | br-lan | 確認したいOpenwrt上のInterface |
5 | extcap.sshdump_exe.remotenoprom | false | Noプロミスキャスモードにするかどうか。通常、falseでプロミスキャスモード。 |
6 | extcap.sshdump_exe.remoteusername | <ユーザ名>例:root | sshで接続するユーザ名 |
7 | extcap.sshdump_exe.remotepassword | <ユーザーのパスワード> | パスワードは一度終了すると空白に戻るため、毎回設定が必要 |
ちなみに設定の中で以下のように似た設定があるので注意です。
- remote-capture-command
- 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-select
でtcpdump
を選択すると、ビルドインのtcpdumpが使用され、 --remote-capture-command
でのコマンド指定が無視されます。そのため、remote-capture-commandで直接コマンドを指定してtcpdumpを実行させる場合、--remote-capture-command-select
はotherにする必要があります。
パケットキャプチャの実行
設定ができたら後はキャプチャの実行なので、メニューバーの「キャプチャ」から「開始」でキャプチャが開始されます。「停止」で終わります。
パケットの分析
パケットキャプチャした内容を分析するにはipやプロトコルでフィルタをかけながら内容を確認していきます。以下の内容が良く使う表示フィルタです。
No | 条件 | 書き方 | 内容 |
1 | ipアドレス | ip.addr == <対象のIPアドレス> | 対象の端末とルーターのやり取りのみ表示します。 |
2 | プロトコル | tcp,udp,dns,icmpなど | 対象のプロトコルのみ表示します。 |
3 | port番号 | tcp.port == <port番号> | 対象のport番号のみ表示します。 |
4 | and条件 | && または and | 複数の条件をandでつなぎます。 |
5 | or条件 | || または or | 複数の条件をorでつなぎます。 |
全てのパケットを拾ってからフィルタリングしていくのが基本です。フィルタの仕方については、他にも色々ありますが、詳しくは詳細を記載されているサイトがたくさんあるので、別途確認してください。
必要なパケットが把握できているのであればそれのみを拾うようにフィルタリングすれば良いと思いますが、それもきちんと拾えているか確認が必要になってくるので、全て拾うのが基本となっています。
sshdumpの仕組み
最後に、ざっくりとsshdumpの仕組みを整理しておきます。
インストールしたtcpdumpがopenwrtサーバー上で動いており、実行した結果ををssh経由でwiresharkが取得して表示しているものです。詳細は不明ですが、wireshark側でdumpcap(wiresharkの一部)を動作させ、tcpdumpの結果をssh経由でsshdumpとして受け取り、表示させているようです。
実際にopenwrtのプロセスを見ると、wiresharkで設定したコマンドが残っていることがわかります。