آموزش نصب دستور tcpdump در لینوکس و نحوه استفاده از آن
دستور tcpdump در لینوکس، قدرتمندترین و پرکاربردترین ابزار لینوکسی است که برای بررسی و تحلیل ترافیک شبکه و عیب یابی مشکلات مربوط به اتصالات شبکه ای استفاده می شود.
ابزار tcpdump گزینه های زیادی دارد که باعث ارتقا کارایی و دامنه استفاده آن می شود. یکی از قدرتمندترین ویژگی های آن، قابلیت استفاده از فیلترهای مختلف برای تحلیل بسته ها و ذخیره داده ها در یک فایل خروجی است.
کاربردهای دستور tcpdump در لینوکس
- نمایش رابط های شبکه در دسترس
- ضبط و نمایش ترافیک شبکه در فرمت های مختلف
- فیلتر کردن ترافیک بر اساس پارامترهای مختلف
- ضبط تعداد محدودی از بسته ها
- بررسی ترافیک شبکه بین دو میزبان خاص
- ذخیره کردن پکت ها در فایل خروجی
- خطایابی و دیباگ شبکه
- …
اگر به دنبال یک سرور لینوکس هستید که به طور کامل از قدرت و کارایی ابزار tcpdump برای تحلیل و مانیتور ترافیک شبکه سرور بهره ببرید، می توانید از صفحه خرید سرور مجازی لینوکس دیدن کنید و پلن ایده آل برای خود را سفارش دهید.
پیش نیازهای استفاده از ابزار tcpdump
- سیستم یا سرور لینوکس
- دسترسی به ترمینال
- دسترسی به حساب کاربری sudo
- اتصال اینترنتی پایدار یا دسترسی به شبکه lan
- نصب بودن دستور tcpdump
این دستور بر عکس دستورات اصلی لینوکس، در بسیاری از توزیع های لینوکس به طور پیش فرض نصب نیست و باید نسبت به نصب آن اقدام کنید.
نصب tcpdump در توزیع های مختلف لینوکس
دستور نصب tcpdump در توزیع های مبتنی بر دبیان مثل اوبونتو
sudo apt install tcpdump
دستور نصب tcpdump در توزیع های مبتنی بر RedHat مثل CentOS و فدورا
sudo yum install tcpdump
یا
sudo dnf install tcpdump
دستور نصب tcpdump در توزیع آرچ لینوکس
sudo pacman -S tcpdump
دستور نصب tcpdump در توزیع OpenSUSE
sudo zypper install tcpdump
سینتکس دستور tcpdump در لینوکس
سینتکس پایه دستور tcpdump به صورت زیر است:
tcpdump [options] [filters]
options این امکان را به شما می دهند که رفتار دستور tcpdump را کنترل کنید.
filters هم برای اعمال یک سری فیلترهای خاص در خروجی tcpdump استفاده می شود.
آپشن های دستور tcpdump
آپشن | کاربرد |
A- | نمایش پکت ها با فرمت ASCII |
c- | تعیین تعداد پکت ها |
D- | نمایش لیست رابط های شبکه در دسترس |
i- | تعیین رابط شبکه موردنظر برای مانیتور ترافیک |
n- | غیرفعال کردن تبدیل آدرس آی پی به اسم دامنه یا شماره پورت به اسم پورت |
w- | ذخیره خروجی tcpdump در یک فایل با فرمت pcap. |
r- | خواندن فایل خروجی tcpdump |
مثال های کاربردی برای دستور tcpdump در لینوکس
این مثال ها به صورت مبتدی تا پیشرفته مرتب شده اند و با بررسی و امتحان کردن آنها می توانید نحوه کار کردن با این دستور را به طور کامل یاد بگیرید:
مانیتور پکت های مربوط به رابط شبکه فعلی
در ساده ترین شکل ممکن، اگر دستور tcpdump را بدون آپشن اجرا کنید، پکت های مربوط به رابطی که فعلاً با آن به اینترنت وصل هستید را نشان می دهد.
sudo tcpdump
فرمت خروجی این دستور به صورت زیر است:
<timestamp> <interface>: <source IP>.<source port> > <destination IP>.<destination port>: <protocol> <additional info>
timestamp : زمان دقیق ارسال یا دریافت بسته
interface : اسم رابط شبکه
source IP و destination IP : آدرس آی پی مبدا و مقصد بسته
source port و destination port : شماره پورت مبدا و مقصد بسته
protocol : پروتکل استفاده شده در بسته مثل TCP و UDP
additional info : اطلاعات بیشتر مثل فلگ ها یا وضعیت بسته
یک نمونه از خروجی دستور tcpdump
ضبط پکت های مربوط به یک رابط شبکه خاص
برای اینکه پکت های ارسالی/دریافتی مربوط به یک اینترفیس خاص را مانیتور کنید، کافیست از آپشن i استفاده کنید و اسم اینترفیس را هم به دستور اضافه کنید:
sudo tcpdump -i wlo1
اگر می خواهید لیست اینترفیس ها را بررسی کنید، می توانید از همین دستور tcpdump کمک بگیرید:
sudo tcpdump -D
حالا این شما هستید که باید اینترفیس موردنظر را انتخاب کنید و در دستور لحاظ کنید.
البته با دستور زیر می توانید پکت های مربوط به تمام رابط ها را ببینید:
sudo tcpdump -i any
نمایش تعداد خاصی از پکت ها
دستور tcpdump به طور پیش فرض تمام بسته های مربوط به رابط موردنظر را ضبط می کند و تا زمانی که با کلید ترکیبی Ctrl + C آن را متوقف نکرده اید، بدون هیچ محدودیتی به کار خود ادامه می دهد.
اگر نیاز به این دارید که برای تعداد پکت ها یک محدودیت لحاظ کنید، می توانید از آپشن c استفاده کنید.
sudo tcpdump -i eth0 -c 50
این دستور، فقط ۵۰ پکت اول رابط eth0 را نمایش می دهد و سپس متوقف می شود.
جلوگیری از DNS lookup در خروجی tcpdump
در حال پیش فرض، tcpdump سعی می کند پروسه DNS resolution را روی آدرس های آی پی و شماره پورت ها انجام دهد و به جای نمایش آدرس های عددی، از اسم آنها استفاده می کند.
مثلاً به جای آدرس 172.112.12.16، example.com را نشان می دهد یا به جای ۸۰، http را نشان می دهد.
اگر به دلایلی مثل افزایش سرعت و دقت پروسه تحلیل ترافیک می خواهید این ویژگی را نادیده بگیرید، می توانید از آپشن n استفاده کنید.
sudo tcpdump -n
نمایش خروجی با فرمت ASCII
اگر می خواهید محتوای هر بسته را به صورت خواناتر ببینید تا از این اطلاعات برای تحلیل بهتر و دقیق تر ترافیک شبکه استفاده کنید، می توانید از آپشن A استفاده کنید:
sudo tcpdump -A -i eth0
در این حالت، با چنین خروجی مواجه خواهید شد:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:31:31.347508 IP 192.168.0.2.ssh > 192.168.0.1.nokia-ann-ch1: Flags [P.], seq 3329372346:3329372542, ack 4193416789, win 17688, length 196
M.r0...vUP.E.X.......~.%..>N..oFk.........KQ..)Eq.d.,....r^l......m\[email protected]_..J....i.*.....2f.mQH...Q.c...6....9.v.gb........;..4.).UiCY]..9..x.)..Z.XF....'|..E......M..u.5.......ul
09:31:31.347760 IP 192.168.0.1.nokia-ann-ch1 > 192.168.0.2.ssh: Flags [.], ack 196, win 64351, length 0
M....vU.r1~P.._..........
^C09:31:31.349560 IP 192.168.0.2.46393 > b.resolvers.Level3.net.domain: 11148+ PTR? 1.0.168.192.in-addr.arpa. (42)
E..F..@[email protected]+............1.0.168.192.in-addr.arpa.....
3 packets captured
11 packets received by filter
0 packets dropped by kernel
اگر خط به خط بررسی کنید:
listening on eth0 : دستور tcpdump به اینترفیس eth0 گوش می دهد.
link-type EN10MB (Ethernet) : نوع لینک اترنت است.
capture size 65535 bytes : کل سایز ضبط شده از بسته ها، 65535 است.
هر خطی که با تایم استمپ شروع می شود، اطلاعات مربوط به بسته ضبط شده را نشان می دهد و با توجه به این که ۳ پکت ضبط شده است (3 packets captured)، سه خط داریم که با تایم استمپ شروع شده است و اطلاعات خاص خود را دارند.
اطلاعاتی مثل مبدا و مقصد پکت (198.168.0.2ssh > 192.168.0.1.nokia-ann-ch1) و فلگ ها که با بررسی دقیق تر می توانید به اطلاعات مفیدتری برسید.
اگر می خواهید اطلاعات هر بسته را در فرمت HEX و ASCII ببینید، می توانید از آپشن XX استفاده کنید:
tcpdump -XX -i eth0
فیلتر کردن خروجی tcpdump
در حالت پیش فرض، دستور tcpdump هیچ فیلتری را برای اطلاعات خروجی در نظر نمی گیرد و حجم زیادی از اطلاعات را در خروجی قرار می دهد که شاید آنالیز این اطلاعات به صورت یکجا چندان جالب نباشد.
با استفاده از قابلیت فیلترسازی tcpdump می توانید هر چیزی که نیاز دارید را در خروجی ببینید.
فیلتر با نوع پروتکل
برای این کار کافیست اسم پروتکل موردنظر خود را به عنوان فیلتر یا filters به دستور tcpdump اضافه کنید:
sudo tcpdump -n tcp
sudo tcpdump -n udp
sudo tcpdump -n icmp
sudo tcpdump -n arp
sudo tcpdump -n ip
sudo tcpdump -n ipv6
اگر می خواهید به جای اسم پروتکل، شماره پروتکل را در دستور tcpdump لحاظ کنید، کافیست از آپشن proto استفاده کنید:
sudo tcpdump -n proto 17
فیلتر با هاست
برای ضبط پکت های مربوط به یک هاست خاص، می توانید آدرس آی پی آن را به صورت زیر به دستور tcpdump اضافه کنید:
sudo tcpdump -n host 192.168.1.185
این دستور به طور خاص به دنبال پکت هایی است که آدرس مبدا یا مقصد آن، 192.168.1.185 است.
فیلتر با پورت
اگر می خواهید پکت های ارسالی/دریافتی از پورت موردنظر را بررسی کنید، می توانید فیلتر را بر اساس port اعمال کنید:
sudo tcpdump -n port 22
یا
sudo tcpdump -n port SSH
اگر رنج خاصی از پورت ها را در نظر دارید، می توانید دستور tcpdump را به صورت زیر اجرا کنید:
sudo tcpdump -n portrange 110-150
فیلتر با آدرس مبدا و مقصد
برای اینکه فیلترینگ را بر اساس آدرس آی پی یا پورت مبدا یا مقصد انجام دهید، می توانید از پارامترهای src و dst استفاده کنید:
sudo tcpdump -n src host 192.168.1.185
sudo tcpdump -n dst port 80
استفاده ترکیبی از فیلترها
برای این کار می توانید از عملگرهای(||) and (&&) or و (!) not استفاده کنید. برای مثال، اگر می خواهید ترافیک مربوط به هاست مبدا 192.168.1.185 با پروتکل tcp و پورت 80 را در خروجی tcpdump ببینید، می توانید از دستور زیر استفاده کنید:
sudo tcpdump -n src host 192.168.1.185 and tcp port 80
یا برای مانیتور تمام پکت های مربوط به مبدا 192.168.1.185 به جز پکت های مربوط به پورت ۲۲ را ببینید، می توانید از دستور زیر استفاده کنید:
sudo tcpdump -n src host 192.168.1.185 and not dst port 22
اگر در مورد نحوه استفاده از or هم نیاز به مثال دارید، مثلاً اگر می خواهید پکت های مربوط به پورت مقصد ۴۴۳ هر دو پروتکل tcp یا udp را در خروجی ببینید، می توانید دستور tcpdump را به صورت زیر اجرا کنید:
sudo tcpdump -n dst port 443 and (tcp or udp)
این شما هستید که باید بر اساس نیاز خود، از این عملگرها به صورت ترکیبی استفاده کنید تا به خروجی ایده آل خود برسید.
ذخیره خروجی tcpdump در یک فایل
یکی از مفیدترین ویژگی های tcpdump این است که می توانید بسته های خروجی را در یک فایل ذخیره کنید تا بعداً از آنها برای انجام تحلیل های متنوع کمک بگیرید.
برای این کار باید از آپشن w استفاده کنید:
sudo tcpdump -n -w data.pcap
این دستور در مسیر فعلی ترمینال یک فایل به اسم data.pcap ایجاد می کند (data اختیاری است ولی هر اسمی که می گذارید باید با پسوند pcap. باشد) ولی خروجی آن را به شما نشان نمی دهد.
برای اینکه محتویات این فایل را بخوانید، باید از آپشن r استفاده کنید:
sudo tcpdump -r data.pcap
بله به این ترتیب، یاد گرفتید که چگونه می توانید از دستور tcpdump استفاده کنید و از آپشن های آن برای تغییر رفتار tcpdump استفاده کنید. نوبت شماست که از رفتار این دستور را متناسب با نیاز خود تعریف کنید.
سخن آخر
دستور tcpdump در لینوکس برای ضبط پکت های مربوط به رابط شبکه موردنظر استفاده می شود که با استفاده از آپشن های آن هم می توانید خروجی را به شکل دلخواه فیلتر کنید.