darkstat(8) System Manager's Manual darkstat(8)

darkstat - پویشگر ترافیک شبکه

darkstat [ -i interface ] [ -r file ] [ --snaplen bytes ] [ --pppoe ] [ --syslog ] [ --verbose ] [ --no-daemon ] [ --no-promisc ] [ --no-dns ] [ --no-macs ] [ --no-lastseen ] [ -p port ] [ -b bindaddr ] [ --base path ] [ -f filter ] [ -l network/netmask ] [ --local-only ] [ --chroot dir ] [ --user username ] [ --daylog filename ] [ --import filename ] [ --export filename ] [ --pidfile filename ] [ --hosts-max count ] [ --hosts-keep count ] [ --ports-max count ] [ --ports-keep count ] [ --highest-port port ] [ --wait secs ] [ --hexdump ]

darkstat یک شنودکننده بسته (packet sniffer) است که به‌صورت فرایند پس‌زمینه اجرا می‌شود، انواع مختلفی از آمارهای مربوط به استفاده از شبکه را گردآوری می‌کند، و آن‌ها را از طریق پروتکل HTTP ارائه می‌دهد.

تمامی تنظیمات از طریق خط فرمان منتقل می‌شوند.

ترافیک را روی رابط شبکه مشخص‌شده ضبط می‌کند. این تنها آرگومان اجباری خط فرمان است.
به‌جای ضبط ترافیک زنده، آن را از یک فایل ضبط pcap(3) می‌خواند. این گزینه فقط برای توسعه و بنچمارک مفید است. آرگومان‌های -r و -i ناسازگار با یکدیگر هستند (مانعة‌الجمع).
تعداد بایت‌هایی که باید از ابتدای هر بسته ضبط شود. نیازی به تعیین این گزینه ندارید؛ darkstat آن را به‌طور خودکار محاسبه خواهد کرد.
از این گزینه استفاده نکنید.

به‌جای آن، روی رابط تونلی که نرم‌افزار PPPoE شما ارائه می‌دهد ترافیک را ضبط کنید، برای مثال tun0 در FreeBSD، یا pppoe0 در OpenBSD یا NetBSD.

اگر واقعاً مجبور هستید، می‌توانید روی یک رابط اترنت شنود کنید و این آرگومان را بفرستید تا darkstat فریم‌های PPPoE را رمزگشایی کرده و بقیه موارد را نادیده بگیرد. اطمینان حاصل کنید که آدرس محلی خود را نیز با استفاده از آرگومان -l مشخص کرده‌اید!

خطاها، هشدارها و پیام‌های پرجزئیات به‌جای stderr به syslog (با تسهیلات daemon و اولویت debug) فرستاده خواهند شد.

در برخی سیستم‌ها، این پیام‌ها به‌طور پیش‌فرض در /var/log/debug قرار می‌گیرند.

پیام‌های اشکال‌زدایی با جزئیات بیشتر تولید می‌کند.
از ترمینال کنترلی جدا نشو؛ در پیش‌زمینه باقی بمان.
از حالت بی‌قید (promiscuous mode) برای ضبط استفاده نکن. توجه داشته باشید که ممکن است یک رابط به دلایلی خارج از کنترل darkstat از قبل در حالت بی‌قید باشد، یا بعداً وارد این حالت شود. اگر این موضوع مشکل‌ساز است، از -f برای تعیین یک فیلتر مناسب bpf(4) استفاده کنید.
آدرس‌های IP را به نام میزبان ترجمه نکن. این کار می‌تواند میزان مصرف حافظه را در سیستم‌های کوچک به‌میزان قابل‌توجهی کاهش دهد، زیرا یک فرایند اضافی برای وضوح نام DNS ایجاد می‌شود.
آدرس‌های MAC را در جدول میزبان‌ها نمایش نده.
زمان آخرین مشاهده را در جدول میزبان‌ها نمایش نده.
واسط وب را به درگاه (پورت) مشخص‌شده متصل می‌کند. مقدار پیش‌فرض 667 است.
واسط وب را به آدرس مشخص‌شده متصل می‌کند. حالت پیش‌فرض گوش دادن روی همه رابط‌ها است.
مسیر نشانی وب پایه (Base URL) را مشخص می‌کند. این گزینه در صورتی که darkstat از طریق پراکسی معکوس در دسترس باشد می‌تواند مفید باشد.

برای مثال، اگر از mod_proxy آپاچی استفاده می‌کنید و می‌خواهید از پیکربندی پیچیده با mod_proxy_html (و mod_header برای حذف هدر Accept-Encoding) اجتناب کنید، کافی است مسیر پایه را روی مقداری مانند stats تنظیم کرده و از پیکربندی مشابه قطعه‌کد زیر استفاده کنید:

ProxyPass /stats/ http://localhost:667/stats/ ProxyPassReverse /stats/ http://localhost:667/stats/

مقدار پیش‌فرض / (یعنی ریشه) است.

از عبارت فیلتر مشخص‌شده هنگام ضبط ترافیک استفاده می‌کند. قواعد نگارش فیلتر فراتر از محدوده این صفحه راهنما است؛ لطفاً به مستندات tcpdump(1) مراجعه کنید.
یک «شبکه محلی» بر اساس آدرس‌های شبکه و ماسک شبکه (netmask) تعریف می‌کند. برخلاف رفتار پیش‌فرض که فقط ترافیک به/از میزبان محلی را نمودار می‌کند، تمام ترافیک ورودی یا خروجی این شبکه روی نمودار نشان داده خواهد شد.

قاعده این است که اگر ip_addr & netmask == network باشد، آن آدرس محلی در نظر گرفته می‌شود. مثال استفاده را در زیر مشاهده کنید.

باعث می‌شود واسط وب تنها میزبان‌های حاضر در «شبکه محلی» را نمایش دهد. این گزینه برای استفاده هم‌زمان با آرگومان -l در نظر گرفته شده است.
دستور darkstat را وادار می‌کند تا به دایرکتوری مشخص‌شده chroot() کند. بدون این آرگومان، از یک دایرکتوری پیش‌فرض استفاده می‌شود که در زمان کامپایل برنامه مشخص شده است؛ معمولاً /var/empty یا /var/lib/empty.

به دلایل امنیتی، این دایرکتوری باید خالی باشد و کاربری که darkstat تحت نام آن اجرا می‌شود نباید دسترسی نوشتن به آن داشته باشد.

با این حال، اگر قصد استفاده از --daylog یا --export را دارید، darkstat به دسترسی نوشتن روی دایرکتوری chroot نیاز خواهد داشت. اگر نگران پیامدهای امنیتی این موضوع هستید، از هیچ قابلیتی که نیازمند دسترسی نوشتن است استفاده نکنید.

دستور darkstat را وادار می‌کند تا امتیازات دسترسی را به uid و gid کاربر مشخص‌شده کاهش دهد. بدون این آرگومان، از یک مقدار پیش‌فرض استفاده می‌شود که در زمان کامپایل تنظیم شده است؛ معمولاً nobody.

به دلایل امنیتی، این کاربر نباید root باشد.

آمارهای روزانه ترافیک را در فایل نام‌برده، به‌صورت نسبی نسبت به دایرکتوری chroot، ثبت می‌کند. اگر می‌خواهید از --daylog استفاده کنید، ابتدا باید دایرکتوری --chroot را مشخص نمایید و این دایرکتوری باید توسط کاربر darkstat قابل نوشتن باشد. دایرکتوری chroot قابل نوشتن پیامدهای امنیتی دارد؛ اگر نگران این موضوع هستید، از قابلیت --daylog استفاده نکنید.

اگر آرگومان daylog مشخص نشود، هیچ‌گونه ثبت وقایعی انجام نمی‌گیرد.

فرمت روزنگار (daylog) به‌صورت زیر است:

localtime|time_t|bytes_in|bytes_out|pkts_in|pkts_outs

خطوطی که با # شروع می‌شوند کامنت‌هایی هستند که زمان شروع و توقف ثبت را نشان می‌دهند.

هنگام شروع، یک پایگاه‌داده darkstat را از فایل نام‌برده به‌صورت نسبی نسبت به دایرکتوری chroot وارد (import) می‌کند. اگر می‌خواهید از --import استفاده کنید، ابتدا باید دایرکتوری --chroot را مشخص نمایید. اگر وارد کردن ناموفق باشد، darkstat با یک پایگاه‌داده خالی شروع به کار می‌کند.
هنگام خاموش شدن برنامه، یا هنگام دریافت سیگنال SIGUSR1 یا SIGUSR2، پایگاه‌داده درون حافظه را به فایل نام‌برده، به‌صورت نسبی نسبت به دایرکتوری chroot صادر (export) می‌کند. اگر می‌خواهید از --export استفاده کنید، ابتدا باید دایرکتوری --chroot را مشخص نمایید، و این دایرکتوری باید توسط کاربر darkstat قابل نوشتن باشد. دایرکتوری chroot قابل نوشتن پیامدهای امنیتی دارد — اگر نگران این موضوع هستید، از قابلیت --export استفاده نکنید.
فایلی حاوی شناسه فرایند (Process ID) دستور darkstat ایجاد می‌کند. این فایل هنگام خاموش شدن تمیز برنامه حذف خواهد شد. همانند تمام فایل‌های pid، اگر darkstat به‌صورت غیرعادی متوقف شود، ممکن است یک فایل pid بی‌استفاده باقی بماند.

برای مثال، darkstat را به این شکل اجرا کنید:

darkstat -i fxp0 --chroot /var/run/darkstat --pidfile darkstat.pid

و برای متوقف کردن آن از دستور زیر استفاده کنید:

kill `cat /var/run/darkstat/darkstat.pid`

به‌طور پیش‌فرض، kill(1) سیگنال SIGTERM ارسال می‌کند که باعث می‌شود darkstat به‌صورت تمیز متوقف شود.

حداکثر تعداد میزبان‌هایی که در جدول میزبان‌ها نگهداری خواهند شد. این مقدار برای محدود کردن حجم داده‌های آماری نگهداری‌شده در حافظه استفاده می‌شود. مقدار --hosts-max باید بزرگ‌تر از --hosts-keep باشد.
هنگامی که جدول میزبان‌ها به مقدار --hosts-max می‌رسد و ترافیکی از یک میزبان جدید دیده می‌شود، جدول میزبان‌ها پاک‌سازی شده و تنها تعداد --hosts-keep از برترین میزبان‌ها بر اساس مجموع ترافیک نگه‌داشته می‌شوند.
حداکثر تعداد درگاه‌هایی که برای هر میزبان ردیابی خواهد شد. این مقدار برای محدود کردن حجم داده‌های آماری نگهداری‌شده در حافظه استفاده می‌شود. مقدار --ports-max باید بزرگ‌تر از --ports-keep باشد.
هنگامی که جدول پورت‌ها پر می‌شود، این تعداد پورت حفظ شده و بقیه دور ریخته می‌شوند.
پورت‌هایی که شماره آن‌ها بیشتر از این مقدار باشد در جداول پورت‌های هر میزبان نمایش داده نخواهند شد، هرچند ترافیک آن‌ها همچنان محاسبه می‌شود. از این گزینه می‌توان برای مخفی کردن درگاه‌های موقت (ephemeral ports) استفاده کرد. به‌طور پیش‌فرض، تمام پورت‌ها ردیابی می‌شوند.
از این گزینه استفاده نکنید. این یک راهکار موقت برای کمک به کاربران درگیر با NetworkManager و سیستم‌های مشابه است.

شما باید darkstat را پس از بالا آمدن رابط شبکه شنود اجرا کنید. اگر امکان این کار را ندارید، مشخص کردن گزینه --wait باعث می‌شود darkstat تا تعداد ثانیه‌های مشخص‌شده برای آماده شدن رابط به خواب برود. مقدار صفر به معنی انتظار نامحدود است.

نمایش هگزادسیمال (hex dump) از ترافیک دریافتی را نشان می‌دهد. این گزینه فقط برای اشکال‌زدایی است و گزینه‌های --verbose و --no-daemon را نیز فعال می‌کند.

برای گردآوری آمار روی رابط fxp0:

darkstat -i fxp0

می‌خواهیم ترافیک را روی رابط متصل به اینترنت محاسبه کنیم، اما صفحات وب را فقط به شبکه محلی خصوصی خود که در آن دارای نشانی IP برابر با 192.168.0.1 هستیم ارائه دهیم:

darkstat -i fxp0 -b 192.168.0.1

می‌خواهیم صفحات وب را روی درگاه استاندارد HTTP ارائه دهیم:

darkstat -i fxp0 -p 80

ما در شبکه کابلی Optus هستیم و نمی‌خواهیم ترافیک دائمی ARP را که دریافت می‌کنیم محاسبه کنیم:

darkstat -i fxp0 -f "not arp"

تنها می‌خواهیم ترافیک پروتکل SSH را محاسبه کنیم:

darkstat -i fxp0 -f "port 22"

نمی‌خواهیم ترافیک بین آدرس‌های IP داخلی محاسبه شود:

darkstat -i fxp0 -f "not (src net 192.168.0 and dst net 192.168.0)"

(برای مرجع کامل قواعد فیلتر، به صفحه راهنمای tcpdump(1) مراجعه کنید)

ما شبکه‌ای متشکل از یک سرور دروازه (192.168.1.1) و چند ایستگاه کاری (192.168.1.2، 192.168.1.3 و غیره) داریم و می‌خواهیم تمام ترافیک ورودی و خروجی شبکه محلی را نمودار کنیم، نه فقط سرور دروازه را (که darkstat روی آن اجرا می‌شود):

darkstat -i fxp0 -l 192.168.1.0/255.255.255.0

در برخی سیستم‌ها، نمی‌توان روی یک رابط «رمزگشایی‌شده» ترافیک را ضبط کرد و تنها می‌توان روی nas0 شنود کرد که بسته‌های کپسوله‌شده PPPoE را بازمی‌گرداند. رمزگشایی PPPoE را انجام دهید و IP محلی را دستی جایگزین کنید چون امکان تشخیص خودکار آن وجود ندارد. به ماسک شبکه 32/ دقت کنید:

darkstat -i nas0 --pppoe -l 192.168.1.1/255.255.255.255

برای خاموش کردن تمیز darkstat، یک سیگنال SIGTERM یا SIGINT به فرایند والد darkstat ارسال کنید.

ارسال سیگنال SIGUSR1 باعث می‌شود darkstat پایگاه‌داده درون حافظه خود را خالی کند. اگر فایل --export تعیین شده باشد، ابتدا پایگاه‌داده را در فایل ذخیره می‌کند. ارسال SIGUSR2 پایگاه‌داده را بدون خالی کردن آن ذخیره خواهد کرد.

نشانگر ماوس خود را روی یک میله نگه‌دارید؛ کادر راهنمایی (tooltip) ظاهر می‌شود که دقیقاً تعداد بایت‌های ورودی و خروجی آن میله را نشان می‌دهد.

چون پیاده‌سازی آن‌ها دشوار است. و انجام این کار به‌صورت درست و به‌نحوی که در تمام مرورگرها کار کند، تقریباً ناممکن به نظر می‌رسد.

شاید روزی برای آن تلاش کنم. در این میان، وصله‌ها با کمال میل پذیرفته می‌شوند.

نمودارها فقط ترافیک ورودی/خروجی میزبان محلی را نشان می‌دهند که با دریافت آدرس IP رابطی که روی آن شنود می‌کنید تعیین می‌شود.

می‌توانید از آرگومان -l برای جایگزینی آدرس محلی به منظور مقاصد محاسباتی استفاده کنید. همچنین می‌توانید با تعیین یک ماسک شبکه مناسب، از آن برای انجام محاسبات ترافیک یک زیرشبکه کامل استفاده نمایید.

tcpdump(1)

دستور darkstat در سال 2001 نوشته شد، که عمدتاً نتیجه اعمال سقف ترافیک ماهانه ۳ گیگابایتی توسط یکی از ارائه‌دهندگان اینترنت کابلی استرالیا بود.

امیل میکولیچ (Emil Mikulic) و دیگران. (فایل AUTHORS را ببینید)

https://unix4lyfe.org/darkstat

June 2011 darkstat 3.0.722