1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 12976字,需瀏覽 26分鐘

         ·

        2022-07-08 22:23

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

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

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

        為方便大家跟著上手練習(xí),本文將搭建一個容器環(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 抓包

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

        HTTP 請求:下載測試頁面

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

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

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

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

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

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

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

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

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

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

        • TCP 斷開連接的四次揮手

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

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

        # 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ù)說明:

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

        • -S:打印絕對時間戳

        • -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 會直接將信息打到標(biāo)準(zhǔn)輸出,就是我們上面看到的那樣。從這些輸出里,我們看到很多信息。

        每列說明

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

        接下來依次為:

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

        packet 類型,這里是 IP 包

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

        packet TCP flags,其中

        • S 表示 syn 包

        • . 表示 ack 包

        • F 表示 fin 包

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

        序列號(seq)

        應(yīng)答號(ack)

        包的 payload 長度

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

        三次握手(1~3)

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

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

        • client -> server: SYN

        • server -> client: SYN+ACK

        • client -> server: ACK

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

        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 時刻,客戶端主動向 server(93.184.216.34)發(fā)起一個 SYN 請求,請求建立連接

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

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

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

        第二次握手: SYN+ACK

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

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

        • TCP flags 為 S.,即 SYN+ACK

        • length 也是 0,說明沒有 payload

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

        • 到達(dá) eth0 的時間為 02:52:44.692890,說明時間過了 18ms

        第三次握手: ACK

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

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

        • TCP flags 為 .,即 ACK

        • 長度為 0,說明沒有 TCP payload

        至此,三次握手完成。

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

        三次握手完成后,client 和 server 開始 HTTP 通信,客戶端通過 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 請求,請求路徑為根路徑(/),這個 packet 長度為 74 字節(jié)

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

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

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

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

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

        四次揮手

        最后是四次揮手 [5]:

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

        • 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)容 和上面看到的類似。我們上面的流量非常簡單,所以看 tcpdump 的輸出就夠了。

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

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

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

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

        追蹤 TCP 流

        下載后雙擊就可以用 wireshark 打開??吹接兄貍鳎═CP Retransmition)的包:

        在重傳的包上,右鍵 -> Follow -> TCP Stream,會過濾出只屬于這個連接的包:

        我們看到,這個連接只有 3 個包:

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

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

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

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

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

        過濾流

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

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

        下面舉一些例子:

        • ip.addr == 192.168.1.1 過濾 SRC IP 或 DST IP 是 192.168.1.1 的包

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

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

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

        • tcp.analysis.retransmission 過濾所有的重傳包

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

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

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

        總結(jié)

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

        來源:http://arthurchiao.art/blog/tcpdump-practice-zh

        推薦閱讀

        史上最簡明的 Tcpdump 入門指南,看這一篇就夠了

        tcpdump / wireshark 抓包及分析

        【建議收藏】抓包工具 tcpdump 用法說明

        8 個常用的 Wireshark 使用技巧

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

        Wireshark 抓包,帶你快速入門

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            69夜色| AⅤ在线观看视频 | 丰满的峰乳喷奶水 | 国产精品久久7777777 | 中文字幕区| 国产成人无码精品久久久电影 | 国模操逼 | 亚洲精品一区二区三区四区五区 | 精品成人一区二区 | 色秘 乱码一区二区三区在线男奴 |