tcpflow(1) tcpflow 1.6.1 tcpflow(1)

tcpflow - ضبط‌کننده جریان‌های TCP

tcpflow [-aBcCDIpsZ] [-b max_bytes] [-d debug_level] [-[eE] scanner] [-f max_fds] [-F[ctTXMkmg]] [-h|--help] [-i iface] [-l file1.pcap file2.pcap...] [-L semlock] [-m min_bytes] [-o outdir] [-r file1.pcap] [-R file0.pcap] [-S name=value] [-T[filename template]] [-U|--relinquish-privileges username] [-v|--verbose] [-V|--version] [-w file] [-x scanner] [-X file.xml] [-z|--chroot directory] [expression]

برنامهٔ tcpflow داده‌های منتقل‌شده به‌عنوان بخشی از اتصالات TCP (جریان‌ها یا flows) را ضبط کرده و آن‌ها را به شیوه‌ای ذخیره می‌کند که برای تحلیل پروتکل یا اشکال‌زدایی مناسب باشد. به‌جای نمایش اطلاعات به‌صورت بسته به بسته، tcpflow جریان‌های دادهٔ واقعی را بازسازی کرده و هر جریان را برای تحلیل‌های بعدی در فایلی مجزا ذخیره می‌کند. tcpflow شماره‌های توالی TCP را درک می‌کند و جریان‌های داده را فارغ از ارسال‌های مجدد (retransmissions) یا تحویل بسته‌ها خارج از ترتیب، به‌درستی بازسازی می‌نماید. tcpflow امکان کنترل نام‌گذاری فایل‌ها را برای دسته‌بندی خودکار اتصالات بر اساس پروتکل، آدرس IP یا شمارهٔ اتصال فراهم می‌سازد، و مجهز به سامانهٔ افزونهٔ پیشرفته‌ای برای خارج کردن اتصالات فشرده‌شدهٔ HTTP از حالت فشرده، بازگردانی کدگذاری MIME، یا فراخوانی برنامه‌های ارائه‌شده توسط کاربر جهت پس‌پردازش است.

به‌طور پیش‌فرض tcpflow تمام داده‌های ضبط‌شده را در فایل‌هایی با نام‌هایی به این قالب ذخیره می‌کند:

192.168.101.102.02345-010.011.012.013.45103
... که محتویات فایل فوق، داده‌های منتقل‌شده از میزبان 192.168.101.102 درگاه 2345 به میزبان 10.11.12.13 درگاه 45103 خواهد بود.

اگر می‌خواهید صرفاً چند صد هزار بسته را پردازش کرده و نتیجه را مشاهده کنید، این دستور را امتحان نمایید:

tcpflow -a -o outdir -Fk -r packets.pcap
این دستور باعث می‌شود tcpflow تمام پردازش‌ها را انجام دهد (-a)، خروجی را در پوشه‌ای به نام outdir ذخیره کند، خروجی را در دایرکتوری‌هایی با ظرفیت ۱۰۰۰ اتصال تفکیک نماید، و ورودی خود را از فایل packets.pcap بخواند. البته پردازش‌های پیچیده‌تر و پیشرفته‌تر نیز امکان‌پذیر است..SH "گزینه‌ها (OPTIONS)"
فعال‌سازی تمام پردازش‌ها. معادل با -e all.
اجبار خروجی دودویی (باینری) حتی هنگام چاپ در کنسول با -C یا -c.
حداکثر اندازهٔ یک جریان (flow) ضبط‌شده را تعیین می‌کند. هر بایتی فراتر از max_bytes از نخستین بایت ضبط‌شده، نادیده گرفته خواهد شد. حالت پیش‌فرض، ذخیرهٔ تعداد نامحدودی از بایت‌ها به ازای هر جریان است. نکته: قبل از نسخهٔ ۱.۴، tcpflow تنها می‌توانست حداکثر ۴ گیبی‌بایت (4GiB) به ازای هر جریان ذخیره کند.
چاپ در کنسول. محتویات بسته‌ها را به محض دریافت در خروجی استاندارد (stdout) چاپ می‌کند، بدون آنکه داده‌های ضبط‌شده را در فایل‌ها ذخیره کند (به طور ضمنی -s را فعال می‌کند).
چاپ در کنسول بدون نمایش جزئیات مبدأ و مقصد بسته‌ها. محتویات بسته‌ها را به محض دریافت در خروجی استاندارد (stdout) چاپ می‌کند، بدون ذخیرهٔ داده‌های ضبط‌شده در فایل‌ها (به طور ضمنی -s را فعال می‌کند).
خروجی کنسول باید به صورت شانزده‌شانزدهی (hex) باشد.
سطح اشکال‌زدایی (دیباگ). سطح پیام‌های اشکال‌زدایی چاپ‌شده در خروجی خطای استاندارد (stderr) را روی debug_level تنظیم می‌کند. اعداد بزرگ‌تر پیام‌های بیشتری تولید می‌کنند. -d 0 باعث اجرای کاملاً بی‌صدا می‌شود. -d 1 ، که پیش‌فرض است، حداقل پیام‌های وضعیت را تولید می‌کند. -d 10 خروجی پرحرفی معادل با -v . تولید می‌کند. اعداد بالاتر از ۱۰ می‌توانند حجم عظیمی از اطلاعات اشکال‌زدایی تولید کنند که تنها برای توسعه‌دهندگان مفید است.
غیرفعال کردن تمام اسکنرها و سپس فعال‌سازی اسکنر name
فعال‌سازی اسکنر name.
فعال‌سازی تمام اسکنرها. معادل با -a
انجام پس‌پردازش HTTP (پردازش «پسین»). اگر فایل خروجی به صورت زیر باشد:
208.111.153.175.00080-192.168.001.064.37314,

آنگاه پس‌پردازش فایل‌های زیر را ایجاد خواهد کرد:
208.111.153.175.00080-192.168.001.064.37314-HTTP
208.111.153.175.00080-192.168.001.064.37314-HTTPBODY

اگر HTTPBODY با GZIP فشرده شده باشد، ممکن است یک فایل سوم نیز دریافت کنید:
208.111.153.175.00080-192.168.001.064.37314-HTTPBODY-GZIP

اطلاعات تکمیلی دربارهٔ این جریان‌ها، مانند مقدار هش MD5 آن‌ها، در فایل DFXML report نیز نوشته می‌شود.
پس‌پردازش محمولهٔ (payload) پروتکل TCP توسط یک تابع پایتون خارجی.

تابع پایتون باید یک پارامتر رشته‌ای دریافت کند. تابع پایتون می‌تواند یک رشته را برگرداند (در غیر این صورت تابع نباید مقداری را بازگرداند). رشتهٔ بازگردانده‌شده (در صورت وجود) در فایل DFXML report درون برچسب XML با ساختار <scan_python_result>...</scan_python_result> نوشته می‌شود. یک اسکریپت نمونهٔ پایتون درون کد منبع tcpflow در پوشهٔ python/plugins موجود است.

مثال:

tcpflow -r my.cap -e python -S py_path=python/plugins -S py_module=samplePlugin -S py_function=sampleFunction
تعیین فرمت نام فایل‌های خروجی.
مشخص‌کننده‌های فرمت:
شمارندهٔ اتصال را به انتهای همهٔ نام‌های فایل می‌افزاید.
یک برچسب زمانی یونیکس (ثانیه‌ها از زمان مبدأ) را به ابتدای هر نام فایل اضافه می‌کند.
یک برچسب زمانی ISO-8601 را به ابتدای هر نام فایل اضافه می‌کند.
هیچ فایلی را در خروجی تولید نمی‌کند (به جز فایل DFXML report ).
گنجاندن هش MD5 هر جریان در فایل DFXML report
خروجی فایل را به طور کامل متوقف می‌کند، اما فایل DFXML report همچنان تولید می‌شود.
دسته‌بندی خروجی در پوشه‌های ۱K (هزارتایی)
دسته‌بندی خروجی در پوشه‌های ۱M (میلیونی) (۲ سطح)
دسته‌بندی خروجی در پوشه‌های ۱G (میلیاردی) (۳ سطح)
حداکثر توصیف‌کننده‌های فایل استفاده‌شده. تعداد توصیف‌کننده‌های فایل مورد استفاده توسط tcpflow را به max_fds محدود می‌کند. اعداد بالاتر منابع سیستمی بیشتری مصرف می‌کنند، اما معمولاً عملکرد بهتری دارند. اگر سیستم‌عامل زیرین از فراخوان سیستمی setrlimit() پشتیبانی کند، از سیستم‌عامل خواسته می‌شود که حد درخواستی را اعمال کند. حالت پیش‌فرض این است که tcpflow از حداکثر تعداد توصیف‌کننده‌های فایل مجاز توسط سیستم‌عامل استفاده کند. گزینهٔ -v گزارش می‌دهد که tcpflow در حال استفاده از چه تعداد توصیف‌کنندهٔ فایل است.
نمایش اطلاعات جریان در کنسول با رنگ‌های چندگانه. (آبی برای جریان‌های کلاینت به سرور، قرمز برای جریان‌های سرور به کلاینت، سبز برای جریان‌های نامشخص.) نکته: این گزینه در tcpflow نسخهٔ 1.3 (با -e) و نسخهٔ 1.4.4 (با -J) متفاوت بوده است.
راهنما. نمایش اطلاعات مربوط به نحوهٔ استفاده و خروج.
راهنمای بیشتر. نمایش اطلاعات تکمیلی نحوهٔ استفاده و خروج.
نام رابط شبکه. ضبط بسته‌ها از رابط شبکه به نام iface. اگر هیچ رابطی با -i مشخص نشود، یک مقدار پیش‌فرض منطقی به‌طور خودکار توسط libpcap استفاده خواهد شد.
ذخیرهٔ برچسب‌های زمانی دریافت (بسته‌های TCP) در یک فایل همراه با نام *.findx. بنابراین هر جریان دارای دو فایل خواهد بود: (۱) فایل معمول شامل بایت‌های محموله (payload) و (۲) فایل متنی شامل برچسب‌های زمانی مربوطه. این فایل نهایی *.findx دارای سه ستون است که با نویسهٔ خط عمودی '|' از هم جدا شده‌اند:
byte-index|timestamp|length
ستون byte-index موقعیت درون فایلی است که بایت‌های محموله را در بر دارد. ستون timestamp نشان‌دهندهٔ تعداد ثانیه‌ها از مبدأ زمان یونیکس به عنوان یک عدد اعشاری ممیز شناور است. دقت آن در حد میکروثانیه است اما ممکن است در نسخه‌های آیندهٔ tcpflow به نانوثانیه نیز ارتقا یابد. ستون length تعداد بایت‌های متوالی مرتبط با timestamp است و می‌تواند شامل چندین فریم TCP (بسته‌های TCP) باشد. پسوند findx ممکن است برگرفته از این واقعیت باشد که برچسب‌های زمانی به‌صورت نمایه‌سازی‌شده با فریم (frame indexed) هستند.
مشخص می‌کند که semlock_name باید به عنوان یک سمافور یونیکس (Unix semaphore) استفاده شود تا از تداخل و چاپ همزمان دو نمونهٔ مختلف از tcpflow که در دو فرایند جداگانه اجرا می‌شوند اما روی یک خروجی استاندارد مشترک می‌نویسند، جلوگیری شود. این یک کاربرد از سمافورهای نام‌گذاری‌شده در یونیکس است؛ شرط می‌بندم تاکنون نمونه‌اش را ندیده بودید.
با آرگومان‌های پس از خود مانند نام فایل رفتار می‌کند با این فرض که پیش از هر کدام یک دستور -r قرار دارد. این کار به شما امکان می‌دهد چندین فایل را به صورت همزمان با استفاده از الگوهای انطباق پوسته (shell globbing) بخوانید. به عنوان مثال، برای پردازش تمام فایل‌های pcap در پوشهٔ جاری، از این دستور استفاده کنید:
tcpflow -o out -a -l *.pcap

-m min_size در صورتی که پرشی به اندازهٔ min_size بایت یا بیشتر در نشست TCP رخ دهد، ایجاد یک فایل خروجی جدید برای اتصال را اجباری می‌کند.
دایرکتوری خروجی را که رونوشت فایل‌ها در آن نوشته خواهند شد مشخص می‌کند.
عدم پاک‌سازی. در حالت عادی، tcpflow پس از بسته شدن اتصال با یک FIN، اتصالات را از جدول درهم‌سازی (hash table) حذف می‌کند. این کار در مصرف حافظه صرفه‌جویی می‌کند اما زمان پردازنده (CPU) بیشتری می‌گیرد. انتخاب این گزینه باعث می‌شود std::tr1:unordered_map بدون محدودیت رشد کند، همان‌گونه که tcpflow پیش از نسخهٔ 1.1 رفتار می‌کرد. این کار در صورتی که کمتر از ۱۰ میلیون اتصال وجود داشته باشد باعث اجرای سریع‌تر tcpflow می‌شود، اما می‌تواند منجر به خطاهای کمبود حافظه (out-of-memory) شود.
بدون حالت بی‌قاعده (promiscuous mode). در حالت عادی، tcpflow پیش از دریافت بسته‌ها تلاش می‌کند تا رابط شبکه را در حالت بی‌قاعده قرار دهد. گزینهٔ -p به tcpflow می‌گوید که رابط را در حالت بی‌قاعده قرار ندهد. توجه داشته باشید که ممکن است رابط بنا به دلایل دیگری از قبل در حالت بی‌قاعده باشد.
حالت بی‌صدا --- هشدارها را چاپ نمی‌کند. در حال حاضر تنها هشداری که tcpflow چاپ می‌کند، هشداری هنگام ایجاد بیش از ۱۰٬۰۰۰ فایل است مبنی بر اینکه کاربر باید گزینه‌های -Fk، -Fm یا -Fg را مشخص می‌کرد. ممکن است در آینده هشدارهای دیگری نیز اضافه شوند.
هنگامی که tcpflow به عنوان root اجرا می‌شود، این گزینه شناسهٔ کاربر و شناسهٔ گروه را تغییر می‌دهد تا فایل‌های ایجاد شده تحت مالکیت username نوشته شوند. شناسهٔ گروه، اولین گروه از فهرست گروه‌های username خواهد بود. این عملیات درست پس از باز کردن دستگاه دریافت یا درست پس از باز کردن نخستین فایل PCAP ورودی انجام می‌شود. این گزینه از چندین فایل ورودی که فقط برای root خواندنی هستند پشتیبانی نمی‌کند، چرا که دسترسی‌های root پس از باز کردن نخستین فایل سلب می‌شوند (مانند -r root-only-access.pcap -R root-only.pcap -l root-only*.pcap). این گزینه رفتاری مشابه گزینهٔ tcpdump(1) با همین نام --relinquish-privileges دارد.
خواندن از فایل. بسته‌ها را از file می‌خواند که با استفاده از گزینهٔ -w در tcpdump(1) ایجاد شده است. این گزینه می‌تواند به هر تعداد بار تکرار شود. اگر file برابر با «-» باشد، از ورودی استاندارد استفاده می‌شود. توجه داشته باشید که برای سودمند بودن این گزینه، باید هنگام دریافت بسته‌ها از گزینهٔ -s در tcpdump برای تنظیم snaplen روی MTU رابط شبکه (برای مثال 1500) استفاده شده باشد.
خواندن از یک فایل، اما تنها برای کامل کردن جریان‌های TCP. این گزینه هنگامی استفاده می‌شود که از tcpflow برای پردازش مجموعه‌ای از فایل‌ها که در طول زمان ضبط شده‌اند استفاده شود. برای هر دورهٔ زمانی n، فایل file(n).pcap باید با -R file(n).pcap پردازش شود، در حالی که file(n-1).pcap باید با -r file(n-1).pcap پردازش گردد.
پارامتر name را برای یک پلاگین برابر با value تنظیم می‌کند. برای آگاهی از تمامی پارامترهای قابل تنظیم از -hh استفاده کنید.
حذف نویسه‌های غیرقابل‌چاپ. تمام نویسه‌های غیرقابل‌چاپ را پیش از چاپ بسته‌ها در کنسول یا ذخیرهٔ آن‌ها در فایل، به نویسهٔ «.» تبدیل می‌کند.
یک الگوی دلخواه برای نام فایل‌ها مشخص می‌کند.
%A
به آدرس IP مبدأ بسط می‌یابد.
%a
به پورت IP مبدأ بسط می‌یابد.
%B
به آدرس IP مقصد بسط می‌یابد.
%b
به پورت IP مقصد بسط می‌یابد.
%T
به برچسب زمانی در قالب ISO8601 بسط می‌یابد.
%t
به برچسب زمانی در قالب time_t یونیکس بسط می‌یابد.
%V
در صورت وجود VLAN، به «--» بسط می‌یابد.
%v
در صورت وجود VLAN، به شمارهٔ VLAN بسط می‌یابد.
%C
اگر تعداد اتصال > 0 باشد، به «c» بسط می‌یابد.
%c
اگر تعداد اتصال > 0 باشد، به تعداد اتصال بسط می‌یابد.
%#
همواره به تعداد اتصال بسط می‌یابد.
%N
(connection_number ) % 1000
%K
(connection_number / 1000) % 1000
%M
(connection_number / 1000000) % 1000
%G
(connection_number / 1000000000) % 1000
%%
یک «%» چاپ می‌کند.
هنگامی که از گزینهٔ -T استفاده می‌شود، tcpflow گزینه‌های -Fk، -Fm و -Fg را نادیده می‌گیرد. با این حال، گزینهٔ -T نویسهٔ '/' را درون الگوی نام فایل برای ساخت زیردایرکتوری‌ها پردازش می‌کند. برای نمونه، خط زیر ساختار دایرکتوری out/IP-src/port-src/IP-dst/port-dst را ایجاد خواهد کرد.
tcpflow -r packets.pcap -o out -T %A/%a/%B/%b/%c%N.flow
شمارهٔ نسخه را چاپ کرده و خارج می‌شود.
عملیات پرگو (مشروح). عملکرد tcpflow را با جزئیات شرح می‌دهد. معادل با -d 10.
بسته‌هایی را که پردازش نشده‌اند در filename.pcap می‌نویسد. معمولاً این‌ها بسته‌های UDP خواهند بود.
-X filename.xml
یک گزارش DFXML را در filename.xml می‌نویسد. این فایل شامل رکوردی از تمام اتصالات tcp، نحوهٔ کامپایل برنامهٔ tcpflow، و رایانه‌ای است که tcpflow روی آن اجرا شده است. به طور پیش‌فرض، tcpflow گزارش DFXML را در فایل report.xml می‌نویسد.
جریان‌های فشرده‌شده با gzip را از حالت فشرده خارج نمی‌کند. -K ساختار pcap مجزا به ازای هر جریان را حفظ می‌کند.
مشخص می‌کند که کدام بسته‌ها دریافت خواهند شد. اگر هیچ expression ارائه‌ نشود، تمام بسته‌های روی شبکه دریافت خواهند شد. در غیر این صورت، تنها بسته‌هایی که expression برای آن‌ها «true» باشد دریافت خواهند شد.
برای نحو دستورات expression، به pcap-filter(7) مراجعه کنید.
آرگومان expression می‌تواند به صورت یک آرگومان تکی شل (Shell) یا چندین آرگومان شل، بسته به راحتی کاربر، به tcpflow ارسال شود. به طور کلی، اگر عبارت شامل نویسه‌های ویژهٔ شل باشد، مانند بک‌اسلش‌هایی که برای گریز از نام پروتکل‌ها استفاده می‌شوند، ارسال آن به عنوان یک تک‌آرگومان نقل‌قول‌شده بسیار آسان‌تر از گریز دادن تک‌تک نویسه‌های ویژهٔ شل است. آرگومان‌های چندگانه پیش از پردازش با فاصله به یکدیگر متصل می‌شوند..SH "گزارش DFXML (DFXML report)"

گزارش DFXML فایل XML نوشته‌شده توسط tcpflow است که جزئیات ساخت tcpflow، آرگومان‌های خط فرمان و اطلاعات مربوط به جریان‌های پردازش‌شده را ارائه می‌دهد.

به‌طور پیش‌فرض، فایل DFXML به نام report.xml نام‌گذاری می‌شود. اما این نام فایل را می‌توان با استفاده از گزینه خط فرمان -X تغییر داد.

فایل DFXML از شمای DFXML تعریف‌شده توسط پروژه https://github.com/dfxml-working-group/dfxml_schema پیروی می‌کند.
علاوه بر این، tcpflow دو برچسب اضافی XML را اضافه می‌کند، همان‌طور که در مثال زیر نشان داده شده است:


<tcpflow startime='2017-07-22T00:12:21.962782Z' endtime='2017-07-22T00:12:22.097591Z'
         family='2' mac_daddr='40:3d:78:57:ed:d4' mac_saddr='00:c5:42:d2:cb:f2'
         src_ipn='141.134.34.12' dst_ipn='192.168.0.40' srcport='80' dstport='38797'
         packets='4' len='677' caplen='611' />
<tcpflow:result scanner="python" path="python/plugins" module="samplePlugin"
                function="sampleFunction">bla bla bla</tcpflow:result>

نخستین برچسب XML یعنی <tcpflow> اطلاعات مربوط به جریان ضبط‌شده را ارائه می‌دهد. این برچسب در نسخه‌های بعدی باید به <tcpflow:cap> تغییر نام یابد تا انطباق بهتری با شمای DFXML داشته باشد.

دومین برچسب XML یعنی <tcpflow:result> نتایج پردازش را گردآوری می‌کند. در حال حاضر، تنها اسکنر python از این قابلیت استفاده می‌کند.

ویژگی‌های XML برچسب <tcpflow> عبارتند از:

  • startime زمان دریافت نخستین بسته
  • endtime زمان دریافت آخرین بسته
  • family
  • mac_daddr نشانی MAC مقصد نخستین بسته (در صورت وجود چاپ می‌شود)
  • mac_saddr نشانی MAC مبدأ نخستین بسته (در صورت وجود چاپ می‌شود)
  • src_ipn نشانی IP مبدأ
  • dst_ipn نشانی IP مقصد
  • srcport درگاه TCP مبدأ
  • dstport درگاه TCP مقصد
  • packets تعداد بسته‌ها
  • out_of_order_count تعداد دفعاتی که tcpflow داده‌های مفید (payload) مفقود را در فایل جریان با صفر جایگزین کرده است، برای مثال زمانی که داده‌های ضبط‌شده شامل شروع نشست TCP نباشد (در صورت وجود چاپ می‌شود)
  • violations تعداد موارد نقض پروتکل (در صورت وجود چاپ می‌شود)
  • len مجموع طول برش‌نخورده تمام داده‌های بسته‌ها (شامل سرایندها، https://stackoverflow.com/q/1491660 را ببینید)
  • caplen مجموع بایت‌های ضبط‌شده از تمام داده‌های بسته‌ها (شامل سرایندها، در صورتی که با len متفاوت باشد چاپ می‌شود)

ویژگی‌های XML برچسب <tcpflow:result> عبارتند از:

  • scanner نام اسکنر
  • path دایرکتوری ماژول اسکنر (در صورت مرتبط بودن چاپ می‌شود)
  • module نام ماژول (در صورت مرتبط بودن چاپ می‌شود، برای مشخص کردن اسکریپت python به‌کار می‌رود)
  • function نام تابع (در صورت مرتبط بودن چاپ می‌شود، برای مشخص کردن تابع درون ماژول python به‌کار می‌رود)

برای ضبط تمام بسته‌های ورودی به یا خروجی از sundown و استخراج تمام پیوست‌های HTTP:

tcpflow -e http -o outdir host sundown

برای ضبط ترافیک بین helios و hot یا ace و دسته‌بندی نتایج در ۱۰۰۰ فایل در هر دایرکتوری و محاسبه MD5 هر جریان:

tcpflow -X report.xml -e md5 -o outdir -Fk host helios and \( hot or ace \)

لطفاً گزارش باگ‌ها را به simsong@acm.org ارسال کنید.

در حال حاضر tcpflow قطعه‌های IP (IP fragments) را متوجه نمی‌شود. جریان‌های حاوی قطعه‌های IP به‌درستی ضبط نخواهند شد.

نگارش اولیه توسط Jeremy Elson <jelson@circlemud.org>. تغییرات اساسی و نگهداری توسط Simson L. Garfinkel <simsong@acm.org>. کد مصورسازی شبکه توسط Michael Shick <mike@shick.in>

نسخه فعلی این نرم‌افزار در نشانی زیر در دسترس است:

فهرست پستی اعلان‌های این برنامه در نشانی زیر قرار دارد:

http://groups.google.com/group/tcpflow-users tcpdump(1), nit(4P), bpf(4), pcap(3), pcap-savefile(5), pcap-filter(7)
2013-04-13 tcpflow 1.6.1