استفاده از tcpdump در لینوکس
tcpdump یک ابزار تحت کامند، بسیار قدرتمند و قابل انعطاف است و همچنین در عیب یابی مسائل و مشکلات شبکه به ما کمک می کند. در این مقاله ، برخی از رایج ترین فیچر ها ، ویژگی های و استفاده از tcpdump در لینوکس را بررسی خواهیم کرد.
در مجموعه ی پر قدرت وان سرور و در بخش تیم مدیران شبکه، می خواهیم تجربیات خودمان را با شما به اشتراک بگذرایم. ما بسیار در بحث مشکلات مربوط به اتصالات ( connectivity ) برای عیب یابی دچار چالش شده ایم! در این موقعیت ها، tcpdump یک متحد و دوست بزرگ است.
Tcpdump یک ابزار خط فرمان است که به ما امکان می دهد ترافیک شبکه را از طریق سیستم خود ضبط و تجزیه و تحلیل کنیم. همچنین این ابزار اغلب برای کمک به عیب یابی مشکلات شبکه و همچنین یک ابزار امنیتی نیز استفاده می شود.
یک ابزار قدرتمند و همه کاره است که گزینه ها و فیلترهای زیادی را شامل می شود، tcpdump در موارد مختلفی قابل استفاده است. از آنجا که tcpdump یک ابزار خط فرمان است، برای جمع آوری داده هایی که بعدا قابل تجزیه و تحلیل هستند،کاربرد دارد؛ همچنین این ابزار قالیت این را دارد که در سرورهای راه دور ( ریموت سیستم ها یا ریموت سرور ها ) یا دستگاه هایی که GUI برای آنها در دسترس نیست ، اجرا شود. همچنین می تواند در پس زمینه مثلا به عنوان یکی از ابزار هایی مانند کرون جاب ( cron job ) اجرا شود.
آموزش نصب Tcpdump در لینوکس
Tcpdump با چندین توزیع لینوکس همراه است، بنابراین احتمالاً ما آن را از قبل نصب داریم. با دستور زیر بررسی می کنیم که tcpdump روی سیستم ما نصب شده است یا خیر:
which tcpdump
/usr/sbin/tcpdump
اگر tcpdump نصب نشده بود، ما می توانیم با توجه به نسخه لینوکس مورد نظرمان آن را نصب کنیم. برای مثال، ما در CentOS و یا لینوکس Red Hat ما از دستور زیر استفاده می کنیم:
sudo dnf install -y tcpdump
Tcpdump به libpcap نیاز دارد، که یک کتابخانه ( لایبراری ) برای ضبط بسته های شبکه است. اگر نصب نشود ، به طور خودکار به عنوان یک دپندنسی ( وابستگی ) اضافه می شود.
خب، حالا وقت ضبط پکت ها است.
گرفتن پکت ها با tcpdump
برای کپچر کردن ( گرفتن ) پکت ها برای عیب یابی یا تجزیه و تحلیل، tcpdump به پرمیژن ( سطح دسترسی ) های بالاتری نیاز دارد ، بنابراین در مثالهای زیر بیشتر دستورات با sudo پیشوند دارند.
برای شروع، از دستور tcpdump –list-interfaces ( یا به صورت خلاصه -D ) برای مشاهده لیست اینترفیس های موجود شبکه برای عملیات کپچرینگ ( گرفتن / ذخیره سازی ) استفاده می کنیم:
sudo tcpdump -D
1.eth0
2.virbr0
3.eth1
4.any (Pseudo-device that captures on all interfaces)
5.lo [Loopback]
در مثال بالا، می توانیم لیست تمامی اینترفیس های موجود در سیستم ما را مشاهده کنیم. اینترفیس ویژه ( any ) امکان ضبط و کپچرینگ در هر اینرفیس فعال را فراهم می کند.
خب، ما از این برای شروع کپچر کردن برخی از پکت ها ( بسته ها ) استفاده می کنیم. با اجرای این دستور همه پکت ها را در هر اینترفیس یا رابطی کپچر می کنیم:
sudo tcpdump --interface any
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:56:18.293641 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3770820720:3770820916, ack 3503648727, win 309, options [nop,nop,TS val 76577898 ecr 510770929], length 196
09:56:18.293794 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 391, options [nop,nop,TS val 510771017 ecr 76577898], length 0
09:56:18.295058 IP rhel75.59883 > gateway.domain: 2486+ PTR? 1.64.168.192.in-addr.arpa. (43)
09:56:18.310225 IP gateway.domain > rhel75.59883: 2486 NXDomain* 0/1/0 (102)
09:56:18.312482 IP rhel75.49685 > gateway.domain: 34242+ PTR? 28.64.168.192.in-addr.arpa. (44)
09:56:18.322425 IP gateway.domain > rhel75.49685: 34242 NXDomain* 0/1/0 (103)
09:56:18.323164 IP rhel75.56631 > gateway.domain: 29904+ PTR? 1.122.168.192.in-addr.arpa. (44)
09:56:18.323342 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 196:584, ack 1, win 309, options [nop,nop,TS val 76577928 ecr 510771017], length 388
09:56:18.323563 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 584, win 411, options [nop,nop,TS val 510771047 ecr 76577928], length 0
09:56:18.335569 IP gateway.domain > rhel75.56631: 29904 NXDomain* 0/1/0 (103)
09:56:18.336429 IP rhel75.44007 > gateway.domain: 61677+ PTR? 98.122.168.192.in-addr.arpa. (45)
09:56:18.336655 IP gateway.domain > rhel75.44007: 61677* 1/0/0 PTR rhel75. (65)
09:56:18.337177 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 584:1644, ack 1, win 309, options [nop,nop,TS val 76577942 ecr 510771047], length 1060
---- SKIPPING LONG OUTPUT -----
09:56:19.342939 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 1752016, win 1444, options [nop,nop,TS val 510772067 ecr 76578948], length 0
^C
9003 packets captured
9010 packets received by filter
7 packets dropped by kernel
$
Tcpdump تا زمانی که پیامی مبنی بر وقفه دریافت نکند ، همچنان به کپچرینگ پکت ها ادامه می دهد. با فشار دادن Ctrl + C می توانیم کپچرینگ را قطع کنیم. همانطور که در این مثال مشاهده می کنید، tcpdump بیش از 9000 پکت را ضبط کرد. در این حالت، از آنجا که ما با استفاده از ssh به این سرور متصل هستیم ، tcpdump همه این بسته ها را هم ضبط کرد. برای محدود کردن تعداد پکت های گرفته شده و متوقف کردن tcpdump ، از گزینه -c (برای شمارش) استفاده می کنیم:
sudo tcpdump -i any -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
11:21:30.242740 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3772575680:3772575876, ack 3503651743, win 309, options [nop,nop,TS val 81689848 ecr 515883153], length 196
11:21:30.242906 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 1443, options [nop,nop,TS val 515883235 ecr 81689848], length 0
11:21:30.244442 IP rhel75.43634 > gateway.domain: 57680+ PTR? 1.64.168.192.in-addr.arpa. (43)
11:21:30.244829 IP gateway.domain > rhel75.43634: 57680 NXDomain 0/0/0 (43)
11:21:30.247048 IP rhel75.33696 > gateway.domain: 37429+ PTR? 28.64.168.192.in-addr.arpa. (44)
5 packets captured
12 packets received by filter
0 packets dropped by kernel
$
در این حالت ، tcpdump پس از گرفتن پنج پکت، کپچرینگ خودکار را متوقف کرد. این حالت در سناریوهای مختلف مفید است – به عنوان مثال ، اگر در عیب یابی اتصال و گرفتن چند پکت اولیه کافی است. این حالت حتی وقتی فیلترها را برای گرفتن پکت های خاص اعمال می کنیم (در زیر نشان داده شده است) بسیار مفیدتر است.
به طور پیش فرض ، tcpdump آدرس های IP و پورت ها را به نام تبدیل یا ریزالو ( resolve ) می کند، همانطور که در مثال قبلی نشان داده شد. هنگام عیب یابی مشکلات شبکه، اغلب استفاده از آدرس های IP و شماره پورت آسان تر است. با استفاده از گزینه -n رزولیشن نام ، و درپورت با -nn رزولیشن نام را غیرفعال می کنیم:
sudo tcpdump -i any -c5 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
23:56:24.292206 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 166198580:166198776, ack 2414541257, win 309, options [nop,nop,TS val 615664 ecr 540031155], length 196
23:56:24.292357 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 196, win 1377, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292570 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 372
23:56:24.292655 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 568, win 1400, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292752 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 568:908, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 340
5 packets captured
6 packets received by filter
0 packets dropped by kernel
همانطور که در بالا نشان داده شد، خروجی کپچر اکنون آدرس های IP و شماره پورت را نشان می دهد. این همچنین از صدور جستجوی DNS توسط tcpdump جلوگیری می کند که به ما کمک می کند تا در هنگام عیب یابی مشکلات شبکه ، ترافیک شبکه کاهش یابد.
خب، اکنون که قادر به ضبط بسته های شبکه هستیم، بیایید معنی این خروجی را بررسی کنیم.
تحلیل خروجی
Tcpdump قادر به ضبط و رمزگشایی پروتکل های مختلفی است، مانند TCP ، UDP ، ICMP و بسیاری از موارد دیگری است.به دلیل زیاد بودن حجم مطالب نمی توان همه موارد را بررسی کرد، برای کمک به شروع کار، با هم بسته TCP را بررسی می کنیم. یک بسته معمولی TCP ،کپچر شده توسط tcpdump به شکل زیر است:
08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372
فیلد ها ممکن است بسته به نوع بسته ارسال شده، متفاوت باشد ، اما این قالب کلی است.
فیلد اول ، 08: 41: 13.729687 ، نشان دهنده زمان بسته دریافت شده طبق ساعت محلی است.
بعدی، ip است. به پروتکل لایه نتورک یا شبکه اشاره می کند. که در این مثال IPv4 یا ip ورژن 4 است.
قسمت بعدی ، 192.168.64.28.22 ، آدرس IP منبع و پورت است. به دنبال آن آدرس IP مقصد و پورت ارائه می شود که با 192.168.64.1.41916 نشان داده شده.
پس از مبدا و مقصد ، می توانیم فلگ های Flags [P.] را پیدا کنیم. مقادیر معمول برای این زمینه شامل موارد زیر است:
این قسمت همچنین می تواند ترکیبی از این مقادیر، مانند [S.] برای یک بسته SYN-ACK باشد.
شماره بعدی توالی داده های موجود در بسته است. برای اولین بسته ضبط شده، این یک عدد مطلق است. بسته های بعدی برای سهولت در پیگیری از تعداد نسبی استفاده می کنند. در این مثال ، توالی SEQ 196: 568 است ، به این معنی که این بسته حاوی بایت های 196 تا 568 است.
در ادامه ، Ack Number: ack 1 دنبال می شود. در این حالت ، 1 است زیرا این طرف ارسال داده است. برای طرف دریافت کننده داده ، این قسمت بایت مورد انتظار بعدی (داده) را در این جریان نشان می دهد. به عنوان مثال ، شماره Ack برای بسته بعدی در این جریان 568 خواهد بود.
قسمت بعدی ویندوز سایز، win 309 است که نشان دهنده تعداد بایت موجود در بافر دریافت کننده است و به دنبال آن گزینه های TCP مانند MSS (حداکثر اندازه قطعه) یا مقیاس Window وجود دارد.
سرانجام ، ما طول بسته ، length 372 را داریم ، که نشان دهنده طول ، به بایت است. طول تفاوت بین بایت های آخر و اول در شماره توالی است.
خب، حالا وقت آموختن این است که چگونه بسته ها را فیلتر کنیم تا نتایج را محدود کنیم و عیب یابی مسائل خاص را آسان تر کنیم.
فیلتر کردن پکت ها
همانطور که در بالا ذکر شد ، tcpdump می تواند بسته های زیادی را ضبط ( کپچر ) کند، برخی از آنها حتی مربوط به مسئله ای نیستند که ما عیب یابی می کنیم. برای مثال اگر مشکل اتصال با یک وب سرور را که به ترافیک SSH علاقه مند نیستیم عیب یابی می کنیم، بنابراین حذف بسته های SSH از خروجی کار بر روی مسئله واقعی را آسان می کند.
یکی از قدرتمندترین ویژگی های tcpdump توانایی فیلتر کردن پکت های گرفته شده با استفاده از پارامترهای مختلف مانند آدرس IP مبدا و مقصد ، پورت ها ، پروتکل ها و غیره است. با هم برخی از رایج ترین آنها را بررسی می کنیم.
پروتکل
برای فیلتر کردن بسته ها بر اساس پروتکل، تعیین پروتکل در خط فرمان. به عنوان مثال، بسته های ICMP را فقط با استفاده از این دستور ضبط کنید:
sudo tcpdump -i any -c5 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
در ترمینال دیگری، سعی می کنیم دستگاه دیگری را پینگ کنیم:
ping opensource.com
PING opensource.com (54.204.39.132) 56(84) bytes of data.
64 bytes from ec2-54-204-39-132.compute-1.amazonaws.com (54.204.39.132): icmp_seq=1 ttl=47 time=39.6 ms
دوباره به ضبط tcpdump توجه کنید که tcpdump فقط بسته های مربوط به ICMP را ضبط و نمایش می دهد. در این حالت ، tcpdump بسته های نیم رزولیشن را که هنگام ریزالو کردن نام opensource.com تولید شده اند نمایش نمی دهد:
09:34:20.136766 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 1, length 64
09:34:20.176402 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 1, length 64
09:34:21.140230 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 2, length 64
09:34:21.180020 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 2, length 64
09:34:22.141777 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 3, length 64
5 packets captured
5 packets received by filter
0 packets dropped by kernel
میزبان ( هاست )
با استفاده از فیلتر host
فقط بسته های مربوط به یک میزبان خاص را محدود می کنیم:
sudo tcpdump -i any -c5 -nn host 54.204.39.132
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:54:20.042023 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [S], seq 1375157070, win 29200, options [mss 1460,sackOK,TS val 122350391 ecr 0,nop,wscale 7], length 0
09:54:20.088127 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [S.], seq 1935542841, ack 1375157071, win 28960, options [mss 1460,sackOK,TS val 522713542 ecr 122350391,nop,wscale 9], length 0
09:54:20.088204 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122350437 ecr 522713542], length 0
09:54:20.088734 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122350438 ecr 522713542], length 112: HTTP: GET / HTTP/1.1
09:54:20.129733 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [.], ack 113, win 57, options [nop,nop,TS val 522713552 ecr 122350438], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel
در این مثال ، tcpdump فقط بسته ها را از 54.204.39.132 و به 54.204.39.132 میزبان ضبط و نمایش می دهد.
پورت
برای فیلتر کردن بسته ها بر اساس سرویس یا پورت مورد نظر، از فیلتر port استفاده می کنیم. به عنوان مثال ، بسته های مربوط به وب سرور (HTTP) را با استفاده از این دستور ضبط می کنیم:
sudo tcpdump -i any -c5 -nn port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:58:28.790548 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [S], seq 1745665159, win 29200, options [mss 1460,sackOK,TS val 122599140 ecr 0,nop,wscale 7], length 0
09:58:28.834026 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [S.], seq 4063583040, ack 1745665160, win 28960, options [mss 1460,sackOK,TS val 522775728 ecr 122599140,nop,wscale 9], length 0
09:58:28.834093 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122599183 ecr 522775728], length 0
09:58:28.834588 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122599184 ecr 522775728], length 112: HTTP: GET / HTTP/1.1
09:58:28.878445 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [.], ack 113, win 57, options [nop,nop,TS val 522775739 ecr 122599184], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel
IP منبع / نام هاست
همچنین می توانیم بسته ها را براساس آدرس IP منبع یا مقصد یا نام میزبان فیلتر کنیم به عنوان مثال ، برای گرفتن بسته ها از میزبان 192.168.122.98:
sudo tcpdump -i any -c5 -nn src 192.168.122.98
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:02:15.220824 IP 192.168.122.98.39436 > 192.168.122.1.53: 59332+ A? opensource.com. (32)
10:02:15.220862 IP 192.168.122.98.39436 > 192.168.122.1.53: 20749+ AAAA? opensource.com. (32)
10:02:15.364062 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [S], seq 1108640533, win 29200, options [mss 1460,sackOK,TS val 122825713 ecr 0,nop,wscale 7], length 0
10:02:15.409229 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [.], ack 669337581, win 229, options [nop,nop,TS val 122825758 ecr 522832372], length 0
10:02:15.409667 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 122825759 ecr 522832372], length 112: HTTP: GET / HTTP/1.1
5 packets captured
5 packets received by filter
0 packets dropped by kernel
توجه داشته باشید که tcpdumps بسته های گرفته شده با آدرس IP منبع 192.168.122.98 را برای چندین سرویس مانند وضوح نام (پورت 53) و HTTP (پورت 80) گرفته است. بسته های پاسخ نمایش داده نمی شوند زیرا IP منبع آنها متفاوت است.
برعکس ، ما می توانید از فیلتر dst برای فیلتر کردن بر اساس مقصد IP / نام میزبان (هاست) استفاده کنیم:
sudo tcpdump -i any -c5 -nn dst 192.168.122.98
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:05:03.572931 IP 192.168.122.1.53 > 192.168.122.98.47049: 2248 1/0/0 A 54.204.39.132 (48)
10:05:03.572944 IP 192.168.122.1.53 > 192.168.122.98.47049: 33770 0/0/0 (32)
10:05:03.621833 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [S.], seq 3474204576, ack 3256851264, win 28960, options [mss 1460,sackOK,TS val 522874425 ecr 122993922,nop,wscale 9], length 0
10:05:03.667767 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [.], ack 113, win 57, options [nop,nop,TS val 522874436 ecr 122993972], length 0
10:05:03.672221 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 522874437 ecr 122993972], length 642: HTTP: HTTP/1.1 302 Found
5 packets captured
5 packets received by filter
0 packets dropped by kernel
مخلوط کردن دستورات
همچنین می توان فیلترها را با استفاده از عملگرهای منطقی و یا برای ایجاد عبارات پیچیده تر ترکیب کرد. به عنوان مثال ، برای فیلتر کردن بسته ها از آدرس IP منبع 192.168.122.98 و سرویس HTTP فقط ، از این دستور استفاده می کنیم:
sudo tcpdump -i any -c5 -nn src 192.168.122.98 and port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:08:00.472696 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [S], seq 2712685325, win 29200, options [mss 1460,sackOK,TS val 123170822 ecr 0,nop,wscale 7], length 0
10:08:00.516118 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 268723504, win 229, options [nop,nop,TS val 123170865 ecr 522918648], length 0
10:08:00.516583 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 123170866 ecr 522918648], length 112: HTTP: GET / HTTP/1.1
10:08:00.567044 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 123170916 ecr 522918661], length 0
10:08:00.788153 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [F.], seq 112, ack 643, win 239, options [nop,nop,TS val 123171137 ecr 522918661], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel
با گروه بندی فیلتر با پرانتز می توان عبارات پیچیده تری ایجاد کرد. در این حالت، کل عبارت فیلتر را با علامت های نقل قول قرار می دهیم تا از اشتباه گرفتن پوسته با عبارات پوسته جلوگیری شود:
sudo tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:10:37.602214 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [S], seq 871108679, win 29200, options [mss 1460,sackOK,TS val 123327951 ecr 0,nop,wscale 7], length 0
10:10:37.650651 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [S.], seq 854753193, ack 871108680, win 28960, options [mss 1460,sackOK,TS val 522957932 ecr 123327951,nop,wscale 9], length 0
10:10:37.650708 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 0
10:10:37.651097 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 112: HTTP: GET / HTTP/1.1
10:10:37.692900 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [.], ack 113, win 57, options [nop,nop,TS val 522957942 ecr 123328000], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel
در این مثال، ما بسته ها را فقط برای سرویس HTTP (پورت 80) و آدرس های IP منبع 192.168.122.98 یا 54.204.39.132 فیلتر می کنیم. این یک روش سریع برای بررسی هر دو طرف جریان یکسان است.
بررسی محتوای بسته
در مثال های قبلی ، ما فقط هدر بسته ها را برای یافتن اطلاعاتی مانند منبع ، مقصد ، پورت ها و غیره بررسی می کردیم. گاهی اوقات این تنها چیزی است که ما برای عیب یابی مشکلات اتصال شبکه نیاز داریم. با این حال ، گاهی اوقات ، ما باید محتوای بسته را بررسی کنیم تا اطمینان حاصل کنیم که پیامی که ارسال می کنیم حاوی آنچه که نیاز داریم است یا پاسخ مورد انتظار را دریافت کرده ایم. برای دیدن محتوای بسته ، tcpdump دو فلگ اضافی دارد : -X برای چاپ محتوا در hex ، و ASCII یا -A برای چاپ محتوا در ASCII.
به عنوان مثال ، محتوای HTTP یک درخواست وب مانند این را بررسی می کنیم:
sudo tcpdump -i any -c10 -nn -A port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
13:02:14.871803 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [S], seq 2546602048, win 29200, options [mss 1460,sackOK,TS val 133625221 ecr 0,nop,wscale 7], length 0
E..<..@.@.....zb6.'....P...@......r............
............................
13:02:14.910734 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [S.], seq 1877348646, ack 2546602049, win 28960, options [mss 1460,sackOK,TS val 525532247 ecr 133625221,nop,wscale 9], length 0
E..<..@./..a6.'...zb.P..o..&...A..q a..........
.R.W....... ................
13:02:14.910832 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 133625260 ecr 525532247], length 0
E..4..@.@.....zb6.'....P...Ao..'...........
.....R.W................
13:02:14.911808 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 133625261 ecr 525532247], length 112: HTTP: GET / HTTP/1.1
E.....@.@..1..zb6.'....P...Ao..'...........
.....R.WGET / HTTP/1.1
User-Agent: Wget/1.14 (linux-gnu)
Accept: */*
Host: opensource.com
Connection: Keep-Alive
................
13:02:14.951199 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [.], ack 113, win 57, options [nop,nop,TS val 525532257 ecr 133625261], length 0
E..4.F@./.."6.'...zb.P..o..'.......9.2.....
.R.a....................
13:02:14.955030 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 525532258 ecr 133625261], length 642: HTTP: HTTP/1.1 302 Found
E....G@./...6.'...zb.P..o..'.......9.......
.R.b....HTTP/1.1 302 Found
Server: nginx
Date: Sun, 23 Sep 2018 17:02:14 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 207
X-Content-Type-Options: nosniff
Location: https://opensource.com/
Cache-Control: max-age=1209600
Expires: Sun, 07 Oct 2018 17:02:14 GMT
X-Request-ID: v-6baa3acc-bf52-11e8-9195-22000ab8cf2d
X-Varnish: 632951979
Age: 0
Via: 1.1 varnish (Varnish/5.2)
X-Cache: MISS
Connection: keep-alive
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://opensource.com/">here</a>.</p>
</body></html>
................
13:02:14.955083 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 133625304 ecr 525532258], length 0
E..4..@.@.....zb6.'....P....o..............
.....R.b................
13:02:15.195524 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 133625545 ecr 525532258], length 0
E..4..@.@.....zb6.'....P....o..............
.....R.b................
13:02:15.236592 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 525532329 ecr 133625545], length 0
E..4.H@./.. 6.'...zb.P..o..........9.I.....
.R......................
13:02:15.236656 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 133625586 ecr 525532329], length 0
E..4..@.@.....zb6.'....P....o..............
.....R..................
10 packets captured
10 packets received by filter
0 packets dropped by kernel
با توجه به مورد بالا، فرض می کند که تماس ها از HTTP ساده استفاده می کنند برای عیب یابی مشکلات API ها مفید است. برای اتصالات رمزگذاری شده ، این خروجی کاربرد کمتری دارد.
ذخیره کپچر ها در یک فایل
یکی دیگر از ویژگی های مفید ارائه شده توسط tcpdump توانایی ذخیره کپچر در یک فایل است تا بعداً بتوانیم نتایج را تجزیه و تحلیل کنیم. این مورد به ما امکان می دهد برای مثال بسته ها را در حالت دسته ای، در شب ضبط کرده و نتایج را در صبح تأیید کنیم. همچنین هنگامی که بسته های زیادی برای تجزیه و تحلیل وجود دارد از آنجا که ضبط در زمان واقعی می تواند خیلی سریع اتفاق بیفتد ، به ما کمک می کند.
می توان برای ذخیره بسته ها در یک فایل به جای نمایش آنها روی صفحه ، از گزینه -w استفاده کرد:
sudo tcpdump -i any -c10 -nn -w webserver.pcap port 80
[sudo] password for ricardo:
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel
این دستور خروجی را در فایلی به نام webserver.pcap ذخیره می کند. پسوند .pcap مخفف “packet capture” است و قراردادی برای این قالب فایل است.
همانطور که در این مثال نشان داده شده است، هیچ چیز بر روی صفحه نمایش داده نمی شود و ضبط پس از گرفتن 10 بسته، طبق گزینه -c10 به پایان می رسد.
Tcpdump فایلی را با فرمت باینری ایجاد می کند ، بنابراین نمی توان آن را به سادگی با ویرایشگر متن باز کرد. برای خواندن محتویات فایل ، tcpdump را با گزینه -r اجرا می کنیم:
tcpdump -nn -r webserver.pcap
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.679494 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [S], seq 3709732619, win 29200, options [mss 1460,sackOK,TS val 135708029 ecr 0,nop,wscale 7], length 0
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.719005 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 0
13:36:57.719186 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 112: HTTP: GET / HTTP/1.1
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:57.760182 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 135708109 ecr 526052959], length 0
13:36:57.977602 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 135708327 ecr 526052959], length 0
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0
13:36:58.022132 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 135708371 ecr 526053025], length 0
$
از آنجا که دیگر بسته ها را مستقیماً از رابط شبکه ضبط نمی کنیم ، برای خواندن پرونده نیازی به sudo نیست.
همچنین می توان از فیلترهای مورد بحث ما برای فیلتر کردن محتوا از پرونده استفاده کرد، دقیقاً مانند داده های لحظه ای. به عنوان مثال، بسته های موجود در پرونده کپچر را از آدرس IP منبع 54.204.39.132 با اجرای زیر رسیدگی می کنیم:
tcpdump -nn -r webserver.pcap src 54.204.39.132
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0
جمع بندی
این ویژگی های اساسی tcpdump به ما کمک می کند تا با این ابزار قدرتمند و همه کاره شروع به کار کنیم. رابط خط فرمان tcpdump انعطاف پذیری زیادی برای ضبط و تحلیل ترافیک شبکه فراهم می کند. اگر برای درک جریانهای پیچیده تر به یک ابزار گرافیکی نیاز باشد، به Wireshark مراجعه می کنیم. یکی از مزایای Wireshark این است که می تواند فایل های .pcap گرفته شده توسط tcpdump را بخواند. می توانیم از tcpdump برای ضبط بسته ها از راه دور که فاقد رابط کاربری گرافیکی است استفاده کنیم و فایل نتیجه را با Wireshark تجزیه و تحلیل کنیم.
اولین نفر باشید که نظر ارسال میکنید