Linux Network Stack Debugging using eBPF
とりあえずLinux Kernelのネットワークスタックのデバッグ/トレースをしてみようと思う。
Bccを用いたトレース手順
今回は例としてaf_packet socketで開いたsocketでのpacket送信をtraceして、どのようなpacketが 送信されているのかをしらべてみる. また, trace開始時からどれだけパケットを送信したかもカウントする。 まとめると以下ような内容になる。
- packet_sendmsg関数にhook pointを仕掛ける
- traceする関数では以下を行う
- どのようなパケットが送られているかをprintkする
- パケット送信回数をカウントする
パケット情報表示では、ほんとはバイナリ表示したかったが、packet長のみを表示することになってしまった。 (eBPFのスクリプトが大きくなりすぎて、エラーが出てしまいできなかった。今後もしらべて行きます。。。)
実践
今回traceする関数は以下の関数です。
トレースをするために動作確認用としてpacket socketを用いてパケット送信を行うsample programを用意しました。 このプログラムを実行するとpacket socketからarpパケットが一つだけ送信されます。 gist.github.com
このプログラムで用いるlibslankdevの使用方法はこちらを参照してください github.com
本題のトレーススクリプトは以下のようになります。
実行結果を以下に示す。
$ sudo ./trace.py [1]: + sock=ffff88030b9d2f80 + msg=ffff8802daac7dc0 + len=42 [2]: + sock=ffff88030b9d2f80 + msg=ffff8802daac7dc0 + len=42 [3]: + sock=ffff88030b9d2f80 + msg=ffff8802daac7dc0 + len=42 [4]: + sock=ffff88030b9d2f80 + msg=ffff8802daac7dc0 + len=42 ^C% $
今回は簡単なtraceのみだったが、もっと複雑なことができるはず、と信じてもっと勉強しよう。 デバイスドライバの関数とかもhookできるか時間があったらしらべたい。