NETSNIFF-NG(8) netsniff-ng toolkit NETSNIFF-NG(8)

netsniff-ng - ابزار پرقدرت اسنیف و تحلیل بسته‌های شبکه

netsniff-ng { [گزینه‌ها] [عبارت-فیلتر] }

دستور netsniff-ng ابزاری سریع و کم‌حجم برای تحلیل بسته‌های شبکه، ضبط فایل‌های pcap، بازپخش فایل‌های pcap و بازهدایت ترافیک میان رابط‌های شبکه به کمک سوکت‌های صفر-کپی packet(7) است. این ابزار از هر دو رابط اختصاصی لینوکس یعنی RX_RING و TX_RING برای دستیابی به عملکرد صفر-کپی (zero-copy) بهره می‌برد. هدف از این کار، جلوگیری از سربار کپی داده‌ها و فراخوانی‌های سیستمی بین فضای آدرس هسته و فضای کاربری است. هنگامی که توسعه netsniff-ng آغاز شد، کتابخانه pcap(3) از این قابلیت صفر-کپی پشتیبانی نمی‌کرد.

ابزار netsniff-ng مختص لینوکس است؛ بدین معنا که از سایر سیستم‌عامل‌ها پشتیبانی نمی‌کند. از این رو کد منبع آن بسیار سبک، متمرکز و بهینه باقی مانده است. سوکت‌های packet(7) لینوکس و رابط‌های RX_RING و TX_RING آن، مسیر عادی پردازش بسته‌ها در پشته شبکه را دور می‌زنند. این روش بالاترین نرخ عملکرد در ضبط یا ارسال بسته‌ها را به‌صورت پیش‌فرض از فضای کاربری فراهم می‌کند، بدون اینکه نیازی به بارگذاری ماژول‌های متفرقه، پشتیبانی‌نشده یا خارج از درخت هسته (out-of-tree) باشد. ما صراحتاً از توسعه netsniff-ng بر بستر ntop/PF_RING خودداری کرده‌ایم؛ نه به این دلیل که به آن علاقه‌ای نداریم (اتفاقاً جالب است)، بلکه به این دلیل که بخشی از هسته رسمی (mainline) لینوکس نیست. در نتیجه، پروژه ntop ناچار است درایورهای خارج از هسته را مدام نگهداری و همگام کند تا با ساختار آن‌ها منطبق شود. در نهایت، ما استفاده از هسته دست‌نخورده لینوکس را برگزیدیم، زیرا کد آن نرخ بالاتری از بازبینی، نگهداری، امنیت و رفع اشکال دارد.

همچنین netsniff-ng از فیلترسازی زودهنگام بسته‌ها درون هسته پشتیبانی می‌کند. این ابزار از فیلترهای سطح پایین و سطح بالا که به دستورالعمل‌های BPF (فیلتر بسته برکلی) ترجمه می‌شوند، پشتیبانی به عمل می‌آورد.

ابزار netsniff-ng می‌تواند فایل‌های pcap را در چندین قالب مختلف ذخیره کند که با سایر ابزارها کاملاً سازگار هستند. روش‌های ورودی/خروجی زیر برای ذخیره‌سازی کارآمد روی دیسک پشتیبانی می‌شوند: پراکنده-گردآوری (scatter-gather)، mmap(2)، read(2) و write(2). همچنین netsniff-ng قادر است فایل‌های pcap را بر اساس اندازه داده یا بازه‌های زمانی چرخش (rotate) دهد و از این طریق به ابزاری پایه‌ای و بسیار مفید برای تحلیل‌های ترافیکی بعدی تبدیل شود.

همچنین netsniff-ng از تحلیل، بازپخش و ثبت فریم‌های خام 802.11 پشتیبانی می‌کند. برای تحلیل آنلاین یا آفلاین، این ابزار دارای یک تفکیک‌کننده بسته (dissector) داخلی برای پروتکل‌های 802.3 (اترنت)، *802.11 (شبکه بی‌سیم)، ARP، MPLS، 802.1Q (VLAN)، 802.1QinQ، LLDP، IPv4، IPv6، ICMPv4، ICMPv6، IGMP، TCP و UDP همراه با تحلیل موقعیت جغرافیایی GeoIP است. از آنجا که netsniff-ng در هنگام تفکیک بسته‌ها هیچ وضعیتی (state) ذخیره نمی‌کند و عملیات بازترکیب (reassembly) انجام نمی‌دهد، مصرف حافظه آن بسیار اندک است؛ ویژگی‌ای که آن را برای تحلیل آفلاین فایل‌های حجیم pcap نیز بسیار کارآمد می‌سازد.

توجه داشته باشید که netsniff-ng در حال حاضر چندنخی (multithreaded) نیست. با این وجود، این امر مانع از اجرای چندین نمونه از netsniff-ng نمی‌شود؛ به‌طوری‌که هر نمونه به پردازنده‌های مجزا و غیرهم‌پوشان اختصاص یابد (pinned) و به عنوان مثال فیلترهای BPF متفاوتی به آن‌ها متصل گردد. در صورتی که این فایل‌های pcap را در حافظه رم چرخش ندهید (و از آنجا در زمان‌بندی‌های مشخص به رسانه‌های ذخیره‌سازی کندتر منتقل نکنید)، دیسک سخت شما در نهایت به گلوگاه تبدیل خواهد شد. در مرحله بعد می‌توانید با استفاده از mergecap(1) تمام فایل‌های pcap را در یک فایل واحد بزرگ ادغام کنید. بدین ترتیب، netsniff-ng در عمل عملکردی چندنخی پیدا می‌کند.

همچنین می‌توان از netsniff-ng برای اشکال‌زدایی ترافیک netlink استفاده کرد.

دستگاه یا منبع ورودی را تعیین می‌کند. این مقدار می‌تواند یک کارت شبکه، یک فایل pcap یا ورودی استاندارد stdin (به‌صورت “-”) باشد. در صورت استفاده از فایل pcap، نوع قالب pcap (گزینه -D) به‌طور خودکار بر اساس امضای فایل (magic) تعیین می‌شود. در حالت stdin، فرض بر این است که جریان ورودی یک فایل pcap است. اگر نوع پیوند (link type) فایل pcap از نوع Netlink باشد و نوع pcap در قالب پیش‌فرض (میکروثانیه یا نانوثانیه) باشد، هر بسته در هدر پخته (cooked header) لینوکس [2] محصور خواهد شد.
دستگاه یا مقصد خروجی را تعیین می‌کند. این مقدار می‌تواند یک کارت شبکه، یک فایل pcap، یک پوشه، یک فایل پیکربندی trafgen(8) یا خروجی استاندارد stdout (به‌صورت “-”) باشد. اگر خروجی یک فایل pcap یا فایل پیکربندی trafgen(8) باشد، نام آن می‌تواند شامل قالب زمان بر اساس strftime(3) باشد. در صورت استفاده همزمان با گزینه -F، هر فایل حاصل از چرخش دارای برچسب زمانی یکتایی خواهد بود. در صورتی که فایل pcap نباید قالب پیش‌فرض (0xa1b2c3d4) را داشته باشد، باید گزینه اضافی -T نیز مشخص شود. اگر یک دایرکتوری داده شود، به جای یک فایل pcap منفرد، چندین فایل pcap با چرخش بر اساس حداکثر اندازه فایل یا بازه زمانی مشخص (گزینه -F) ایجاد می‌شوند. همچنین ارسال سیگنال SIGHUP به فرایند netsniff-ng موجب چرخش زودهنگام فایل خواهد شد. تعیین فایل کانفیگ trafgen در حال حاضر تنها در صورتی مجاز است که ورودی یک فایل pcap باشد. برای مشخص کردن فایل pcap به عنوان خروجی، نام فایل باید حتماً دارای پسوند “.pcap” باشد. اگر stdout داده شود، در صورتی که ورودی فایل pcap باشد کانفیگ trafgen در stdout نوشته می‌شود، و اگر ورودی کارت شبکه باشد داده‌های pcap به stdout ارسال می‌گردد. اگر ورودی یک دستگاه مانیتور Netlink باشد و نوع pcap پیش‌فرض (میکروثانیه یا نانوثانیه) باشد، هر بسته با هدر پخته pcap [2] کپسوله‌سازی می‌شود تا شماره خانواده Netlink حفظ شود (قالب‌های pcap کوزنتسوف و netsniff-ng هم‌اکنون حاوی شماره خانواده در فیلد پروتکل هستند).
اگر چندین نمونه از netsniff-ng با شناسه گروه توزیع بسته (fanout group id) یکسان اجرا شوند، ترافیک ورودی دریافتی میان اعضای این گروه توزیع و متعادل‌سازی بار (load-balance) می‌شود. این ویژگی مقیاس‌پذیری بسیار بهتری نسبت به اجرای موازی چند فرایند بدون پارامتر گروه توزیع ارائه می‌دهد؛ البته به شرطی که فیلتر BPF ضمیمه شده باشد، چرا که در غیر این صورت هر بسته باید به جای تحویل به یک عضو، به تمامی فرایندهای شنود تحویل داده شود. طبیعتاً هر عضو گروه می‌تواند فیلترهای BPF اختصاصی خود را داشته باشد.
این پارامتر انضباط توزیع (fanout discipline) را تعیین می‌کند؛ به بیان دیگر نحوه ارسال ترافیک ضبط‌شده به اعضای گروه توزیع را مشخص می‌سازد. گزینه‌های ممکن عبارتند از: توزیع بر اساس هش بسته (“hash”)، روش نوبت‌گردشی (“lb”)، بر اساس هسته پردازنده‌ای که بسته روی آن دریافت شده (“cpu”)، تصادفی (“rnd”)، سرریز سوکت (“roll” بدین معنا که در صورت پر بودن صف یک سوکت به سوکت بعدی منتقل می‌شود)، یا بر اساس نگاشت صف سخت‌افزاری کارت شبکه (“qm”).
گزینه‌های کمکی توزیع را برای استفاده در کنار نوع توزیع مشخص‌شده تعیین می‌کند. این گزینه‌ها برای هر نوع توزیعی قابل اعمال هستند. در حالت “defrag”، به هسته دستور داده می‌شود که بسته‌ها را پیش از تحویل به فضای کاربری دی‌فرگمنت (یکپارچه‌سازی قطعات) کند؛ و گزینه “roll” همان سازوکار سرریز سوکت را فراهم می‌کند تا در صورت استفاده از سایر روش‌ها (مانند “qm”)، چنانچه صف سوکت اصلی پر شد، ترافیک موقتاً به عضو بعدی گروه توزیع سرریز شود.
به جای ذخیره تمام ترافیک، بسته‌های شبکه را فیلتر می‌کند. به عنوان فیلتر می‌توان فایل یا ورودی استاندارد کامپایل‌شده توسط bpfc(8) یا یک عبارت فیلتر مشابه tcpdump(1) در میان گیومه را پاس داد. برای جزئیات مربوط به فایل bpf به صفحه راهنمای bpfc(8) و برای جزئیات فیلترهای مشابه tcpdump(1) به بخش “مثال‌های فیلتر (FILTER EXAMPLE)” یا pcap-filter(7) مراجعه کنید. همچنین در صورتی که پس از عبارت فیلتر گزینه دیگری در خط فرمان نیامده باشد، می‌توان عبارت فیلتر را بدون گزینه -f نیز به netsniff-ng پاس داد.
نوعی سازوکار فیلترسازی بر اساس آدرس‌دهی را مشخص می‌کند. مقادیر مجاز عبارتند از: “host” (بسته‌های ارسالی به خود ما)، “broadcast” (پخش همگانی به همه)، “multicast” (چندپخشی به گروه)، “others” (حالت بی‌قاعده/promiscuous) یا “outgoing” (بسته‌های خروجی از ما).
اگر مقصد خروجی یک پوشه باشد، با گزینه “-F” می‌توان بازه چرخش فایل pcap را بر اساس اندازه یا زمان تعیین کرد. بدین ترتیب پس از رسیدن به حد تعیین‌شده، فایل pcap جدیدی ایجاد می‌شود. برای پارامتر اندازه، مقادیر “<num>KiB/MiB/GiB” و برای پارامتر زمان، مقادیر “<num>s/sec/min/hrs” پذیرفته می‌شوند.
به‌طور پیش‌فرض در حالت بازپخش یا هدایت ترافیک، فریم‌های بافر حلقه‌ای (ring buffer) در netsniff-ng دارای اندازه ثابت ۲۰۴۸ بایت هستند. بدین معنا که اگر انتظار عبور فریم‌های بزرگ (jumbo frames) یا بسیار بزرگ (super jumbo) را در شبکه دارید، باید با استفاده از این گزینه پشتیبانی از آن‌ها را فعال کنید. البته این امر موجب کاهش کارایی و افزایش مصرف حافظه بافر حلقه‌ای خواهد شد. توجه داشته باشید که این موضوع بر حالت ضبط بسته‌ها تأثیری ندارد، زیرا در آن حالت از tpacket نسخه ۳ استفاده می‌شود!
در صورتی که کارت شبکه ورودی یا خروجی یک دستگاه بی‌سیم باشد، با استفاده از این گزینه می‌توان آن را به حالت پایش (monitor mode) برده و دستگاهی به نام mon<X> ایجاد کرد تا netsniff-ng به جای wlan<X> روی آن به شنود بپردازد. این قابلیت به netsniff-ng امکان تحلیل، ذخیره و حتی بازپخش فریم‌های خام 802.11 را می‌دهد.
تعداد مشخصی از بسته‌ها را پردازش کرده و سپس خارج می‌شود. اگر تعداد بسته‌ها برابر با ۰ باشد، به معنی پردازش نامحدود بسته‌ها تا زمان توقف دستی برنامه است. در غیر این صورت، یک عدد صحیح مثبت سقف پردازش را مشخص خواهد کرد.
عددی بین ۰ تا N-1 در نام فایل به جای برچسب زمانی یونیکس استفاده می‌شود. پس از پر شدن دور شمارنده و بازگشت به صفر، فایل‌های قبلی بازنویسی خواهند شد. حداکثر مقدار برابر با 2^32 - 1 است. این گزینه برای چرخش فایل‌های ضبط ترافیک همراه با گزینه‌های -F و -P طراحی شده است.
هنگام ذخیره فایل‌های pcap در یک پوشه، می‌توان پیشوند نام فایل را با این گزینه تعیین کرد. در صورت عدم تعیین، پیشوند پیش‌فرض “dump-” به همراه برچسب زمانی یونیکس خواهد بود. استفاده از “--prefix ""” نام فایل را فقط به ثانیه‌های سپری‌شده از مبدأ یونیکس تبدیل می‌کند (مانند 1369179203.pcap).
نوع قالب pcap را برای ذخیره‌سازی تعیین می‌کند. انواع مختلف قالب‌های pcap به همراه قابلیت‌های متادیتای آن‌ها با گزینه -D نمایش داده می‌شوند. در صورت عدم تعیین، امضای جادویی 0xa1b2c3d4 که به عنوان قالب استاندارد pcap سازگار با tcpdump شناخته می‌شود به کار می‌رود. فایل‌های pcap با ترتیب بایت معکوس (swapped endianness) نیز پشتیبانی می‌شوند.
فهرست تمامی قالب‌های pcap موجود را به همراه قابلیت‌ها و اعداد جادویی آن‌ها (که در گزینه “-T” کاربرد دارند) در خروجی استاندارد چاپ کرده و خارج می‌شود.
در صورت ارائه یک فیلتر BPF (مثلاً با گزینه “-f”)، خروجی دی‌اسمبلی BPF را در طول راه‌اندازی بافر حلقه‌ای در خروجی استاندارد نمایش می‌دهد. این گزینه صرفاً کاربرد اطلاعاتی یا اعتبارسنجی دارد.
در صورتی که هر دو رابط ورودی و خروجی کارت شبکه باشند، این گزینه ترتیب بسته‌ها را در بافر حلقه‌ای خروجی تصادفی می‌سازد.
رابط شبکه را در حالت بی‌قاعده (promiscuous mode) قرار نمی‌دهد. به‌طور پیش‌فرض، حالت بی‌قاعده فعال است.
ثبت برچسب زمانی سخت‌افزاری برای بسته‌های دریافتی (RX) را غیرفعال می‌کند. به‌طور پیش‌فرض اگر کارت شبکه از ثبت زمان سخت‌افزاری پشتیبانی کند، این برچسب‌ها هنگام نوشتن بسته‌ها در فایل pcap استفاده می‌شوند. این گزینه این رفتار را غیرفعال کرده و استفاده از برچسب‌های زمانی نرم‌افزاری (مبتنی بر هسته) را اجباری می‌سازد، حتی اگر برچسب سخت‌افزاری در دسترس باشد.
هنگام راه‌اندازی و خروج، netsniff-ng تلاش می‌کند در صورت نیاز اندازه بافرهای خواندن و نوشتن سوکت را افزایش دهد. این گزینه مانع از انجام این کار می‌شود.
استفاده از mmap(2) برای ورودی/خروجی فایل pcap. این حالت پیش‌فرض هنگام بازپخش فایل‌های pcap است.
استفاده از پراکنده-گردآوری (scatter-gather) برای ورودی/خروجی فایل pcap. این حالت پیش‌فرض هنگام ضبط فایل‌های pcap است.
استفاده از ورودی/خروجی کندتر read(2) و write(2). این روش در هیچ حالتی پیش‌فرض نیست، اما در برخی شرایط به دلیل تأخیر کمتر در بازنویسی روی دیسک ممکن است ترجیح داده شود.
تعیین دستی اندازه بافرهای RX_RING یا TX_RING در قالب “<num>KiB/MiB/GiB”. به‌طور پیش‌فرض، اندازه بر اساس سرعت اتصال شبکه تعیین می‌شود.
تعیین دستی بازه زمانی (به میکروثانیه) برای تحریک هسته جهت پردازش دسته‌ای فریم‌های بافر حلقه‌ای. مقدار پیش‌فرض هر ۱۰ میکروثانیه است، اما می‌توان آن را به صورت دستی افزایش داد.
اختصاص دادن (pin) فرایند netsniff-ng به یک هسته پردازنده خاص و همچنین انتقال همبستگی IRQ کارت شبکه به همان پردازنده. این گزینه در ترکیب با -s در مواقعی که نرخ بسته‌ها متوسط تا بالا باشد قویاً پیشنهاد می‌شود.
پس از راه‌اندازی بافر حلقه‌ای، دسترسی‌های ریشه (root) به کاربر و گروه غیرریشه مشخص‌شده تقلیل می‌یابد.
تنظیم این فرایند به عنوان یک فرایند با اولویت بالا جهت دستیابی به زمان‌بندی سریع‌تر و زمان بیشتر CPU. این حالت پیش‌فرض نیست، زیرا ممکن است به گرسنگی (starvation) سایر فرایندها، مثلاً رشته‌های کم‌اولویت هسته بینجامد.
تنظیمات همبستگی IRQ کارت شبکه با پردازنده را تغییر نمی‌دهد.
وارد ماژول تفکیک بسته نمی‌شود و هیچ اطلاعاتی از بسته‌ها را در ترمینال چاپ نمی‌کند (حالت بی‌صدا). این گزینه در ترکیب با ضبط یا بازپخش pcap به شدت توصیه می‌شود، چرا که ارسال حجم بالای خروجی به ترمینال موجب افت چشمگیر کارایی خواهد شد.
چاپ اطلاعات خلاصه و تک‌خطی برای هر بسته در ترمینال.
نمایش بسته‌ها فقط در قالب شانزده‌شانزدهی (hex) در ترمینال.
فقط کاراکترهای قابل چاپ اسکی (ASCII) را نمایش می‌دهد.
در صورت استفاده از موقعیت‌یابی جغرافیایی IP، سازوکار داخلی به‌روزرسانی برای دریافت جدیدترین پایگاه داده MaxMind فراخوانی می‌شود. فایل /etc/netsniff-ng/geoip.conf شامل نشانی‌های مربوط به دریافت پایگاه داده است. از این رو برای صرفه‌جویی در پهنای باند یا استفاده از آینه‌های محلی (برای دور زدن محدودیت ترافیک MaxMind)، می‌توان میزبان‌ها یا نشانی‌های IP گوناگون را با خطوط جداگانه در geoip.conf قرار داد.
هدر پیوند هر فریم را با هدر پخته لینوکس (cooked header) [3] جایگزین می‌کند که اطلاعات مربوط به نوع پیوند و پروتکل را نگهداری می‌کند. این قابلیت امکان ذخیره و تفکیک فریم‌های ضبط‌شده از انواع مختلف پیوندها را فراهم می‌سازد (مثلاً زمانی که گزینه -i "any" تعیین شده باشد).
نمایش جزئیات بیشتر در حین راه‌اندازی، مانند اطلاعات دقیق تنظیمات بافر حلقه‌ای.
نمایش اطلاعات نسخه و خروج.
نمایش راهنمای کاربری و خروج.

ساده‌ترین دستور اجرای مستقیم “netsniff-ng” است. این دستور شنود را روی تمامی کارت‌های شبکه موجود در حالت بی‌قاعده (promiscuous) آغاز کرده و خروجی تفکیک بسته‌ها را در ترمینال نمایش می‌دهد. هیچ فایلی ذخیره نخواهد شد.
netsniff-ng --in eth0 --out dump.pcap -s -T 0xa1e2cb12 -b 0 tcp or udp
ضبط ترافیک TCP یا UDP از رابط شبکه eth0 در یک فایل pcap به نام dump.pcap با پسوندهای اختصاصی netsniff-ng (برای مشاهده قابلیت‌ها به “netsniff-ng -D” مراجعه کنید). همچنین محتوا در ترمینال چاپ نمی‌شود و فرایند و همبستگی IRQ کارت شبکه به هسته پردازنده 0 متصل می‌گردند. روش نوشتن pcap ورودی/خروجی پراکنده-گردآوری است.
netsniff-ng --in wlan0 --rfraw --out dump.pcap --silent --bind-cpu 0
قرار دادن رابط wlan0 در حالت پایش (monitor mode) و ضبط تمام فریم‌های خام 802.11 در فایل dump.pcap. بسته‌ها تفکیک و در ترمینال چاپ نمی‌شوند و فرایند و همبستگی IRQ به هسته پردازنده 0 متصل می‌شوند. روش نوشتن pcap ورودی/خروجی پراکنده-گردآوری است.
netsniff-ng --in dump.pcap --mmap --out eth0 -k1000 --silent --bind-cpu 0
بازپخش فایل pcap با نام dump.pcap که از طریق ورودی/خروجی mmap(2) خوانده می‌شود و ارسال بسته‌ها به بیرون از طریق رابط شبکه eth0. محتوا تفکیک و در ترمینال چاپ نمی‌شود و فرایند و همبستگی IRQ به هسته پردازنده 0 اختصاص می‌یابد. همچنین هسته هر ۱۰۰۰ میکروثانیه (به جای ۱۰ میکروثانیه) برای پیمایش TX_RING تحریک می‌شود. توجه داشته باشید که نوع قالب pcap به‌طور خودکار از هدر فایل شناسایی می‌شود.
netsniff-ng --in eth0 --out eth1 --silent --bind-cpu 0 --type host -r
هدایت ترافیک از کارت شبکه eth0 به eth1 برای ترافیکی که مقصد آن میزبان خود ما است؛ بدین ترتیب ترافیک‌های همگانی، چندپخشی و بی‌قاعده نادیده گرفته می‌شوند. ترتیب بسته‌ها برای دستگاه خروجی تصادفی شده و هیچ محتوایی در ترمینال چاپ نمی‌شود. همچنین فرایند و همبستگی IRQ به پردازنده 0 اختصاص می‌یابد.
netsniff-ng --in team0 --out /opt/probe/ -s -m --interval 100MiB -b 0
ضبط ترافیک روی رابط تجمیع‌شده team0 و ذخیره بسته‌ها در چندین فایل pcap با تفکیک ۱۰۰ مگابایتی برای هر فایل. استفاده از ورودی/خروجی mmap(2) به عنوان روش نوشتن pcap؛ پشتیبانی از فریم‌های بسیار بزرگ (super jumbo) به صورت داخلی فعال است (نیازی به تنظیم در اینجا ندارد) و داده‌های ضبط‌شده در ترمینال چاپ نمی‌شوند. فرایند و همبستگی IRQ به پردازنده 0 اختصاص می‌یابد. قالب پیش‌فرض pcap امضای 0xa1b2c3d4 (قالب سازگار با tcpdump) است.
netsniff-ng --in vlan0 --out dump.pcap -c -u `id -u bob` -g `id -g bob`
ضبط ترافیک روی رابط vlan0 در فایل pcap به نام dump.pcap با استفاده از ورودی/خروجی معمولی read(2) و write(2) برای فایل pcap (کندتر اما با تأخیر کمتر). همچنین پس از راه‌اندازی RX_RING برای ضبط، دسترسی‌های ریشه به کاربر و گروه “bob” تقلیل می‌یابد. ماژول تفکیک بسته فعال شده و محتوای بسته‌ها برای تحلیل بیشتر در ترمینال چاپ می‌شود.
netsniff-ng --in any --filter http.bpf -B --ascii -V
ضبط از تمامی رابط‌های شبکه موجود و نصب یک فیلتر سطح پایین که قبلاً توسط bpfc(8) در فایل http.bpf کامپایل شده است تا ترافیک HTTP فیلتر شود. پشتیبانی از فریم‌های بسیار بزرگ به صورت خودکار فعال شده و فقط داده‌های متنی خوانا برای انسان در ترمینال چاپ می‌شوند؛ همچنین جزئیات بیشتری در مرحله راه‌اندازی نمایش داده شده و کد دی‌اسمبلی BPF فایل http.bpf نیز نمایش می‌یابد.
netsniff-ng --in dump.pcap --out dump.cfg --silent
تبدیل فایل pcap با نام dump.pcap به فایل پیکربندی trafgen(8) با نام dump.cfg. محتوای pcap در ترمینال چاپ نمی‌شود.
netsniff-ng -i dump.pcap -f beacon.bpf -o -
تبدیل فایل pcap به نام dump.pcap به یک فایل پیکربندی trafgen(8) و ارسال آن به خروجی استاندارد stdout. البته تمام محتوا استخراج نمی‌شود، بلکه تنها بخش‌هایی که از فیلتر سطح پایین فریم‌های خام 802.11 در beacon.bpf عبور کنند منتقل می‌شوند. موتور BPF در اینجا در فضای کاربری درون netsniff-ng اجرا می‌شود، بنابراین افزونه‌های لینوکس در دسترس نخواهند بود.
خواندن فایل pcap از ورودی استاندارد stdin و تبدیل آن به فایل پیکربندی trafgen(8) در خروجی استاندارد stdout.
netsniff-ng -i nlmon0 -o dump.pcap -s
ضبط ترافیک netlink در یک فایل pcap. این دستور نیازمند آن است که پیش‌تر یک کارت شبکه پایش netlink با استفاده از دستور ip(1) از مجموعه ابزارهای iproute2 راه‌اندازی شده باشد:
modprobe nlmon
ip link add type nlmon
ip link set nlmon0 up

برای برچیدن دستگاه nlmon0 از دستورات زیر استفاده کنید:

ip link set nlmon0 down
ip link del dev nlmon0
rmmod nlmon
netsniff-ng --fanout-group 1 --fanout-type cpu --fanout-opts defrag --bind-cpu 0 --notouch-irq --silent --in em1 --out /var/cap/cpu0/ --interval 120sec
اجرای دو نمونه از netsniff-ng در حالت توزیع (fanout). هر دو نمونه به یک گروه توزیع مشترک اختصاص می‌یابند و ترافیک بر اساس پردازنده دریافت‌کننده بین آن‌ها تقسیم می‌شود. علاوه بر این، هسته باید قطعات احتمالی بسته‌ها را یکپارچه‌سازی (defragment) کند. نمونه اول به پردازنده 0 و نمونه دوم به پردازنده 1 اختصاص می‌یابد؛ انتساب IRQ دست‌نخورده باقی می‌ماند چرا که ممکن است کاربر از پیش آن را برای این سناریو تنظیم کرده باشد. ترافیک روی رابط em1 ضبط شده و در بازه‌های ۱۲۰ ثانیه‌ای به صورت فایل‌های pcap در مسیر /var/cap/cpu0/ ذخیره می‌شود. ابزارهایی مانند mergecap(1) می‌توانند در صورت نیاز این فایل‌های تفکیک‌شده بین پردازنده‌های 0 و 1 را مجدداً با هم ادغام کنند.

فایل‌های موجود در مسیر /etc/netsniff-ng/ را می‌توان برای گسترش قابلیت‌های netsniff-ng ویرایش کرد:

* oui.conf - پایگاه داده سازندگان OUI/MAC
* ether.conf - توضیحات انواع اترنت (Ethernet types)
* tcp.conf - نگاشت پورت‌ها و سرویس‌های TCP
* udp.conf - نگاشت پورت‌ها و سرویس‌های UDP
* geoip.conf - سرورهای آینه پایگاه داده GeoIP

ابزار netsniff-ng از هر دو نوع فیلتر سطح پایین و سطح بالا که به سوکت packet(7) آن متصل می‌شوند پشتیبانی می‌کند. فیلترهای سطح پایین در صفحه راهنمای bpfc(8) شرح داده شده‌اند.

فیلترهای سطح پایین را می‌توان به روش‌های زیر با netsniff-ng به کار برد:

1. bpfc foo > bar
2. netsniff-ng -f bar
3. bpfc foo | netsniff-ng -i nlmon0 -f -

در اینجا foo برنامه bpfc است که به فایلی از کدهای عملیاتی (opcodes) خوانا برای netsniff-ng تبدیل شده و از طریق گزینه -f به netsniff-ng داده می‌شود.

به همین ترتیب، فیلتر سطح بالا را می‌توان از طریق گزینه -f (مانند -f "tcp or udp") یا در پایان تمام گزینه‌ها بدون ذکر “-f” ارائه داد.

سینتکس فیلتر دقیقاً مشابه tcpdump(8) است که در صفحه راهنمای pcap-filter(7) توضیح داده شده است. به عنوان نمونه:

انتخاب تمام بسته‌هایی که مقصد یا مبدأ آن‌ها میزبان sundown است.
انتخاب ترافیک بین helios و یکی از میزبان‌های hot یا ace.
انتخاب تمام بسته‌های IP بین ace و هر میزبانی به جز helios.
انتخاب تمام ترافیک بین میزبان‌های محلی و میزبان‌های دانشگاه برکلی.
انتخاب تمام ترافیک FTP که از درگاه (gateway) اینترنتی snup عبور می‌کند.
انتخاب ترافیکی که مبدأ و مقصد آن شبکه محلی نیست. اگر به شبکه دیگری گیت‌وی دارید، این ترافیک هرگز نباید به شبکه محلی شما وارد شود.
انتخاب بسته‌های شروع و پایان (بسته‌های SYN و FIN) در هر ارتباط TCP که شامل یک میزبان غیرمحلی است.
انتخاب تمام بسته‌های IPv4 پروتکل HTTP مربوط به پورت 80؛ یعنی فقط بسته‌هایی که حاوی داده هستند نمایش داده شوند، نه به عنوان مثال بسته‌های SYN، FIN یا بسته‌های فقط ACK. (نسخه IPv6 به عنوان تمرین به خواننده واگذار می‌شود.)
انتخاب بسته‌های IP بزرگتر از ۵۷۶ بایت که از گیت‌وی snup عبور می‌کنند.
انتخاب بسته‌های پخش همگانی یا چندپخشی IP که از طریق پخش همگانی یا چندپخشی اترنت ارسال نشده‌اند.
انتخاب تمام بسته‌های ICMP که درخواست یا پاسخ echo نیستند (یعنی بسته‌های غیر "ping").

ابزار netsniff-ng از چندین قالب pcap پشتیبانی می‌کند که با اجرای دستور “netsniff-ng -D” قابل مشاهده هستند:

قالب pcap سازگار با tcpdump (پیش‌فرض). عدد جادویی آن به صورت 0xa1b2c3d4 یا 0xd4c3b2a1 کدگذاری شده است. این قالب به عنوان متادیتای بسته شامل timeval به میکروثانیه، طول اصلی بسته و طول بسته ضبط‌شده است.
قالب pcap سازگار با tcpdump با دقت نانوثانیه. عدد جادویی آن به صورت 0xa1b23c4d یا 0x4d3cb2a1 کدگذاری شده است. این قالب به عنوان متادیتای بسته شامل timeval به نانوثانیه، طول اصلی بسته و طول بسته ضبط‌شده است.
قالب pcap الکسی کوزنتسوف (Alexey Kuznetzov). عدد جادویی آن به صورت 0xa1b2cd34 یا 0x34cdb2a1 کدگذاری شده است. این قالب به عنوان متادیتای بسته شامل timeval به میکروثانیه، طول اصلی بسته، طول بسته ضبط‌شده، شاخص رابط (sll_ifindex)، پروتکل بسته (sll_protocol) و نوع بسته (sll_pkttype) است.
netsniff-ng pcap
قالب pcap اختصاصی netsniff-ng. عدد جادویی آن به صورت 0xa1e2cb12 یا 0x12cbe2a1 کدگذاری شده است. این قالب به عنوان متادیتای بسته شامل timeval به نانوثانیه، طول اصلی بسته، طول بسته ضبط‌شده، منبع برچسب زمانی سخت‌افزاری/نرم‌افزاری، شاخص رابط (sll_ifindex)، پروتکل بسته (sll_protocol)، نوع بسته (sll_pkttype) و نوع سخت‌افزار (sll_hatype) است.

برای جزئیات بیشتر در مورد پیاده‌سازی یا پشتیبانی از این قالب‌ها در برنامه‌های خود، به فایل pcap_io.h در کدهای منبع netsniff-ng مراجعه کنید.

برای جلوگیری از سردرگمی، لازم به ذکر است که یک تحلیل‌گر شبکه دیگر با نام مشابه بنام NetSniff وجود دارد که ارتباطی با پروژه netsniff-ng ندارد.

برای ایجاد خطاهای بیتی، تأخیرهای با تغییرات تصادفی و موارد دیگر در حین بازپخش فایل‌های pcap، از ابزار tc(8) با انضباط‌هایی نظیر netem استفاده کنید.

ابزار netsniff-ng هنگام راه‌اندازی تنها برخی تنظیمات اولیه و عمومی معماری را انجام می‌دهد. اگر قصد دارید ضبط بسته‌ها را با کارایی بسیار بالا انجام دهید، باید سیستم خود را از نظر سخت‌افزاری و نرم‌افزاری با دقت بهینه‌سازی (tune) کنید. اجرای ساده netsniff-ng بدون توجه به ساختار زیرین سیستم لزوماً کارایی مورد نظر را به شما نخواهد داد. توجه داشته باشید که بهینه‌سازی سیستم همواره یک موازنه و تعادل دقیق بین توان عملیاتی (throughput) و زمان تأخیر (latency) است. باید دقیقاً بدانید چه کاری انجام می‌دهید!

یک پیشنهاد برای بهینه‌سازی نرم‌افزاری استفاده از tuned(8) است. علاوه بر این، موارد بسیار دیگری نیز وجود دارد که باید در نظر گرفته شوند؛ از جمله: درایورهای شبکه NAPI، هسته بدون تیک (tickless kernel)، موتور DMA از نوع I/OAT، دسترسی مستقیم به حافظه موقت (Direct Cache Access)، سیستم‌های فایل مبتنی بر رم، صف‌های چندگانه (multi-queues) و موارد بسیار دیگر. همچنین مطالعه مستندات هسته لینوکس در فایل Documentation/networking/scaling.txt در رابطه با فناوری‌هایی مانند RSS، RPS، RFS، aRFS و XPS توصیه می‌شود. به علاوه تنظیمات ethtool(8) را نیز برای مواردی نظیر تخلیه بار (offloading) یا فریم‌های مکث اترنت (Ethernet pause frames) بررسی کنید.

علاوه بر این، برای درک عمیق‌تر از ساختار داخلی netsniff-ng و نحوه تعامل آن با هسته لینوکس، مستندات هسته در مسیر Documentation/networking/{packet_mmap.txt, filter.txt, multiqueue.txt} می‌تواند مفید باشد.

چگونه در یک محیط سوئیچ‌شده شنود (sniff) انجام دهیم؟ با صراحت به مستندات ابزار dSniff اشاره می‌کنیم که می‌گوید:

ساده‌ترین راه، جعل هویت گیت‌وی محلی و سرقت ترافیک کلاینت در مسیر مقصد دوردست است. البته این ترافیک باید توسط دستگاه حمله‌کننده بازهدایت شود؛ خواه از طریق فعال‌سازی فورواردینگ IP در هسته، خواه با یک برنامه در فضای کاربری که همین کار را انجام دهد (مانند fragrouter -B1).

بر اساس گزارش‌ها، افراد متعددی با جعل ARP روی گیت‌وی و فراموش کردن فعال‌سازی بازهدایت IP روی دستگاه مهاجم، اتصال شبکه محلی (LAN) خود به دنیای بیرون را به طور کامل قطع کرده‌اند. این کار را انجام ندهید. به شما هشدار داده شد.

گزینه بسیار امن‌تر از جعل ARP، استفاده از قابلیت پایش پورت (port mirror) است؛ البته در صورتی که سخت‌افزار سوئیچ شما از آن پشتیبانی کند و به سوئیچ دسترسی داشته باشید.

اگر نیازی به ثبت تمامی ترافیک عبوری ندارید، بهتر است netsniff-ng را همراه با یک فیلتر BPF برای مسیر ورودی اجرا کنید. به این منظور صفحه راهنمای bpfc(8) را بخوانید.

همچنین برای تجمیع چند کارت شبکه که قصد شنود روی آن‌ها را دارید، استفاده از دستگاه‌های team را در نظر بگیرید که توضیحات بیشتر آن در libteam و teamd(8) آمده است.

اعداد جادویی pcap زیر در netsniff-ng با سایر ابزارها، دست‌کم tcpdump یا Wireshark سازگار هستند:

0xa1b2c3d4 (قالب pcap سازگار با tcpdump)
0xa1b23c4d (قالب pcap سازگار با tcpdump با دقت نانوثانیه)
0xa1b2cd34 (قالب pcap الکسی کوزنتسوف)

فایل‌های pcap با ترتیب بایت متادیتای متفاوت نیز توسط netsniff-ng پشتیبانی می‌شوند.

هنگام بازپخش فایل‌های pcap، اطلاعات زمان‌بندی موجود در هدر بسته pcap در حال حاضر نادیده گرفته می‌شود.

همچنین هنگام بازپخش فایل‌های pcap، تفکیک ترافیک (demultiplexing) میان چند رابط شبکه کار نمی‌کند. در حال حاضر ترافیک تنها از طریق رابطی ارسال می‌شود که با پارامتر --out مشخص شده است.

هنگام ضبط ترافیک روی رابط اترنت، فایل pcap ایجاد شده و بسته‌ها دریافت می‌شوند اما فاقد هدر 802.1Q هستند. هنگامی که از tshark استفاده می‌شود تمام هدرها قابل مشاهده‌اند، اما netsniff-ng هدرهای 802.1Q را حذف می‌کند. آیا این یک رفتار عادی است؟

پاسخ هم بله است و هم خیر. شیوه مدیریت هدرهای VLAN در سوکت‌های PF_PACKET توسط هسته تا حدی “مسئله‌ساز” است [1]. مشکل در هسته لینوکس این است که برخی درایورها از قبل VLANها را مدیریت می‌کنند و برخی دیگر خیر. آن‌هایی هم که آن را پردازش می‌کنند پیاده‌سازی‌های متفاوتی دارند، مانند شتاب‌دهی سخت‌افزاری و غیره. بنابراین در برخی موارد برچسب VLAN حتی پیش از ورود به پشته پروتکل حذف می‌شود و در برخی موارد احتمالاً خیر. نکته اساسی این است که یک راهکار موقت (hack) در PF_PACKET معرفی شد تا شناسه VLAN در یک ساختار داده کمکی که از طریق RX_RING قابل دسترسی است، قابل مشاهده باشد.

سپس در فضای کاربری برای قرار دادن ساختگی هدر VLAN در جایگاه درست خود، اوضاع بسیار پیچیده و آشفته می‌شود. بماند که این امر چه تبعات عملکردی منفی بر تمامی ابزارهای مبتنی بر libpcap(3) می‌گذارد، چرا که بخش‌هایی از بسته برای بازترکیب مجدد باید با memmove(3) کپی شوند.

کاربری برای نشان دادن این آشفتگی گزارش زیر را ارسال کرد؛ برخی آزمایش‌ها روی دو دستگاه انجام شد و به نظر می‌رسد نتایج کاملاً به درایور بستگی دارد:

AR8131:
  دستور ethtool -k eth0 خروجی "rx-vlan-offload: on" را می‌دهد
  - برنامه wireshark هدر vlan را دریافت می‌کند
  - ابزار netsniff-ng هدر vlan را دریافت نمی‌کند
  دستور ethtool -K eth0 rxvlan off
  - برنامه wireshark هدر QinQ دریافت می‌کند با این که هیچ‌کس QinQ ارسال نکرده بود
  - ابزار netsniff-ng هدر vlan را دریافت می‌کند
RTL8111/8168B:
  دستور ethtool -k eth0 خروجی "rx-vlan-offload: on" را می‌دهد
  - برنامه wireshark هدر vlan را دریافت می‌کند
  - ابزار netsniff-ng هدر vlan را دریافت نمی‌کند
  دستور ethtool -K eth0 rxvlan off
  - برنامه wireshark هدر vlan را دریافت می‌کند
  - ابزار netsniff-ng هدر vlan را دریافت نمی‌کند

حتی اگر توافق می‌کردیم که از همان راهکار موقت libpcap استفاده کنیم، باز هم به عنوان مثال به دلیل این که تنها یک برچسب VLAN در ساختار داده کمکی هسته ذخیره می‌شود، قادر به دیدن QinQ نبودیم. ما بر این باوریم که در سمت هسته باید اجماع مناسبی بر سر این که چه داده‌ای ابتدا به فضای کاربری منتقل شود، شکل بگیرد.

به‌روزرسانی (28.11.2012): هسته لینوکس و همچنین bpfc(8) دارای پشتیبانی داخلی برای فیلترسازی شتاب‌یافته سخت‌افزاری VLAN هستند، هرچند ممکن است برچسب‌ها همان‌طور که در اینجا گزارش شد در بار داده (payload) خود بسته دیده نشوند. با این حال، اگر کارت شبکه شما از آن پشتیبانی کند فیلتر کردن برای VLANها به صورت قابل اعتماد کار می‌کند. برای مشاهده مثال به bpfc(8) مراجعه کنید.

[1] http://lkml.indiana.edu/hypermail/linux/kernel/0710.3/3816.html
[2] http://www.tcpdump.org/linktypes/LINKTYPE_NETLINK.html
[3] http://www.tcpdump.org/linktypes/LINKTYPE_LINUX_SLL.html

ابزار netsniff-ng تحت مجوز گنو جی‌پی‌ال نسخه ۲.۰ (GNU GPL version 2.0) منتشر شده است.

netsniff-ng در ابتدا توسط دانیل بورکمن (Daniel Borkmann) برای مجموعه ابزارهای netsniff-ng نوشته شد. مشارکت‌های بزرگی توسط امانوئل رولیت (Emmanuel Roullit)، مارکوس آمند (Markus Amend)، توبیاس کلاوزر (Tobias Klauser) و کریستوف یاگر (Christoph Jaeger) انجام گرفت. این پروژه در حال حاضر توسط توبیاس کلاوزر <tklauser@distanz.ch> و دانیل بورکمن <dborkma@tik.ee.ethz.ch> نگهداری می‌شود.

trafgen(8), mausezahn(8), ifpps(8), bpfc(8), flowtop(8), astraceroute(8), curvetun(8)

این صفحه راهنما توسط دانیل بورکمن (Daniel Borkmann) نوشته شده است.

این صفحه بخشی از پروژه مجموعه ابزارهای netsniff-ng لینوکس است. توضیحات مربوط به این پروژه و اطلاعات گزارش باگ‌ها را می‌توانید در نشانی http://netsniff-ng.org بیابید.

03 March 2013 Linux