バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-network-backnumber/
はじめに
npcapのフィルタ文字列コンパイルAPIについて
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
npcapのフィルタ文字列コンパイルAPI

今回はnpcapのフィルタ文字列コンパイルAPIについて。
- pcap_datalink:デバイスのリンクタイプ取得
- pcap_compile:フィルタ文字列をコンパイルしてbpf_program構造体を取得 ← これ
- pcap_setfilter:bpf_program構造体を元にパケットフィルタ有効化
- pcap_loop:キャプチャ処理

これはまた毛色の違いが大きそうなAPIだね!

うん。
サンプルプログラムのudpdumpの中では
“ip and udp”
という文字列を渡しているね。
たぶん、udpだけとフィルタしてキャプチャしてるんだと思う。
pcap_compileに渡すフィルタ文字列の仕様

ところで、このフィルタ文字列はどういった仕様になるの?

どうやら、tcpdumpの仕様に準拠するらしいんだよねー。
tcpdumpはUnix系で良く使われるコマンドラインのパケットキャプチャらしい。
tcpdumpとは、コマンドライン上で利用する一般的な計算機ネットワーク調査ツールである。 tcpdumpにより、利用者はコマンドを実行した計算機がつながっているネットワーク上を流れるTCP/IPなどのパケットを横取って、表示させることが出来る。 このプログラムは開発当時にローレンス・バークリー研究所ネットワーク研究グループに所属していたバン・ジェイコブソン、Craig Leres、Steven McCanneによって書かれた。
Wikipediaより

なるほど。

で、肝心の文字列の仕様は?

tcpdumpのmanを読めとあったんだけど・・・。
man tcpdump

まぁこれ読んでもイマイチわからないんだよねー。
tcpdumpのフィルタ書式

じゃー、ここは私が解説しよう。

おー!久々だね。
最近はずっと「ほー!」「なとほど」とかしか言ってなかったのに!

太郎くんの頑張りを見守ってたんだよー!

とりあえず、全部覚えるってのは一旦諦めて、
以下のパターンだけ覚える。
- 特定のMACアドレスだけフィルタ
- 特定のIPアドレスだけをフィルタ
- 特定のIPアドレス且つ特定のポートをフィルタ

この3つに絞った理由は?

lwIP上で動作確認する際に使いそうなフィルタだね。
まぁ今回はWiresharkで見ると思うから使わないと思うけど、
目的を絞って説明しないと終わりが決められない。

まぁいろんな書き方があるみたいだもんねー。
特定のMACアドレスだけフィルタ
ether host aa:bb:cc:11:22:33
特定のIPアドレスだけをフィルタ
ip host 192.168.40.100
特定のIPアドレス且つ特定のポートをフィルタ
ip host 192.168.40.100 and port 80

とりあえず、今回はここまでかな。
まとめ

まとめだよ。
- npcapのフィルタ文字列コンパイルAPIについて説明。
- フィルタ文字列仕様はtcpdumpのフィルタ書式と一緒。
- tcpdumpのフィルタ書式はかなり数が多いため、良く使用しそうなものに限定。
- MACアドレスフィルタ。
- IPアドレスフィルタ。
- IPアドレとポートをフィルタ。

(久々のフクさんのまとめ・・・。)
バックナンバーはこちら。
コメント