Oh, nice packet

slankdevの報告

Linux Network Stack Debugging using eBPF

とりあえずLinux Kernelのネットワークスタックのデバッグ/トレースをしてみようと思う。

Bccを用いたトレース手順

  1. デバッグ対象を決める
    • hookポイント
    • trace内容
  2. それに対して必要なスクリプトを書く (bcc, bpf, python, c)
  3. スクリプトを動かしてTraceを確認する

今回は例としてaf_packet socketで開いたsocketでのpacket送信をtraceして、どのようなpacketが 送信されているのかをしらべてみる. また, trace開始時からどれだけパケットを送信したかもカウントする。 まとめると以下ような内容になる。

  • packet_sendmsg関数にhook pointを仕掛ける
  • traceする関数では以下を行う
    • どのようなパケットが送られているかをprintkする
    • パケット送信回数をカウントする

パケット情報表示では、ほんとはバイナリ表示したかったが、packet長のみを表示することになってしまった。 (eBPFのスクリプトが大きくなりすぎて、エラーが出てしまいできなかった。今後もしらべて行きます。。。)

実践

今回traceする関数は以下の関数です。

github.com

トレースをするために動作確認用としてpacket socketを用いてパケット送信を行うsample programを用意しました。 このプログラムを実行するとpacket socketからarpパケットが一つだけ送信されます。 gist.github.com

このプログラムで用いるlibslankdevの使用方法はこちらを参照してください github.com

本題のトレーススクリプトは以下のようになります。

gist.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できるか時間があったらしらべたい。

参考文献