<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何使用 tcpdump 抓包?如何用 tcpdump 和 wireshark 分析網(wǎng)絡(luò)流量?

          共 12976字,需瀏覽 26分鐘

           ·

          2022-07-08 22:23

          在公眾號(hào)后臺(tái)回復(fù):JGNB,可獲取杰哥原創(chuàng)的 PDF 手冊(cè)。

          本文將展示如何使用 tcpdump 抓包,以及如何用 tcpdump 和 wireshark 分析網(wǎng)絡(luò)流量。文中的例子比較簡(jiǎn)單,適合作為入門參考。

          基礎(chǔ)環(huán)境準(zhǔn)備

          為方便大家跟著上手練習(xí),本文將搭建一個(gè)容器環(huán)境。

          Pull Docker 鏡像

          $ sudo docker pull alpine:3.8

          運(yùn)行容器

          $ sudo docker run -d --name ctn-1 alpine:3.8 sleep 3600d
          $ sudo docker ps
          CONTAINER ID    IMAGE        COMMAND         CREATED        STATUS          PORTS  NAMES
          233bc36bde4b    alpine:3.8   "sleep 3600d"   1 minutes ago  Up 14 minutes           ctn-1

          進(jìn)入容器

          $ sudo docker exec -it ctn-1 sh

          查看容器網(wǎng)絡(luò)信息

          # ifconfig
          eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:09
                    inet addr:172.17.0.9  Bcast:0.0.0.0  Mask:255.255.0.0

          安裝 tcpdump

          # apk update
          # apk add tcpdump

          HTTP/TCP 抓包

          接下來(lái)我們用 wget 獲取一個(gè)網(wǎng)站的首頁(yè)文件(index.html),同時(shí) tcpdump 抓包,對(duì)抓 到的網(wǎng)絡(luò)流量進(jìn)行分析。

          HTTP 請(qǐng)求:下載測(cè)試頁(yè)面

          example.com 是一個(gè)測(cè)試網(wǎng)站,wget 是一個(gè) linux 命令行工 具,可以下載網(wǎng)絡(luò)文件。

          如下命令可以下載一個(gè) example.com 網(wǎng)站的首頁(yè)文件 index.html:

          / # wget http://example.com
          Connecting to example.com (93.184.216.34:80)
          index.html           100% |*****************************|  1270   0:00:00 ETA

          雖然這看起來(lái)極其簡(jiǎn)單,但背后卻涵蓋了很多復(fù)雜的過(guò)程,例如:

          • 域名查找:通過(guò)訪問(wèn) DNS 服務(wù)查找 example.com 服務(wù)器對(duì)應(yīng)的 IP 地址

          • TCP 連接參數(shù)初始化:臨時(shí)端口、初始序列號(hào)的選擇等等

          • 客戶端(容器)通過(guò) TCP 三次握手協(xié)議和服務(wù)器 IP 建立 TCP 連接

          • 客戶端發(fā)起 HTTP GET 請(qǐng)求

          • 服務(wù)器返回 HTTP 響應(yīng),包含頁(yè)面數(shù)據(jù)傳輸

          • 如果頁(yè)面超過(guò)一個(gè) MTU,會(huì)分為多個(gè) packet 進(jìn)行傳輸(后面會(huì)看到,確實(shí)超過(guò) MTU 了)

          • TCP 斷開連接的四次揮手

          抓包:打到標(biāo)準(zhǔn)輸出

          用下面的 tcpdump 命令抓包,另一窗口執(zhí)行 wget http://example.com,能看到如下類 似的輸出。為了方便后面的討論,這里將一些字段去掉了,并做了適當(dāng)?shù)膶?duì)齊:

          # tcpdump -n -S -i eth0 host example.com
          1  02:52:44.513700 IP 172.17.0.9.41038 > 93.184.216.34.80: Flags [S] , seq 3310420140,                            length 0
          2  02:52:44.692890 IP 93.184.216.34.80 > 172.17.0.9.41038: Flags [S.], seq 1353235534,            ack 3310420141length 0
          3  02:52:44.692953 IP 172.17.0.9.41038 > 93.184.216.34.80: Flags [.] ,                            ack 1353235535length 0
          4  02:52:44.693009 IP 172.17.0.9.41038 > 93.184.216.34.80: Flags [P.], seq 3310420141:3310420215, ack 1353235535length 74: HTTP: GET / HTTP/1.1
          5  02:52:44.872266 IP 93.184.216.34.80 > 172.17.0.9.41038: Flags [.] ,                            ack 3310420215length 0
          6  02:52:44.873342 IP 93.184.216.34.80 > 172.17.0.9.41038: Flags [.] , seq 1353235535:1353236983, ack 3310420215length 1448: HTTP: HTTP/1.1 200 OK
          7  02:52:44.873405 IP 172.17.0.9.41038 > 93.184.216.34.80: Flags [.] ,                            ack 1353236983length 0
          8  02:52:44.874533 IP 93.184.216.34.80 > 172.17.0.9.41038: Flags [P.], seq 1353236983:1353237162, ack 3310420215length 179: HTTP
          9  02:52:44.874560 IP 172.17.0.9.41038 > 93.184.216.34.80: Flags [.] ,                            ack 1353237162length 0
          10 02:52:44.874705 IP 172.17.0.9.41038 > 93.184.216.34.80: Flags [F.], seq 3310420215,            ack 1353237162length 0
          11 02:52:45.053732 IP 93.184.216.34.80 > 172.17.0.9.41038: Flags [.] ,                            ack 3310420216length 0
          12 02:52:45.607825 IP 93.184.216.34.80 > 172.17.0.9.41038: Flags [F.], seq 1353237162,            ack 3310420216length 0
          13 02:52:45.607869 IP 172.17.0.9.41038 > 93.184.216.34.80: Flags [.] ,                            ack 1353237163length 0

          參數(shù)說(shuō)明:

          • -n:打印 IP 而不是 hostname,打印端口號(hào)而不是協(xié)議(例如打印 80 而不是 http)

          • -S:打印絕對(duì)時(shí)間戳

          • -i eth0:指定從 eth0 網(wǎng)卡抓包

          • host example.com:抓和 example.com 通信的包(雙向)

          更多 tcpdump 的常用命令,可以參考 tcpdump: An Incomplete Guide。

          抓包:存文件

          -w 命令可以將抓到的包寫到文件,注意這和用重定向方式將輸出寫到文件是不同的。后者寫的只是標(biāo)準(zhǔn)輸出打印的 LOG,而 -w 寫的是原始包。

          # tcpdump -i eth0 host example.com -w example.pcap
          ^C
          13 packets captured
          13 packets received by filter
          0 packets dropped by kernel

          生成的 pcap 文件可以用 tcpdump 或者 wireshark 之類的網(wǎng)絡(luò)流量分析工具打開。

          流量分析:tcpdump

          如果不指定輸出的話,tcpdump 會(huì)直接將信息打到標(biāo)準(zhǔn)輸出,就是我們上面看到的那樣。從這些輸出里,我們看到很多信息。

          每列說(shuō)明

          第 1 列是為了討論方便而加的行號(hào),實(shí)際的 tcpdump 輸出并沒有這一列。接下來(lái)將用 # 號(hào)加數(shù)字表示第幾個(gè)包,例如 #3 表示第 3 個(gè)包。

          接下來(lái)依次為:

          packet 時(shí)間戳,例如 02:52:44.513700 表示抓到這個(gè)包的時(shí)間是** 02 時(shí) 52 分 44 秒 513 毫秒**

          packet 類型,這里是 IP 包

          源 (SRC) IP 和端口,目的 (DST) IP 和端口

          packet TCP flags,其中

          • S 表示 syn 包

          • . 表示 ack 包

          • F 表示 fin 包

          • P 表示 push 包(發(fā)送正常數(shù)據(jù))

          序列號(hào)(seq)

          應(yīng)答號(hào)(ack)

          包的 payload 長(zhǎng)度

          包的部分內(nèi)容(ASCII)

          三次握手(1~3)

          wget 是基于 HTTP 協(xié)議,因此它在下載文件之前,必定要和服務(wù)端建立一個(gè)連接。

          而 TCP 建立連接的過(guò)程就是著名的三次握手 [4]:

          • client -> server: SYN

          • server -> client: SYN+ACK

          • client -> server: ACK

          我們可以看到,這剛好對(duì)應(yīng)于前三個(gè)包:

          1  02:52:44.513700 IP 172.17.0.9.41038 > 93.184.216.34.80Flags [S] , seq 3310420140,                 length 0
          2  02:52:44.692890 IP 93.184.216.34.80 > 172.17.0.9.41038Flags [S.]seq 1353235534, ack 3310420141, length 0
          3  02:52:44.692953 IP 172.17.0.9.41038 > 93.184.216.34.80Flags [.] ,                 ack 1353235535, length 0

          第一次握手: SYN

          #1 包含以下信息:

          • 02:52:44.513700 時(shí)刻,客戶端主動(dòng)向 server(93.184.216.34)發(fā)起一個(gè) SYN 請(qǐng)求,請(qǐng)求建立連接

          • 客戶端請(qǐng)求的服務(wù)端端口是 80(HTTP 服務(wù)默認(rèn) 80 端口),客戶端使用的是臨時(shí)端口(大于 1024)41038

          • #1 序列號(hào)是 3310420140,這是客戶端的初始序列號(hào)(客戶端和服務(wù)端分別維護(hù)自己的序列號(hào),兩者沒有關(guān)系;另外,初始序列號(hào)是系統(tǒng)選擇的,一般不是 0)

          • #1 length 為 0,因?yàn)?SYN 包不帶 TCP payload,所有信息都在 TCP header

          第二次握手: SYN+ACK

          #2 的 ack 是 3310420140,等于 #1 的 seq 加 1,這就說(shuō)明,#2 是 #1 的應(yīng)答包。

          這個(gè)應(yīng)答包的特點(diǎn):

          • TCP flags 為 S.,即 SYN+ACK

          • length 也是 0,說(shuō)明沒有 payload

          • seq 為 1353235534,這是服務(wù)端的初始序列號(hào)

          • 到達(dá) eth0 的時(shí)間為 02:52:44.692890,說(shuō)明時(shí)間過(guò)了 18ms

          第三次握手: ACK

          同理,#3 的 ack 等于 #2 的 seq 加 1,說(shuō)明 #3 是 #2 的應(yīng)答包。

          這個(gè)包的特點(diǎn):

          • TCP flags 為 .,即 ACK

          • 長(zhǎng)度為 0,說(shuō)明沒有 TCP payload

          至此,三次握手完成。

          正常數(shù)據(jù)傳輸

          三次握手完成后,client 和 server 開始 HTTP 通信,客戶端通過(guò) HTTP GET 方法下載 index.html。

          4  02:52:44.693009 IP 172.17.0.9.41038 > 93.184.216.34.80: Flags [P.], seq 3310420141:3310420215, ack 1353235535length 74: HTTP: GET / HTTP/1.1
          5  02:52:44.872266 IP 93.184.216.34.80 > 172.17.0.9.41038: Flags [.] ,                            ack 3310420215length 0
          6  02:52:44.873342 IP 93.184.216.34.80 > 172.17.0.9.41038: Flags [.] , seq 1353235535:1353236983, ack 3310420215length 1448: HTTP: HTTP/1.1 200 OK
          7  02:52:44.873405 IP 172.17.0.9.41038 > 93.184.216.34.80: Flags [.] ,                            ack 1353236983length 0
          8  02:52:44.874533 IP 93.184.216.34.80 > 172.17.0.9.41038: Flags [P.], seq 1353236983:1353237162, ack 3310420215length 179: HTTP
          9  02:52:44.874560 IP 172.17.0.9.41038 > 93.184.216.34.80: Flags [.] ,                            ack 1353237162length 0

          這里可以看到:

          • #4: client 向 server 發(fā)起 HTTP GET 請(qǐng)求,請(qǐng)求路徑為根路徑(/),這個(gè) packet 長(zhǎng)度為 74 字節(jié)

          • #5: 發(fā)送了 ACK 包,對(duì) #4 進(jìn)行確認(rèn)

          • #6: 發(fā)送了 1448 字節(jié)的數(shù)據(jù)給 client

          • #7: client 對(duì) server 的 #6 進(jìn)行應(yīng)答

          • #8: server 向 client 端繼續(xù)發(fā)送 179 字節(jié)數(shù)據(jù)

          • #9: client 對(duì) server 的 #8 進(jìn)行應(yīng)答

          四次揮手

          最后是四次揮手 [5]:

          • client -> server: FIN (我們看到的是 FIN+ACK,這是因?yàn)檫@個(gè) FIN 包除了正常的關(guān)閉連接功能之外,還被用于應(yīng)答 client 發(fā)過(guò)來(lái)的前一個(gè)包)

          • server -> client: ACK

          • server -> client: FIN+ACK

          • client -> server: ACK

          10 02:52:44.874705 IP 172.17.0.9.41038 > 93.184.216.34.80Flags [F.]seq 3310420215, ack 1353237162, length 0
          11 02:52:45.053732 IP 93.184.216.34.80 > 172.17.0.9.41038Flags [.] ,                 ack 3310420216, length 0
          12 02:52:45.607825 IP 93.184.216.34.80 > 172.17.0.9.41038Flags [F.]seq 1353237162, ack 3310420216, length 0
          13 02:52:45.607869 IP 172.17.0.9.41038 > 93.184.216.34.80Flags [.] ,                 ack 1353237163, length 0

          流量分析:wireshark

          tcpdump 可以指定 -r 讀取 pcap 文件,并以指定的格式輸出包的信息,最后輸出的內(nèi)容 和上面看到的類似。我們上面的流量非常簡(jiǎn)單,所以看 tcpdump 的輸出就夠了。

          對(duì)于復(fù)雜的 pcap,例如,其中包含了上百個(gè) IP 地址、上千個(gè)端口、上萬(wàn)個(gè)連接的 pcap, 通過(guò) tcpdump 看輸出可能就比較低效了。

          這時(shí),wireshark 這樣帶圖形用戶界面,且功能強(qiáng)大的網(wǎng) 絡(luò)流分析工具就派上了用場(chǎng)。

          wireshark 支持強(qiáng)大的過(guò)濾功能,支持按 IP、端口、協(xié)議、連接、TCP flag 以及它們的各 種組合進(jìn)行過(guò)濾,然后進(jìn)行分析,大大節(jié)省網(wǎng)絡(luò)排障的時(shí)間。

          wireshark 官方維護(hù)了一個(gè) sample pcap列表 ,我們拿 iperf-mptcp-0-0.pcap 作為例子來(lái)展示如何使用 wireshark。

          追蹤 TCP 流

          下載后雙擊就可以用 wireshark 打開。看到有重傳(TCP Retransmition)的包:

          在重傳的包上,右鍵 -> Follow -> TCP Stream,會(huì)過(guò)濾出只屬于這個(gè)連接的包:

          我們看到,這個(gè)連接只有 3 個(gè)包:

          • #1 在 08:00:05.125 發(fā)送出去,請(qǐng)求建立連接

          • 大約 1s 后,客戶端仍然沒有收到服務(wù)端的 ACK 包,觸發(fā)客戶端 TCP 超時(shí)重傳

          • 又過(guò)了大約 2s,仍然沒有收到 ACK 包,再次觸發(fā)超時(shí)重傳

          • 這里其實(shí)還可以看出 TCP 重傳的機(jī)制:指數(shù)后退,比如第一次等待 1s,第二次等 待 2s,第三次等待 4s,第四次 8s

          因此,從這個(gè)抓包文件看,這次連接沒有建立起來(lái),而直接原因就是 client 沒有收到 server 的應(yīng)答包。要跟進(jìn)這個(gè)問(wèn)題,就需要在 server 端一起抓包,看應(yīng)答包是否有發(fā)出來(lái) 。本文不對(duì)此展開。

          過(guò)濾流

          上面的截圖我們看到 wireshark 里有 tcp.stream eq 1,這其實(shí)就是其強(qiáng)大的過(guò)濾表達(dá)式。

          我們可以直接手寫表達(dá)式,然后回車,符合條件的包就會(huì)顯示出來(lái)。而且,在編輯表達(dá)式的 時(shí)候,wireshark 有自動(dòng)提示,還是比較方便的。這些表達(dá)式和 tcpdump 的 filter 表達(dá) 式很類似,如果熟悉 tcpdump,那這里不會(huì)有太大困難。

          下面舉一些例子:

          • ip.addr == 192.168.1.1 過(guò)濾 SRC IP 或 DST IP 是 192.168.1.1 的包

          • ip.src_host == 192.168.1.1 and ip.dst_host == 192.168.1.2 過(guò)濾 SRC IP 是 192.168.1.1,并且 DST IP 是 192.168.1.2 的包

          • tcp.port == 80 源端口或目的端口是 80 的包

          • tcp.flags.reset == 1 過(guò)濾 TCP RST 包。先找到 RST 包,然后右鍵 Follow -> TCP Stream 是常用的排障方式

          • tcp.analysis.retransmission 過(guò)濾所有的重傳包

          導(dǎo)出符合條件的包

          有時(shí) pcap 文件太大,導(dǎo)致 wireshark 非常慢,而大部分?jǐn)?shù)據(jù)包可能是不需要的。在這種情況 下,可以先用過(guò)濾條件篩選出感興趣的包,然后 File -> Export Specified Packets … ,彈出的對(duì)話框里,可以選擇當(dāng)前顯示的包,或者某個(gè)指定區(qū)間的包另存為新 pcap。

          然后就可以關(guān)閉原來(lái)的 pcap,打開新的 pcap 進(jìn)行分析。

          總結(jié)

          tcpdump 和 wireshark 功能非常強(qiáng)大,組合起來(lái)更是網(wǎng)絡(luò)排障的首選利器。這里介紹的內(nèi)容只是九牛一毛,更多的時(shí)候,你需要 tcpdump+wireshark+google。

          來(lái)源:http://arthurchiao.art/blog/tcpdump-practice-zh

          推薦閱讀

          史上最簡(jiǎn)明的 Tcpdump 入門指南,看這一篇就夠了

          tcpdump / wireshark 抓包及分析

          【建議收藏】抓包工具 tcpdump 用法說(shuō)明

          8 個(gè)常用的 Wireshark 使用技巧

          Wireshark 的抓包和分析,看這篇就夠了!

          Wireshark 抓包,帶你快速入門

          瀏覽 23
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩有码第4页 | selaoban亚洲精品一区 | 黄色录像网址 | 亚洲精品999 | 大乐透开奖号码结果 |