.\" netsniff-ng - the packet sniffing beast .\" Copyright 2013 Daniel Borkmann. .\" Subject to the GPL, version 2. .TH TRAFGEN 8 "03 March 2013" "Linux" "netsniff-ng toolkit" .SH "نام (NAME)" trafgen \- مولد ترافیک و بسته‌های شبکه سریع و چندنخی .PP .SH "خلاصه دستور (SYNOPSIS)" .PP \fBtrafgen\fP [\fIگزینه‌ها\fP] [\fIبسته\fP] .PP .SH "توضیحات (DESCRIPTION)" .PP ابزار trafgen یک مولد ترافیک شبکه سریع و مبتنی بر روش صفر-کپی (zero-copy) برای اشکال‌زدایی، ارزیابی کارایی و آزمون فازینگ (fuzz-testing) است. trafgen از رابط سوکت .BR packet (7) لینوکس بهره می‌برد که کنترل کامل بر داده‌ها و سرایندهای بسته را به فضای کاربری واگذار می‌کند. این ابزار دارای یک زبان قدرتمند برای پیکربندی بسته‌ها است که نسبتاً سطح پایین بوده و محدود به پروتکل‌های خاصی نیست. بنابراین، trafgen می‌تواند برای اهداف متعددی استفاده شود. تنها محدودیت آن این است که نمی‌تواند جریان‌ها یا نشست‌های کامل (full streams resp. sessions) را شبیه‌سازی کند. با این حال، برای انواع مختلف آزمون‌های بارگذاری به منظور تحلیل و متعاقباً بهبود رفتار سیستم‌ها در سناریوهای حملات منع سرویس (DoS)، بسیار سودمند است. .PP ابزار trafgen مختص لینوکس است، به این معنی که همانند .BR netsniff-ng (8)، هیچ پشتیبانی از سیستم‌عامل‌های دیگر وجود ندارد؛ بنابراین می‌توانیم ردپای کد را کاملاً کمینه و متمرکز بر هدف نگه داریم. trafgen از رابط TX_RING سوکت .BR packet (7) هسته لینوکس استفاده می‌کند که یک بافر حلقوی .BR mmap (2) شده مشترک میان فضای کاربری و فضای هسته است. .PP به‌طور پیش‌فرض، trafgen به تعداد پردازنده‌های (CPU) در دسترس پردازه ایجاد می‌کند، هر یک از آن‌ها را به پردازنده مربوط به خود متصل (pin) کرده و پس از کامپایل فهرستی از بسته‌ها برای ارسال، بافر حلقوی را در فضای پردازه اختصاصی هر کدام راه‌اندازی می‌کند. بنابراین، این احتمالاً سریع‌ترین کارایی ارسال از فضای کاربری است که می‌توان بدون نیاز به بارگذاری ماژول‌های هسته متفرقه یا خارج از شاخه اصلی (non-mainline) به دست آورد. در اترنت گیگابیتی، trafgen کارایی قابل مقایسه‌ای با pktgen (مولد ترافیک داخلی هسته لینوکس) دارد، با این تفاوت که trafgen از نظر انعطاف‌پذیری در پیکربندی بسته‌ها بسیار برتر است. در اترنت ۱۰ گیگابیت بر ثانیه، trafgen ممکن است به دلیل سربار جابه‌جایی میان فضای کاربری و هسته از pktgen کندتر باشد، اما همچنان برای هسته‌های استاندارد کارایی نسبتاً بالایی دارد. .PP ابزار trafgen دارای پتانسیل انجام آزمون فازینگ (fuzz testing) است؛ بدین معنا که می‌توان یک پیکربندی بسته با اعداد تصادفی در تمام یا برخی افست‌های معین بسته ایجاد کرد که در هر بار ارسال بسته از نو تولید شوند. با ابزار پینگ داخلی IPv4، ابزار trafgen می‌تواند پس از تزریق هر بسته، یک کاوشگر ICMP به میزبان راه دور بفرستد تا پاسخگو بودن و زنده بودن آن را بیازماید. با این فرض که پس از آستانه معینی از کاوش‌ها پاسخی از میزبان مقصد دریافت نشود، دستگاه از کار افتاده تلقی شده و آخرین بسته ارسال‌شده به همراه دانه تصادفی (random seed) مورد استفاده توسط trafgen چاپ می‌شود تا امکان بازتولید باگ فراهم گردد. شاید شانس چندانی برای فازینگ موفق هسته لینوکس نداشته باشید، اما احتمالاً سیستم‌های تعبیه‌شده تجاری باگ‌دار یا سفت‌افزارهای درایورهای شبکه وجود دارند که مستعد خطا هستند و trafgen می‌تواند در یافتن آن‌ها کمک کند. .PP زبان پیکربندی trafgen بسیار قدرتمند است، از جمله به این دلیل که از ماکروهای پیش‌پردازنده C پشتیبانی می‌کند. برای همین منظور، فایل stddef.h به همراه trafgen ارائه می‌شود تا بتوان تعاریف شناخته‌شده از هسته لینوکس یا برنامه‌نویسی شبکه را مجدداً استفاده کرد. پس از آن‌که فایل پیکربندی از مرحله پیش‌پردازنده C عبور کرد، توسط کامپایلر بسته trafgen پردازش می‌شود. خود زبان از قابلیت‌های متعددی پشتیبانی می‌کند که هنگام سرهم‌بندی بسته‌ها بسیار مفید هستند؛ مانند پشتیبانی داخلی از محاسبه چکسام در زمان اجرا برای IP، UDP و TCP. همچنین دارای یک ارزیاب عبارت (expression evaluator) است که محاسبات ریاضی (عملیات پایه، عملیات بیتی، شیفت بیت و...) روی عبارات ثابت را در زمان کامپایل به یک مقدار ثابت تبدیل می‌کند. از دیگر ویژگی‌ها ماکروهای پر کردن (''fill'') است که با آن‌ها می‌توان n بایت از بسته را با یک مقدار ثابت، یک عدد تصادفی زمان کامپایل یا عدد تصادفی زمان اجرا (همان‌طور که در آزمون فازینگ ذکر شد) پر کرد. همچنین .BR netsniff-ng (8) قادر است یک فایل pcap را به فایل پیکربندی trafgen تبدیل کند؛ بنابراین می‌توان چنین پیکربندی را برای یک سناریوی معین بیشتر شخصی‌سازی کرد. .PP .SH "گزینه‌ها (OPTIONS)" .TP .B -i , -c , --in , --conf فایل پیکربندی ورودی را مشخص می‌کند که می‌تواند به صورت یک فایل متنی ساده معمولی یا از طریق ورودی استاندارد (''-'') داده شود. توجه داشته باشید در حال حاضر، اگر پیکربندی از طریق ورودی استاندارد داده شود، تنها از ۱ پردازنده (CPU) استفاده خواهد شد. همچنین می‌توان یک فایل PCAP با پسوند .pcap را از طریق گزینه \fB-i\fP/\fB--in\fP مشخص کرد؛ به‌طور پیش‌فرض بسته‌ها با نرخی با در نظر گرفتن برچسب زمان (timestamp) موجود در فایل PCAP ارسال می‌شوند که می‌توان با گزینه \fB-b\fP یا \fB-t\fP آن را بازنشانی کرد. .TP .B -o , -d , --out , --dev دستگاه شبکه خروجی مانند eth0، wlan0 و غیره، یا یک فایل *.pcap یا *.cfg را تعیین می‌کند. فایل‌های pcap و پیکربندی از طریق پسوند فایل شناسایی می‌شوند. .TP .B -p, --cpp پیکربندی بسته را پیش از خواندن در trafgen، از پیش‌پردازنده C عبور می‌دهد. این امکان استفاده از دستورات #define و #include (برای نمونه جهت گنجاندن تعاریف از هدرهای سیستم) را در فایل پیکربندی trafgen فراهم می‌سازد. .TP .B -D =, --define = افزودن تعریف ماکرو برای پیش‌پردازنده C جهت استفاده در فایل trafgen. این گزینه در ترکیب با گزینه \fB-p\fP/\fB--cpp\fP استفاده می‌شود. .TP .B -J, --jumbo-support به‌طور پیش‌فرض فریم‌های بافر حلقوی trafgen اندازه ثابت ۲۰۴۸ بایت دارند. این بدان معناست که اگر انتظار دارید فریم‌های بزرگ (jumbo frames) یا حتی فریم‌های بسیار بزرگ (super jumbo frames) از خط شما عبور کنند، باید با کمک این گزینه پشتیبانی از آن را فعال کنید. با این حال، این کار عیب کاهش کارایی و اشغال حافظه بیشتر برای بافر حلقوی را به همراه دارد. .TP .B -R, --rfraw در صورتی که دستگاه شبکه خروجی یک دستگاه بی‌سیم باشد، با trafgen می‌توان آن را به حالت پایش (monitor mode) درآورد و یک دستگاه mon ایجاد کرد که برای نمونه trafgen به جای wlan روی آن ارسال کند. این کار به trafgen امکان تزریق فریم‌های خام 802.11 را می‌دهد. در صورتی که خروجی یک فایل pcap باشد، نوع پیوند روی 127 (ieee80211 radio tap) تنظیم می‌شود. .TP .B -s , --smoke-test در صورتی که این گزینه فعال باشد، trafgen یک آزمون دود (smoke test) انجام خواهد داد. به عبارت دیگر، انتهای راه دور را که با آدرس مشخص شده و هدف ارسال ترافیک شبکه trafgen قرار دارد می‌آزماید تا ببیند همچنان زنده و پاسخگو است یا خیر. بدین معنا که پس از هر بسته ارسال‌شده که پیکربندی شده است، trafgen درخواست‌های پژواک ICMP (echo requests) ارسال کرده و پیش از ادامه منتظر پاسخ می‌ماند. در صورتی که انتهای راه دور بدون پاسخ بماند، trafgen فرض می‌کند که دستگاه دچار فروپاشی (crash) شده و محتوای آخرین بسته را به صورت یک پیکربندی بسته trafgen به همراه دانه تصادفی استفاده‌شده برای بازتولید باگ احتمالی چاپ می‌کند. این ویژگی ممکن است هنگام آزمایش دستگاه‌های تعبیه‌شده تجاری بسیار سودمند باشد. توصیه می‌شود بین میزبانی که trafgen را اجرا می‌کند و میزبانی که هدف ارسال trafgen قرار دارد یک اتصال مستقیم برقرار باشد. .TP .B -n <0|uint>, --num <0|uint> پردازش تعداد مشخصی از بسته‌ها و سپس خروج. اگر تعداد بسته‌ها ۰ باشد، معادل بسته‌های نامحدود یا پردازش تا زمان توقف با وقفه است. در غیر این صورت، عددی که به صورت یک عدد صحیح بدون علامت داده شود پردازش را محدود خواهد کرد. .TP .B -r, --rand انتخاب بسته از فایل پیکربندی را تصادفی می‌کند. به‌طور پیش‌فرض، اگر بیش از یک بسته در یک پیکربندی بسته تعریف شده باشد، بسته‌ها برای ارسال با روش نوبت‌گردشی (round-robin) زمان‌بندی می‌شوند. با این گزینه، آن‌ها به جای آن به صورت تصادفی انتخاب می‌شوند. .TP .B -P [-], --cpus [-] تعداد پردازه‌هایی را که trafgen باید با .BR fork (2) ایجاد کند مشخص می‌کند یا فهرست دقیق پردازنده‌هایی را که باید استفاده شوند ارائه می‌دهد. به‌طور پیش‌فرض trafgen به تعداد پردازنده‌های فعال سیستم پردازه ایجاد کرده و هر یک را به پردازنده مربوطه متصل (pin) می‌کند. یک عدد صحیح منفرد در بازه [1,CPUs] تعداد پردازه‌ها را بازنویسی می‌کند که از پردازنده اول ایجاد خواهند شد. یک جفت عدد صحیح در بازه [0,CPUs-1] که با ''-'' جدا شده‌اند بازه‌ای از پردازنده‌ها را نشان می‌دهد که برای ایجاد پردازه‌های کارگر استفاده خواهند شد. .TP .B -t