snoop: ردیاب سیستمکال لینوکس با eBPF
خلاصهٔ کاملتر
اگه تا حالا با strace کار کرده باشی، میدونی که چقدر میتونه آزاردهنده باشه — خروجی خام و ناخوانا، و مهمتر از همه اینکه پروسهی هدف رو روی هر سیستمکال متوقف میکنه. snoop اومده این مشکلها رو حل کنه.
snoop یه syscall tracer برای لینوکسه که زیر کاپوتش از eBPF tracepoint استفاده میکنه. این یعنی ردیابی کاملاً داخل کرنل اتفاق میافته و پروسهی هدف با سرعت کامل به کارش ادامه میده. دیگه نه freeze، نه کند شدن.
یکی از بهترین ویژگیهاش TUI زندهست. وقتی snoop رو بدون --raw اجرا کنی، یه صفحهی تمامعرض میبینی که جریان سیستمکالها رو در لحظه نشون میده، همراه با یه پنل جانبی که پرتکرارترین سیستمکالها رو رتبهبندی میکنه. میتونی جستجو کنی، فیلتر بزنی، پاز کنی و دوباره ادامه بدی.
snoop آرگومانهای بیش از ۶۰ سیستمکال رو decode میکنه — مسیرها، فلگها، آدرسهای شبکه — همه چیزی که معمولاً باید خودت توی man page دنبالش میگشتی. مثلاً به جای اینکه یه عدد هگز ببینی، مستقیم میخونی connect(5, 93.184.216.34:443).
فیلترهای خوبی هم داره. میتونی فقط سیستمکالهای فایل سیستم رو ببینی (--files)، یا فقط شبکه (--net)، یا فقط اونهایی که کندتر از یه آستانهی مشخص بودن (--slow 5). حتی میتونی روی یه سیستمکال خاص فیلتر بزنی:
sudo snoop -p 1234 --syscall openat --syscall readیه حالت جالب دیگهش --explain هست که سیستمکالهای خام رو گروهبندی میکنه و خلاصهی سطح بالاتری نشون میده. مثلاً به جای دیدن ۱۸ تا read متوالی، میبینی که اپ ۴ کیلوبایت از پورت ۵۴۳۲ دریافت کرده.
قابلیت ضبط و پخش مجدد هم داره. میتونی یه trace رو روی دیسک ذخیره کنی و بعداً بدون نیاز به root دوباره پخشش کنی. از همه باحالتر، حالت diff هست که بهت نشون میده بعد از یه deploy چه چیزی تغییر کرده:
snoop diff before.snoop after.snoopخروجیش مثلاً میگه read چقدر کندتر شده یا چه سیستمکال جدیدی اضافه شده — خیلی به درد regression testing میخوره.
برای کانتینرها هم پشتیبانی داره. با --docker یه کانتینر Docker رو ردیابی میکنی و با --pod روی یه پاد Kubernetes. حتی میتونی با --tls ترافیک رمزنگاریشده OpenSSL رو به صورت plaintext ببینی، چون مستقیماً SSL_write و SSL_read رو hook میکنه.
خروجی JSON هم داره که میشه با jq پردازشش کرد:
sudo snoop -p 1234 --json | jq 'select(.name == "connect")'از نظر فنی، snoop با Rust نوشته شده و از کتابخونهی aya برای نوشتن برنامههای eBPF استفاده میکنه. برنامههای BPF در زمان build کامپایل و داخل باینری embed میشن، پس نه نیاز به ماژول کرنل داری، نه C toolchain، نه هدرهای کرنل. فقط لینوکس ۵.۸ به بالا (برای BPF ring buffer) و دسترسی root یا CAP_BPF + CAP_PERFMON لازمه.
نکات کلیدی:
- به جای ptrace از eBPF استفاده میکنه — پروسه متوقف نمیشه
- TUI زنده با جستجو، فیلتر، پاز و پنل آمار سیستمکال
- decode آرگومانهای ۶۰+ سیستمکال به شکل خوانا
- پشتیبانی از Docker و Kubernetes
- ضبط، پخش مجدد و diff بین دو trace
- TLS decryption از طریق uprobe روی OpenSSL
- خروجی JSON برای پردازش با jq
- نیاز به لینوکس ۵.۸+ و معماری x86_64 یا aarch64




