站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        Linux下抓包命令tcpdump詳解

        tcpdump是一個(gè)命令行實(shí)用程序,可用于捕獲和檢查進(jìn)出系統(tǒng)的網(wǎng)絡(luò)流量。 它是網(wǎng)絡(luò)管理員中用于排除網(wǎng)絡(luò)問(wèn)題和安全測(cè)試的最常用工具。

        盡管名稱如此,使用tcpdump,您也可以捕獲非TCP流量,例如UDP,ARP或ICMP。 捕獲的數(shù)據(jù)包可以寫入文件或標(biāo)準(zhǔn)輸出。 tcpdump命令最強(qiáng)大的功能之一是它能夠使用過(guò)濾器并僅捕獲要分析的數(shù)據(jù)。

        在本文中,我們將介紹如何在Linux中使用tcpdump命令的基礎(chǔ)知識(shí)。

        Linux下抓包命令tcpdump詳解

        安裝tcpdump

        在大多數(shù)Linux發(fā)行版和macOS上默認(rèn)安裝了tcpdump。 要檢查tcpdump命令在您的系統(tǒng)上是否可用:

        [linuxidc@linux:~/www.linuxidc.com]$ tcpdump –version

        輸出應(yīng)如下所示:

        tcpdump version 4.9.2
        libpcap version 1.8.1
        OpenSSL 1.1.1  11 Sep 2018

        Linux下抓包命令tcpdump詳解

        如果您的系統(tǒng)上沒有tcpdump,則上面的命令將顯示“ 沒有那個(gè)文件或目錄”。 您可以使用發(fā)行版的軟件包管理器輕松安裝tcpdump。

        [linuxidc@linux:~/www.linuxidc.com]$ tcpdump –version
        bash: /usr/sbin/tcpdump: 沒有那個(gè)文件或目錄

        Linux下抓包命令tcpdump詳解

        在Ubuntu和Debian上安裝tcpdump

        $sudo apt update && sudo apt install tcpdump

        在CentOS和Fedora上安裝tcpdump

        $sudo yum install tcpdump

        在Arch Linux上安裝tcpdump

        $sudo pacman -S tcpdump

        使用tcpdump捕獲數(shù)據(jù)包

        tcpdump命令的常規(guī)語(yǔ)法如下:

        tcpdump [選項(xiàng)] [過(guò)濾器表達(dá)式]

        • 命令選項(xiàng)使您可以控制命令的行為。
        • 過(guò)濾器表達(dá)式定義將捕獲哪些數(shù)據(jù)包。

        只有root或具有sudo特權(quán)的用戶才能運(yùn)行tcpdump。 如果您嘗試以非特權(quán)用戶身份運(yùn)行該命令,則會(huì)收到一條錯(cuò)誤消息:“您無(wú)權(quán)在該設(shè)備上進(jìn)行捕獲”。

        tcpdump: ens33: You don’t have permission to capture on that device
        (socket: Operation not permitted)

        Linux下抓包命令tcpdump詳解

        最簡(jiǎn)單的用例是不帶任何選項(xiàng)和過(guò)濾器的情況下調(diào)用tcpdump:

        [linuxidc@linux:~/www.linuxidc.com]$ sudo tcpdump

        輸出如下:

        [sudo] linuxidc 的密碼:
        tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
        listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes

        Linux下抓包命令tcpdump詳解

        tcpdump將繼續(xù)捕獲數(shù)據(jù)包并寫入標(biāo)準(zhǔn)輸出,直到接收到中斷信號(hào)為止。 使用Ctrl + C組合鍵發(fā)送中斷信號(hào)并停止命令。

        要獲得更詳細(xì)的輸出,請(qǐng)傳遞-v選項(xiàng),或傳遞-vv以獲得更詳細(xì)的輸出:

        [linuxidc@linux:~/www.linuxidc.com]$ sudo tcpdump -vv

        您可以使用-c選項(xiàng)指定要捕獲的數(shù)據(jù)包數(shù)量。 例如,要僅捕獲5個(gè)數(shù)據(jù)包,請(qǐng)輸入:

        [linuxidc@linux:~/www.linuxidc.com]$ sudo tcpdump -c 5
        tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
        listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
        21:08:14.575216 IP linux.42082 > 180.101.49.12.https: Flags [.], ack 470550152, win 30016, length 0
        21:08:14.577139 IP 180.101.49.12.https > linux.42082: Flags [.], ack 1, win 64240, length 0
        21:08:14.578127 IP linux.37565 > _gateway.domain: 52885+ [1au] PTR? 12.49.101.180.in-addr.arpa. (55)
        21:08:14.583548 IP _gateway.domain > linux.37565: 52885 NXDomain 0/1/1 (114)
        21:08:14.585411 IP linux.37565 > _gateway.domain: 52885+ PTR? 12.49.101.180.in-addr.arpa. (44)
        5 packets captured
        14 packets received by filter
        5 packets dropped by kernel

        Linux下抓包命令tcpdump詳解

        捕獲數(shù)據(jù)包后,tcpdump將停止。

        如果未指定任何接口,則tcpdump使用它找到的第一個(gè)接口并轉(zhuǎn)儲(chǔ)通過(guò)該接口的所有數(shù)據(jù)包。

        使用-D選項(xiàng)可以打印tcpdump可以從中收集數(shù)據(jù)包的所有可用網(wǎng)絡(luò)接口的列表:

        [linuxidc@linux:~/www.linuxidc.com]$ sudo tcpdump -D

        對(duì)于每個(gè)接口,該命令將打印接口名稱,簡(jiǎn)短描述以及關(guān)聯(lián)的索引(數(shù)字):

        輸出:
        1.ens33 [Up, Running]
        2.any (Pseudo-device that captures on all interfaces) [Up, Running]
        3.lo [Up, Running, Loopback]
        4.bluetooth0 (Bluetooth adapter number 0)
        5.nflog (Linux netfilter log (NFLOG) interface)
        6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
        7.usbmon1 (USB bus number 1)
        8.usbmon2 (USB bus number 2)

        Linux下抓包命令tcpdump詳解

        上面的輸出顯示ens3是tcpdump找到的第一個(gè)接口,并且在沒有為該命令提供接口時(shí)使用。 第二個(gè)接口any是一種特殊的設(shè)備,可讓您捕獲所有活動(dòng)的接口。

        要指定要在其上捕獲流量的接口,請(qǐng)使用-i選項(xiàng)調(diào)用命令,后跟接口名稱或關(guān)聯(lián)的索引。 例如,要捕獲來(lái)自所有接口的所有數(shù)據(jù)包,可以指定any接口:

        [linuxidc@linux:~/www.linuxidc.com]$ sudo tcpdump -i any

        Linux下抓包命令tcpdump詳解

        默認(rèn)情況下,tcpdump對(duì)IP地址執(zhí)行反向DNS解析,并將端口號(hào)轉(zhuǎn)換為名稱。 使用-n選項(xiàng)禁用轉(zhuǎn)換:

        [linuxidc@linux:~/www.linuxidc.com]$ sudo tcpdump -n

        跳過(guò)DNS查詢可以避免生成DNS流量并使輸出更具可讀性。建議在調(diào)用tcpdump時(shí)使用此選項(xiàng)。

        與在屏幕上顯示輸出不同,您可以使用重定向操作符>和>>將其重定向到一個(gè)文件:

        [linuxidc@linux:~/www.linuxidc.com]$ sudo tcpdump -n -i any > linuxidc.txt
        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
        ^C3470 packets captured
        3616 packets received by filter
        0 packets dropped by kernel

        您還可以使用tee命令在保存到文件的同時(shí)查看數(shù)據(jù):

        [linuxidc@linux:~/www.linuxidc.com]$  sudo tcpdump -n -l | tee linuxidc.txt

        上面命令中的-l選項(xiàng)告訴tcpdump緩沖輸出行。 不使用此選項(xiàng)時(shí),生成新行時(shí),輸出不會(huì)寫在屏幕上。

        了解tcpdump輸出

        tcpdump在新行上輸出每個(gè)捕獲的數(shù)據(jù)包的信息。 每行包括一個(gè)時(shí)間戳和有關(guān)該數(shù)據(jù)包的信息,具體取決于協(xié)議。

        TCP協(xié)議行的典型格式如下:

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

        讓我們逐個(gè)字段進(jìn)行說(shuō)明,并解釋以下內(nèi)容:

        21:53:20.460144 IP 192.168.182.166.57494 > 35.222.85.5.80: Flags [P.], seq 1:88, ack 1, win 29200,  options [nop,nop,TS val 1067794587 ecr 2600218930], length 87

        • 21:53:20.460144 – 捕獲的數(shù)據(jù)包的時(shí)間戳為本地時(shí)間,并使用以下格式:hours:minutes:seconds.frac,其中frac是自午夜以來(lái)的幾分之一秒。
        • IP – 分組協(xié)議。 在這種情況下,IP表示Internet協(xié)議版本4(IPv4)。
        • 192.168.182.166.57494 – 源IP地址和端口,以點(diǎn)(.)分隔。
        • 35.222.85.5.80 – 目的IP地址和端口,以點(diǎn)號(hào)(.)分隔。

        TCP標(biāo)志字段。 在此示例中,[P.]表示推送確認(rèn)數(shù)據(jù)包,用于確認(rèn)前一個(gè)數(shù)據(jù)包并發(fā)送數(shù)據(jù)。 其他典型標(biāo)志字段值如下:

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

         

        • seq 1:88 – 序列號(hào)在first:last表示法中。 它顯示了數(shù)據(jù)包中包含的數(shù)據(jù)數(shù)量。 除了數(shù)據(jù)流中的第一個(gè)數(shù)據(jù)包(其中這些數(shù)字是絕對(duì)的)以外,所有后續(xù)數(shù)據(jù)包均用作相對(duì)字節(jié)位置。 在此示例中,數(shù)字為1:88,表示此數(shù)據(jù)包包含數(shù)據(jù)流的字節(jié)1至88。 使用-S選項(xiàng)可打印絕對(duì)序列號(hào)。
        • ack 1 – 確認(rèn)號(hào)(acknowledgment number)是此連接另一端所期望的下一個(gè)數(shù)據(jù)的序列號(hào)。
        • win 29200 – 窗口號(hào)是接收緩沖區(qū)中可用字節(jié)的數(shù)目。
        • options [nop,nop,TS val 1067794587 ecr 2600218930] – TCP選項(xiàng)。 使用nop或“ no operation”填充使TCP報(bào)頭為4字節(jié)的倍數(shù)。 TS val是TCP時(shí)間戳,而ecr表示回顯應(yīng)答。 請(qǐng)?jiān)L問(wèn)IANA文檔以獲取有關(guān)TCP選項(xiàng)的更多信息。
        • length 87 – 有效載荷數(shù)據(jù)的長(zhǎng)度

        tcpdump過(guò)濾器

        在不使用過(guò)濾器的情況下調(diào)用tcpdump時(shí),它將捕獲所有流量并產(chǎn)生大量輸出,這使得查找和分析目標(biāo)數(shù)據(jù)包變得非常困難。

        過(guò)濾器是tcpdump命令最強(qiáng)大的功能之一。 因?yàn)樗鼈冊(cè)试S您僅捕獲與表達(dá)式匹配的那些數(shù)據(jù)包。 例如,在對(duì)與Web服務(wù)器有關(guān)的問(wèn)題進(jìn)行故障排除時(shí),可以使用過(guò)濾器僅獲取HTTP通信。

        tcpdump使用Berkeley數(shù)據(jù)包篩選器(BPF)語(yǔ)法使用各種加工參數(shù)(例如協(xié)議,源IP地址和目標(biāo)IP地址以及端口等)過(guò)濾捕獲的數(shù)據(jù)包。

        在本文中,我們將介紹一些最常見的過(guò)濾器。 有關(guān)所有可用過(guò)濾器的列表,請(qǐng)查看pcap-filter聯(lián)機(jī)幫助頁(yè)。

        按協(xié)議過(guò)濾

        要將捕獲限制為特定協(xié)議,請(qǐng)將該協(xié)議指定為過(guò)濾器。 例如,要僅捕獲UDP流量,可以使用:

        $sudo tcpdump -n udp

        定義協(xié)議的另一種方法是使用原型限定符,后跟協(xié)議編號(hào)。 以下命令將過(guò)濾協(xié)議編號(hào)17,并產(chǎn)生與上述相同的結(jié)果:

        $sudo tcpdump -n proto 17

        有關(guān)編號(hào)的更多信息,請(qǐng)檢查IP協(xié)議編號(hào)列表。

        主機(jī)過(guò)濾

        要僅捕獲與特定主機(jī)有關(guān)的數(shù)據(jù)包,請(qǐng)使用主機(jī)限定符:

        $sudo tcpdump -n host 192.168.1.185

        主機(jī)可以是IP地址或名稱。

        您還可以使用網(wǎng)絡(luò)限定符將輸出過(guò)濾到給定的IP范圍。 例如,要僅轉(zhuǎn)儲(chǔ)與10.10.0.0/16相關(guān)的數(shù)據(jù)包,可以使用:

        $sudo tcpdump -n net 10.10

        按端口過(guò)濾

        若要僅將捕獲限制為來(lái)自特定端口或特定端口的數(shù)據(jù)包??請(qǐng)使用端口限定符。 以下命令使用以下命令捕獲與SSH(端口22)服務(wù)相關(guān)的數(shù)據(jù)包:

        $sudo tcpdump -n port 23

        portrange限定符使您能夠捕獲一系列端口中的流量:

        $sudo tcpdump -n portrange 110-150

        按來(lái)源和目的地過(guò)濾

        您還可以使用are src,dst,src和dst以及src或dst限定符基于源或目標(biāo)端口或主機(jī)篩選數(shù)據(jù)包。

        以下命令捕獲來(lái)自IP為192.168.1.185的主機(jī)的傳入數(shù)據(jù)包:

        $sudo tcpdump -n src host 192.168.1.185

        要查找從任何來(lái)源到端口80的流量,請(qǐng)使用:

        $sudo tcpdump -n dst port 80

        復(fù)合過(guò)濾器

        可以使用和(&&) 或者 (||), 而不是(!)運(yùn)算符組合過(guò)濾器。

        例如,要捕獲來(lái)自源IP地址192.168.1.185的所有HTTP通信,可以使用以下命令:

        $sudo tcpdump -n src 192.168.1.185 and tcp port 80

        您還可以使用括號(hào)來(lái)分組和創(chuàng)建更復(fù)雜的過(guò)濾器:

        $sudo tcpdump -n ‘host 192.168.1.185 and (tcp port 80 or tcp port 443)’

        為避免在使用特殊字符時(shí)解析錯(cuò)誤,請(qǐng)將過(guò)濾器括在單引號(hào)內(nèi)。

        這是另一個(gè)示例命令,用于從源IP地址192.168.1.185捕獲除SSH以外的所有流量:

        $sudo tcpdump -n src 192.168.1.185 and not dst port 22

        檢查數(shù)據(jù)包

        默認(rèn)情況下,tcpdump僅捕獲數(shù)據(jù)包頭。 但是,有時(shí)您可能需要檢查數(shù)據(jù)包的內(nèi)容。

        tcpdump允許您以ASCII和十六進(jìn)制格式打印數(shù)據(jù)包的內(nèi)容。

        -A選項(xiàng)告訴tcpdump以ASCII格式輸出每個(gè)數(shù)據(jù)包,以十六進(jìn)制格式-x輸出每個(gè)數(shù)據(jù)包:

        $sudo tcpdump -n -A

        要以十六進(jìn)制和ASCII碼顯示數(shù)據(jù)包的內(nèi)容,請(qǐng)使用-X選項(xiàng):

        $sudo tcpdump -n -X

        讀取和寫入捕獲到文件

        tcpdump的另一個(gè)有用功能是將數(shù)據(jù)包寫入文件。 當(dāng)您捕獲大量數(shù)據(jù)包或要捕獲數(shù)據(jù)包以供以后分析時(shí),這非常方便。

        要開始寫入文件,請(qǐng)使用-w選項(xiàng),后跟輸出捕獲文件:

        $sudo tcpdump -n -w data.pcap

        上面的命令將捕獲的內(nèi)容保存到名為data.pcap的文件中。 您可以根據(jù)需要命名文件,但是使用.pcap擴(kuò)展名(數(shù)據(jù)包捕獲)是一種常見的約定。

        使用-w選項(xiàng)時(shí),輸出不會(huì)顯示在屏幕上。 tcpdump寫入原始數(shù)據(jù)包并創(chuàng)建一個(gè)二進(jìn)制文件,而常規(guī)文本編輯器無(wú)法讀取該文件。

        要檢查文件的內(nèi)容,請(qǐng)使用-r選項(xiàng)調(diào)用tcpdump:

        $sudo tcpdump -r data.pcap

        如果要在后臺(tái)運(yùn)行tcpdump,請(qǐng)?jiān)诿钅┪蔡砑优c號(hào) (&)。

        也可以使用其他數(shù)據(jù)包分析器工具(例如Wireshark)檢查捕獲文件。

        長(zhǎng)時(shí)間捕獲數(shù)據(jù)包時(shí),可以啟用文件輪換。 tcpdump允許您創(chuàng)建的新文件或以指定的時(shí)間間隔或固定大小旋轉(zhuǎn)轉(zhuǎn)儲(chǔ)文件。 以下命令將創(chuàng)建多達(dá)十個(gè)200MB文件,分別名為file.pcap0,file.pcap1,依此類推:在覆蓋舊文件之前。

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

        生成5個(gè)文件后,較舊的文件將被覆蓋。

        請(qǐng)注意,您僅應(yīng)在排除故障期間運(yùn)行tcpdump。

        如果要在特定時(shí)間啟動(dòng)tcpdump,則可以使用cronjob。 tcpdump沒有在指定時(shí)間后退出的選項(xiàng)。 您可以在一段時(shí)間后使用timeout命令停止tcpdump。 例如,要在1分鐘后退出,您可以使用:

        $sudo timeout 60 tcpdump -n -w data.pcap

        總結(jié)

        tcpdump是用于分析和解決網(wǎng)絡(luò)相關(guān)問(wèn)題的命令行工具。

        本文向您介紹了tcpdump用法和語(yǔ)法的基礎(chǔ)。 有關(guān)更深入的文檔,請(qǐng)?jiān)L問(wèn)tcpdump網(wǎng)站。

        如果您有任何疑問(wèn)或反饋,請(qǐng)隨時(shí)發(fā)表評(píng)論。

        更多Linux命令相關(guān)信息見Linux命令大全 專題頁(yè)面 http://www.0106606.com/topicnews.aspx?tid=16

        贊(2)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 国产精品亚洲产品一区二区三区| 亚洲乱码日产精品a级毛片久久| 精品国产成人在线| 国内精品久久久久影院一蜜桃| 免费精品精品国产欧美在线| 亚洲精品私拍国产福利在线| 精品久久8x国产免费观看| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 精品欧美一区二区在线观看 | 国产在线精品观看免费观看| 99re66热这里只有精品| 特级精品毛片免费观看| 久久国产成人亚洲精品影院| 亚洲国产精品嫩草影院| 国产亚洲精品a在线观看app| 国内精品久久久久影院日本| 亚洲欧洲精品无码AV| 欧美日韩精品系列一区二区三区国产一区二区精品| 久久99精品国产麻豆宅宅| 国产精品视频一区二区噜噜 | 亚欧乱色国产精品免费视频| 国产中文在线亚洲精品官网| 国产精品免费久久久久久久久| 99久久精品免费观看国产| 久久精品国产福利国产秒| 99久久免费国产精精品| 国产精品久线在线观看| 国产午夜无码精品免费看| 国产精品视频永久免费播放| 国产成人无码精品一区二区三区| 国产精品日韩AV在线播放| 精品国产一区二区三区色欲 | 国产精品美女久久久久av爽 | 香港aa三级久久三级老师2021国产三级精品三级在| 国产精品男男视频一区二区三区 | 国产精品福利一区二区| 国产99久久精品一区二区| 99久久精品费精品国产一区二区| 91视频国产精品| 青青草精品视频| 国产精品亚洲一区二区在线观看|