Berkeley Packet Filter

BPF(Berkeley Packet Filter)の話題は下記に続いてですが、カーネルプログラムのことなので、本当はこちらを先にやるべきでしたが、後追いでテストしてみました。(環境は下記と同じ)

「BPF Compiler Collection」

BPF Compiler Collection

参考)
「BPFによるパケットトレース――C言語によるBPFプログラムの作り方、使い方」
https://atmarkit.itmedia.co.jp/ait/articles/1911/05/news010.html

ここで紹介されているのはカーネルにあるBPFりサンプルプログラムなので、自分の環境で動かすことはBPF以外でも使えますのでやっておく意義があります。

https://github.com/torvalds/linux/blob/v5.3/samples/bpf/sockex1_user.c
紹介されているコードは、上記カーネルの一部なので、ダウンロードしてきてビルドを試しましたが、ソースのパッケージとしてダウンロードしたものを利用した方がよいようです。

uname -r

4.15.0-202-generic

sudo apt install linux-source-4.15.0

バージョンにあったものをインストールしました。

cd /usr/src/linux-source-4.15.0/linux-source-4.15.0

sudo make olddefconfig
sudo make headers_install

sudo apt install libssl-dev
sudo apt install netperf

sudo make samples/bpf/

makeで、test_attr__openが未定義でエラーになるので、下記を参考に無効化しました。
https://github.com/bpftools/linux-observability-with-bpf/issues/46
https://lore.kernel.org/all/157111750919.12254.12122425573168365300.tip-bot2@tip-bot2/T/

tools/perf/perf-sys.h

sys_perf_event_open(struct perf_event_attr *attr,
pid_t pid, int cpu, int group_fd,
unsigned long flags)
{
int fd;

fd = syscall(__NR_perf_event_open, attr, pid, cpu,
group_fd, flags);

#undef HAVE_ATTR_TEST

#ifdef HAVE_ATTR_TEST
if (unlikely(test_attr__enabled))
test_attr__open(attr, pid, cpu, fd, group_fd, flags);
#endif
return fd;
}

対象ファイル
/usr/src/linux-source-4.15.0/linux-source-4.15.0/samples/bpf/sockex1_user.c

実行(カレントディレクトリ: /usr/src/linux-source-4.15.0/linux-source-4.15.0/samples/bpf/)

sudo ./sockex1

変更部分
実行すると下記エラーがでたことから、sockex2_user.cを参考に、setrlimit部分を追加しました。
また、pingの接続は外部コマンドで実行したのでコメント、そして監視時間を30秒の伸ばしました。

failed to create map ‘Operation not permitted’

sockex1_user.cは、下記コードとセットになって動作します。(sockex1_kern.oをロードしている)
sockex1_kern.c

実行画面

上記実行後、別コンソールでUDP通信(下記)、PING通信(ping localhost)と続いてやりました。

nc -u -l -p 9999

別コンソールで

nc -u localhost 9999

TCP通信は、内部で動作しているサーバやSSH接続によるものと思われます。

ここまで動作確認できました。

About

Categories: 未分類 タグ: