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

        Linux下抓包命令tcpdump詳解

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

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

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

        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,則上面的命令將顯示“ 沒有那個文件或目錄”。 您可以使用發(fā)行版的軟件包管理器輕松安裝tcpdump。

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

        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ī)語法如下:

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

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

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

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

        Linux下抓包命令tcpdump詳解

        最簡單的用例是不帶任何選項(xiàng)和過濾器的情況下調(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)輸出,直到接收到中斷信號為止。 使用Ctrl + C組合鍵發(fā)送中斷信號并停止命令。

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

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

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

        [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使用它找到的第一個接口并轉(zhuǎn)儲通過該接口的所有數(shù)據(jù)包。

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

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

        對于每個接口,該命令將打印接口名稱,簡短描述以及關(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找到的第一個接口,并且在沒有為該命令提供接口時使用。 第二個接口any是一種特殊的設(shè)備,可讓您捕獲所有活動的接口。

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

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

        Linux下抓包命令tcpdump詳解

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

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

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

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

        [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ù)據(jù):

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

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

        了解tcpdump輸出

        tcpdump在新行上輸出每個捕獲的數(shù)據(jù)包的信息。 每行包括一個時間戳和有關(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]

        讓我們逐個字段進(jìn)行說明,并解釋以下內(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ù)包的時間戳為本地時間,并使用以下格式:hours:minutes:seconds.frac,其中frac是自午夜以來的幾分之一秒。
        • IP – 分組協(xié)議。 在這種情況下,IP表示Internet協(xié)議版本4(IPv4)。
        • 192.168.182.166.57494 – 源IP地址和端口,以點(diǎn)(.)分隔。
        • 35.222.85.5.80 – 目的IP地址和端口,以點(diǎn)號(.)分隔。

        TCP標(biāo)志字段。 在此示例中,[P.]表示推送確認(rèn)數(shù)據(jù)包,用于確認(rèn)前一個數(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 – 序列號在first:last表示法中。 它顯示了數(shù)據(jù)包中包含的數(shù)據(jù)數(shù)量。 除了數(shù)據(jù)流中的第一個數(shù)據(jù)包(其中這些數(shù)字是絕對的)以外,所有后續(xù)數(shù)據(jù)包均用作相對字節(jié)位置。 在此示例中,數(shù)字為1:88,表示此數(shù)據(jù)包包含數(shù)據(jù)流的字節(jié)1至88。 使用-S選項(xiàng)可打印絕對序列號。
        • ack 1 – 確認(rèn)號(acknowledgment number)是此連接另一端所期望的下一個數(shù)據(jù)的序列號。
        • win 29200 – 窗口號是接收緩沖區(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時間戳,而ecr表示回顯應(yīng)答。 請?jiān)L問IANA文檔以獲取有關(guān)TCP選項(xiàng)的更多信息。
        • length 87 – 有效載荷數(shù)據(jù)的長度

        tcpdump過濾器

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

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

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

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

        按協(xié)議過濾

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

        $sudo tcpdump -n udp

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

        $sudo tcpdump -n proto 17

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

        主機(jī)過濾

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

        $sudo tcpdump -n host 192.168.1.185

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

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

        $sudo tcpdump -n net 10.10

        按端口過濾

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

        $sudo tcpdump -n port 23

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

        $sudo tcpdump -n portrange 110-150

        按來源和目的地過濾

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

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

        $sudo tcpdump -n src host 192.168.1.185

        要查找從任何來源到端口80的流量,請使用:

        $sudo tcpdump -n dst port 80

        復(fù)合過濾器

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

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

        $sudo tcpdump -n src 192.168.1.185 and tcp port 80

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

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

        為避免在使用特殊字符時解析錯誤,請將過濾器括在單引號內(nèi)。

        這是另一個示例命令,用于從源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ù)據(jù)包的內(nèi)容。

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

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

        $sudo tcpdump -n -A

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

        $sudo tcpdump -n -X

        讀取和寫入捕獲到文件

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

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

        $sudo tcpdump -n -w data.pcap

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

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

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

        $sudo tcpdump -r data.pcap

        如果要在后臺運(yùn)行tcpdump,請?jiān)诿钅┪蔡砑优c號 (&)。

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

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

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

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

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

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

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

        總結(jié)

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

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

        如果您有任何疑問或反饋,請隨時發(fā)表評論。

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

        贊(2)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 精品综合久久久久久97超人| 国产精品无码久久久久| 国产精品 猎奇 另类视频| 亚洲AV永久青草无码精品| 国产AⅤ精品一区二区三区久久| 国产午夜福利精品久久2021 | 国产成人精品久久亚洲高清不卡| 久久发布国产伦子伦精品| 最新国产精品拍自在线观看| 精品欧美激情在线看| 91精品国产成人网在线观看| 国产精品岛国久久久久| 久久影院综合精品| 伊人久久精品无码二区麻豆| 欧美精品三区| 久久99精品久久久久久野外| 99精品人妻少妇一区二区| 久久久九九有精品国产| 精品国产欧美另类一区 | 国产精品无码午夜福利| 亚洲精品成人网站在线观看| 亚洲国产精品成人网址天堂| 欧美黑人巨大videos精品| 久久精品女人天堂AV麻| 国产精品香蕉在线观看| 99久久精品费精品国产| 亚洲欧美日韩精品久久| 一区二区三区国产精品| 中文字幕精品视频| 99久久夜色精品国产网站| 97精品伊人久久久大香线蕉 | 精品亚洲永久免费精品| HEYZO无码综合国产精品| 国产伦精品一区二区三区| 日韩人妻无码精品久久免费一| 在线精品亚洲| 亚洲国产精品SSS在线观看AV | 香港三级精品三级在线专区| 亚洲精品无码久久久久AV麻豆| 中文字幕一精品亚洲无线一区| 亚洲国产精品乱码一区二区|