خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را


آموزش استفاده از tcpdump در لینوکس

آموزش استفاده از tcpdump در لینوکس
tcpdump یک ابزار خط فرمان است که می‌توانید از آن برای رکورد و ضبط و capture کردن، بازرسی ترافیک شبکه از سیستم خود استفاده کنید. tcpdump یکی رایج ترین ابزار مورد استفاده در بین مدیران شبکه برای عیب یابی مشکلات شبکه و تست امنیت است.

نرم افزار سامانه مودیان راهکار
با tcpdump حتی می توانید ترافیک غیر TCP مانند UDP، ARP یا ICMP را نیز capture کنید. بسته های capture شده را می توان در یک فایل یا خروجی نوشت. یکی از قدرتمندترین ویژگی های دستور tcpdump توانایی آن در استفاده از فیلترها و گرفتن تنها داده هایی است که می خواهید آنالیز کنید. در این مقاله به اصول استفاده از دستور tcpdump در لینوکس می پردازیم.



Installing tcpdump

Tcpdump به طور پیش فرض روی اکثر توزیع های لینوکس و macOS نصب شده است. برای بررسی اینکه آیا دستور tcpdump در سیستم شما موجود است یا خیر، دستور زیر را اجرا کنید:

tcpdump --version

خروجی دستور در سیستم لینوکس اوبونتوی من، عبارت زیر بود که ممکن است در سیستم لینوکس شما متفاوت باشد:

tcpdump version 4.9.3
libpcap version 1.9.1 (with TPACKET_V3)
OpenSSL 1.1.1f 31 Mar 2020

اگر tcpdump در سیستم شما نصب نباشد، به جای خروجی های فوق، عبارت tcpdump: command not found به شما نشان داده می شود. به راحتی می توانید tcpdump را با استفاده از پکیج منیجر توزیع لینوکس خود نصب کنید.

نصب tcpdump در اوبونتو و دبیان

sudo apt update && sudo apt install tcpdump

نصب tcpdump در CentOS و Fedora


sudo yum install tcpdump

نصب tcpdump در Arch Linux


sudo pacman -S tcpdump

Capture کردن بسته های شبکه با tcpdump

سینتکس کلی دستور tcpdump به صورت زیر است:

tcpdump [Options] [expression]

options ها در دستور در واقع گزینه هایی هستند که امکاناتی را به شما می دهند و رفتار دستور tcpdump را کنترل می کنند. در expression هم مشخص می کنید که چه پکت های باید Capture شوند.
فقط root یا کاربر با امتیازات sudo می تواند tcpdump را اجرا کند. اگر بخواهید دستور را به عنوان یک کاربر غیرمجاز اجرا کنید با خطای You don’t have permission to capture on that device مواجه می شوید.

ساده ترین مورد استفاده، فراخوانی tcpdump بدون هیچ گزینه و فیلتری است:

sudo tcpdump

چیزی شبیه به خروجی زیر را دریافت خواهید کرد:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
15:47:24.248737 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248785 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 108:144, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 36
15:47:24.248828 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 144:252, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108

... Long output suppressed

23116 packets captured
23300 packets received by filter
184 packets dropped by kernel

tcpdump به گرفتن بسته ها و نوشتن در خروجی کار را ادامه می دهد تا زمانی که سیگنال وقفه را دریافت کند. از کلیدهای Ctrl+C برای وقفه و توقف فرمان استفاده کنید.
با استفاده از گزینه c- می توانید تعداد پکت هایی را که باید capture شوند را مشخص کنید. به عنوان مثال، برای capture کردن فقط ده بسته، باید دستور زیر را اجرا کنید:

sudo tcpdump -c 10

پس از capture کردن بسته ها، tcpdump استپ می شود. اگر هیچ اینترفیسی مشخص نشده باشد، tcpdump از اولین اینترفیسی که پیدا کند، استفاده کرده و تمام بسته هایی را که از آن اینترفیس عبور می کنند را ضبط می کند.
از گزینه D- برای نمایش لیستی از تمام اینترفیس های شبکه موجود استفاده کنید که tcpdump می تواند بسته ها را از آنها جمع آوری کند:

sudo tcpdump -D

برای هر اینترفیس، دستور نام اینترفیس، یک توضیح کوتاه را نمایش می دهد.

1.ens33 [Up, Running]
2.lo [Up, Running, Loopback]
3.any (Pseudo-device that captures on all interfaces) [Up, Running]
4.bluetooth-monitor (Bluetooth Linux Monitor) [none]
5.nflog (Linux netfilter log (NFLOG) interface) [none]
6.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]

خروجی بالا نشان می دهد کهens33 اولین کارت شبکه با اینترفیسی است که توسط tcpdump یافت می شود و زمانی استفاده می شود که هیچ اینترفیسی برای دستور ارائه نشده باشد. اینترفیس سوم any یک دستگاه ویژه است که به شما امکان می دهد تمام اینترفیس های فعال را ضبط کنید.
برای تعیین اینترفیسی که می‌خواهید ترافیک را در آن ثبت کنید، دستور را با گزینه i- و سپس نام اینترفیس یا شماره مربوطه فراخوانی و اجرا کنید. به عنوان مثال، برای گرفتن تمام بسته ها از همه اینترفیس ها می توانید اینترفیس any را معرفی کنید.

sudo tcpdump -i any

بصورت پیشفرض tcpdump تحلیل نام معکوس یا revers را روی IP address ها انجام می دهد و شماره پورت ها را به نام ترجمه می کند. برای غیرفعال کردن ترجمه از گزینه n- استفاده کنید:

sudo tcpdump -n

پرش کردن از تحلیل نام منجر به این می شود که از ترافیک DNS جلوگیری بعمل آید و خروجی را خواناتر می کند. توصیه می شود هر زمان که tcpdump را و اجرا می کنید از این گزینه استفاده کنید. به جای نمایش خروجی روی صفحه، می توانید با استفاده از عملگرهای تغییر مسیر > و >> آن را به یک فایل redirect کنید:

sudo tcpdump -n -i any > file.out

همچنین می توانید داده ها را هنگام ذخیره در یک فایل با استفاده از دستور tee مشاهده کنید:

sudo tcpdump -n -l | tee file.out

گزینه l- در دستور بالا به tcpdump می گوید که خط خروجی را بافر کند. وقتی از این گزینه استفاده نمی شود، هنگام ایجاد خط جدید، خروجی روی صفحه نمایش داده نمی شود.

tcpdump اطلاعات را برای هر بسته ضبط و Capture شده در یک خط جدید خروجی می دهد. هر خط بسته به پروتکل، شامل یک timestamp و اطلاعات مربوط به آن بسته است. فرمت معمولی یک خط پروتکل TCP به صورت زیر است:

[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]

اجازه دهید همه این موارد را به صورت کلی بررسی کنیم. مثلا به خط خروجی زیر دقت کنید:

15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108

15:47:24.248737 مهر زمانی یا timestamp بسته به تایم سیستم شماست و از فرمت زیر استفاده می کند:
hours:minutes:seconds.frac، که frac کسری از ثانیه از نیمه شب است.
IP که مشخصا به IPV4 اشاره دارد.
192.168.1.185.22 که آی پی منیع یا source IP address است که شماره پورت با . جدا و مشخص شده است.
192.168.1.150.37445 آی پی مقصد یا destination IP address است و پورت با . جدا شده است.
Flags [P.] فیلد flag های TCP است. در این مثال، [P.] به معنای بسته تأیید است که برای تأیید بسته قبلی و ارسال داده استفاده می شود. سایر مقادیر فیلد flag به شرح زیر است:

[.] - ACK (Acknowledgment)
[S] - SYN (Start Connection)
[P] - PSH (Push Data)
[F] - FIN (Finish Connection)
[R] - RST (Reset Connection)
[S.] - SYN-ACK (SynAcK Packet)

seq 201747193:201747301 یا sequence number تعداد داده های موجود در بسته را نشان می دهد. به جز اولین بسته در جریان داده که این اعداد مطلق هستند، همه بسته های بعدی به عنوان موقعیت بایت نسبی استفاده می شوند. در این مثال، عدد 201747193:201747301 است، به این معنی که این بسته حاوی بایت های 201747193 تا 201747301 جریان داده است. از گزینه S- برای نمایش sequence number مطلق استفاده می شود.
ack 1226568763 شماره تأیید، شماره توالی داده های بعدی است که در سر دیگر این اتصال است.
win 402 تعداد بایت های موجود در بافر دریافت کننده است.
length 108 طول داده payload یا بار است.
هنگامی که tcpdump بدون فیلتر فراخوانی و اجرا می شود، تمام ترافیک را جذب کرده و مقدار زیادی خروجی تولید می کند که یافتن و آنالیز بسته های مورد نظر را بسیار دشوار می کند. فیلترها یکی از قدرتمندترین ویژگی های دستور tcpdump هستند چرا که به شما اجازه می دهند فقط بسته هایی را که با عبارت مطابقت دارند را ضبط کنید. به عنوان مثال، هنگام عیب یابی مشکلات مربوط به یک وب سرور، می توانید از فیلترها برای به دست آوردن فقط ترافیک HTTP استفاده کنید.
tcpdump از سینتکس Berkeley Packet Filter یا به اختصار BPF برای فیلتر کردن بسته‌های capture شده با استفاده از پارامترهای مختلف مانند پروتکل‌ها، IP Address ها و پورت‌های مبدا و مقصد و غیره استفاده می‌کند.
برای محدود کردن capture به یک پروتکل خاص، پروتکل را به عنوان فیلتر مشخص کنید. به عنوان مثال، برای گرفتن فقط ترافیک UDP، دستور زیر را باید اجرا کنید:

sudo tcpdump -n udp

راه دیگر برای تعریف پروتکل استفاده از proto و به دنبال آن شماره پروتکل است. دستور زیر پروتکل شماره 17 را فیلتر می‌کند و همان نتیجه بالا را نشان می دهد:

sudo tcpdump -n proto 17

برای دریافت اطلاعات بیشتر به لیست IP protocol numbers مراجعه کنید.

برای capture فقط بسته های مربوط به یک هاست خاص، بصورت زیر دستور را اجرا کنید.

sudo tcpdump -n host 192.168.1.185

هاست می تواند یک IP address و یا یک name باشد.
همچنین می‌توانید خروجی را به یک محدوده IP معین با استفاده از دستور net فیلتر کنید. به عنوان مثال، برای capture کردن فقط بسته های مربوط به 10.10.0.0./16 باید دستور زیر را اجرا کنید:

sudo tcpdump -n net 10.10

برای محدود کردن capture فقط به بسته هایی از یک پورت خاص یا به آن پورت خاص، دستور port را استفاده کنید. دستور زیر بسته های مربوط به سرویس SSH (پورت 22) را با استفاده از این دستور capture می کند:

sudo tcpdump -n port 23

Portrange به شما امکان می دهد ترافیک را در محدوده ای از پورت ها capture کنید:

sudo tcpdump -n portrange 110-150

همچنین می‌توانید بسته‌ها را بر اساس پورت یا هاست مبدا یا مقصد با استفاده از دستورات src، dst، src و dst، و src یا dst فیلتر کنید.
دستور زیر بسته های دریافتی از هاست با آی پی 192.168.1.185 را Capture می کند:

sudo tcpdump -n src host 192.168.1.185

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

sudo tcpdump -n dst port 80

فیلترها را می توان با استفاده از عملگرهای and (&&)، OR (||) و not که با علامت ! نشان داده می شود، ترکیب کرد. به عنوان مثال، برای capture کردن تمام ترافیک های HTTP که از IP سورس 192.168.1.185 می آید، از این دستور استفاده کنید:

sudo tcpdump -n src 192.168.1.185 and tcp port 80

ضمنا می توانید از پرانتز برای گروه بندی و ایجاد فیلترهای پیچیده تر استفاده کنید:

sudo tcpdump -n 'host 192.168.1.185 and (tcp port 80 or tcp port 443)'

برای جلوگیری از خطا در هنگام استفاده از کاراکترهای خاص، فیلترها را داخل single quotes قرار دهید.
در ادامه مثال دیگری برای گرفتن همه ترافیک ها به جز SSH از IP سورس 192.168.1.185 را مشاهده خواهید کرد:

sudo tcpdump -n src 192.168.1.185 and not dst port 22

به طور پیش فرض tcpdump، فقط packet header را می گیرد اما شاید بعضا نیاز باشد که محتوای پکت ها را بررسی کنید.
tcpdump به شما امکان می دهد محتوای بسته ها را به صورت ASCII و HEX نمایش دهید.
گزینه A- به tcpdump می گوید که هر پکت را در ASCII و x- در HEX نمایش دهد.

sudo tcpdump -n -A

برای نشان دادن محتویات پکت در HEX و ASCII از گزینه X- استفاده کنید:

sudo tcpdump -n -X

یکی دیگر از ویژگی های مفید tcpdump درج پکت ها در یک فایل است. هنگامی که شما در حال capture کردن تعداد زیادی پکت یا capture کردن پکت هایی برای آنالیزهای بعدی هستید، این کار مفید است. برای این منظور از گزینه w- استفاده کنید.

sudo tcpdump -n -w data.pcap

این دستور بالا capture را در فایلی با نام data.pcap ذخیره می کند. نام فایل را هر چه می خواهید بگذارید ولی پسوند را pcap که مخفف packet capture است قرار دهید.
وقتی از گزینه w- استفاده می شود، خروجی روی صفحه نمایش داده نمی شود. tcpdump پکت های خام را می نویسد و یک فایل باینری ایجاد می کند که با یک ویرایشگر متن معمولی قابل خواندن نیست. برای بررسی محتویات فایل، tcpdump را با گزینه r- اجرا کنید:

sudo tcpdump -r data.pcap

اگر می‌خواهید tcpdump را در پس‌زمینه اجرا کنید، علامت آمپرسند (&) را در انتهای دستور اضافه کنید. فایل capture را می توان با سایر ابزارهای تحلیلگر پکت های شبکه مانند Wireshark نیز بررسی کرد.
هنگام گرفتن بسته ها در مدت زمان طولانی، می توانید file rotation را فعال کنید. tcpdump به شما امکان می دهد فایل های جدید ایجاد کنید و فایل را در یک بازه زمانی مشخص یا اندازه ثابت rotate کنید. دستور زیر حداکثر ده فایل 200 مگابایتی با نام‌های file.pcap0، file.pcap1 و غیره ایجاد می‌کند و پس از آن به اولین فایل برگشته و به ترتیب روی فایل ها می نویسد و در واقع overwrite می کند.

sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap

پس از ایجاد ده فایل، فایل های قدیمی تر overwrite می شوند. لطفاً توجه داشته باشید که فقط در هنگام عیب یابی باید tcpdump را اجرا کنید. اگر می خواهید tcpdump را در زمان خاصی استارت کنید، می توانید از cronjob استفاده کنید. tcpdump گزینه ای برای خروج پس از یک زمان معین ندارد. می توانید از دستور timeout برای توقف tcpdump بعد از مدتی استفاده کنید. به عنوان مثال، برای خروج پس از 5 دقیقه، از دستور زیر استفاده کنید:

sudo timeout 300 tcpdump -n -w data.pcap

نمایش دیدگاه ها (0 دیدگاه)

دیدگاه خود را ثبت کنید:

انتخاب تصویر ویرایش حذف
توجه! حداکثر حجم مجاز برای تصویر 500 کیلوبایت می باشد.


دسته بندی مطالب خوش آموز