38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量?
生活随笔
收集整理的這篇文章主要介紹了
38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
通常,需要暴露到公網(wǎng)的服務(wù),都會綁定一個域名,既方便了人們記憶,也避免了后臺服務(wù) IP 地址的變更影響到用戶。 不過要注意,DNS 解析受到各種網(wǎng)絡(luò)狀況的影響,性能可能不穩(wěn)定。比如公網(wǎng)延遲增大,緩存過期導(dǎo)致要重新去上游服務(wù)器請求,或者流量高峰時 DNS 服務(wù)器性能不足等,都會導(dǎo)致 DNS 響應(yīng)的延遲增大。 此時,可以借助 nslookup 或者 dig 的調(diào)試功能,分析 DNS 的解析過程,再配合 ping 等工具調(diào)試 DNS 服務(wù)器的延遲,從而定位出性能瓶頸。通常,你可以用緩存、預(yù)取、HTTPDNS 等方法,優(yōu)化 DNS 的性能。 上一節(jié)我們用到的 ping,是一個最常用的測試服務(wù)延遲的工具。很多情況下,ping 可以幫我們定位出延遲問題,不過有時候, ping 本身也會出現(xiàn)意想不到的問題。這時,就需要我們抓取 ping 命令執(zhí)行時收發(fā)的網(wǎng)絡(luò)包,然后分析這些網(wǎng)絡(luò)包,進而找出問題根源。 tcpdump 和 Wireshark 就是最常用的網(wǎng)絡(luò)抓包和分析工具,更是分析網(wǎng)絡(luò)性能必不可少的利器。
- tcpdump 僅支持命令行格式使用,常用在服務(wù)器中抓取和分析網(wǎng)絡(luò)包。
- Wireshark 除了可以抓包外,還提供了強大的圖形界面和匯總分析工具,在分析復(fù)雜的網(wǎng)絡(luò)情景時,尤為簡單和實用。
案例準(zhǔn)備
本次案例還是基于 Ubuntu 18.04,同樣適用于其他的 Linux 系統(tǒng)。我使用的案例環(huán)境是這樣的: 機器配置:2 CPU,8GB 內(nèi)存。 預(yù)先安裝 tcpdump、Wireshark 等工具,如: # Ubuntu apt-get install tcpdump wireshark# CentOS yum install -y tcpdump wireshark 由于 Wireshark 的圖形界面,并不能通過 SSH 使用,所以我推薦你在本地機器(比如 Windows)中安裝。你可以到 https://www.wireshark.org/ 下載并安裝 Wireshark。 跟以前一樣,案例中所有命令,都默認以 root 用戶(在 Windows 中,運行 Wireshark 時除外)運行。如果你是用普通用戶身份登陸系統(tǒng),請運行 sudo su root 命令切換到 root 用戶。再探 ping
前面講過,ping 是一種最常用的網(wǎng)絡(luò)工具,常用來探測網(wǎng)絡(luò)主機之間的連通性以及延遲。關(guān)于 ping 的原理和使用方法,我在前面的 Linux 網(wǎng)絡(luò)基礎(chǔ)篇 已經(jīng)簡單介紹過,而 DNS 緩慢的案例中,也多次用到了 ping 測試 DNS 服務(wù)器的延遲(RTT)。 不過,雖然 ping 比較簡單,但有時候你會發(fā)現(xiàn),ping 工具本身也可能出現(xiàn)異常,比如運行緩慢,但實際網(wǎng)絡(luò)延遲卻并不大的情況。 接下來,我們打開一個終端,SSH 登錄到案例機器中,執(zhí)行下面的命令,來測試案例機器與極客邦科技官網(wǎng)的連通性和延遲。如果一切正常,你會看到下面這個輸出: # ping 3 次(默認每次發(fā)送間隔 1 秒) # 假設(shè) DNS 服務(wù)器還是上一期配置的 114.114.114.114 $ ping -c3 geektime.org PING geektime.org (35.190.27.188) 56(84) bytes of data. 64 bytes from 35.190.27.188 (35.190.27.188): icmp_seq=1 ttl=43 time=36.8 ms 64 bytes from 35.190.27.188 (35.190.27.188): icmp_seq=2 ttl=43 time=31.1 ms 64 bytes from 35.190.27.188 (35.190.27.188): icmp_seq=3 ttl=43 time=31.2 ms--- geektime.org ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 11049ms rtt min/avg/max/mdev = 31.146/33.074/36.809/2.649 ms ping 的輸出界面, Linux 網(wǎng)絡(luò)基礎(chǔ)篇 中我們已經(jīng)學(xué)過,你可以先復(fù)習(xí)一下,自己解讀并且分析這次的輸出。 不過要注意,假如你運行時發(fā)現(xiàn) ping 很快就結(jié)束了,那就執(zhí)行下面的命令,再重試一下。至于這條命令的含義,稍后我們再做解釋。 # 禁止接收從 DNS 服務(wù)器發(fā)送過來并包含 googleusercontent 的包 $ iptables -I INPUT -p udp --sport 53 -m string --string googleusercontent --algo bm -j DROP 根據(jù) ping 的輸出,你可以發(fā)現(xiàn),geektime.org 解析后的 IP 地址是 35.190.27.188,而后三次 ping 請求都得到了響應(yīng),延遲(RTT)都是 30ms 多一點。 但匯總的地方,就有點兒意思了。3 次發(fā)送,收到 3 次響應(yīng),沒有丟包,但三次發(fā)送和接受的總時間居然超過了 11s(11049ms),這就有些不可思議了吧。 會想起上一節(jié)的 DNS 解析問題,你可能會懷疑,這可能是 DNS 解析緩慢的問題。但到底是不是呢? 再回去看 ping 的輸出,三次 ping 請求中,用的都是 IP 地址,說明 ping 只需要在最開始運行時,解析一次得到 IP,后面就可以只用 IP 了。 我們再用 nslookup 試試。在終端中執(zhí)行下面的 nslookup 命令,注意,這次我們同樣加了 time 命令,輸出 nslookup 的執(zhí)行時間: $ time nslookup geektime.org Server: 114.114.114.114 Address: 114.114.114.114#53Non-authoritative answer: Name: geektime.org Address: 35.190.27.188real 0m0.044s user 0m0.006s sys 0m0.003s 可以看到,域名解析還是很快的,只需要 44ms,顯然比 11s 短了很多。 到這里,再往后該怎么分析呢?其實,這時候就可以用 tcpdump 抓包,查看 ping 在收發(fā)哪些網(wǎng)絡(luò)包。 我們再打開另一個終端(終端二),SSH 登錄案例機器后,執(zhí)行下面的命令: $ tcpdump -nn udp port 53 or host 35.190.27.188 當(dāng)然,你可以直接用 tcpdump 不加任何參數(shù)來抓包,但那樣的話,就可能抓取到很多不相干的包。由于我們已經(jīng)執(zhí)行過 ping 命令,知道了 geekbang.org 的 IP 地址是 35.190.27.188,也知道 ping 命令會執(zhí)行 DNS 查詢。所以,上面這條命令,就是基于這個規(guī)則進行過濾。 我來具體解釋一下這條命令。- -nn ,表示不解析抓包中的域名(即不反向解析)、協(xié)議以及端口號。
- udp port 53 ,表示只顯示 UDP 協(xié)議的端口號(包括源端口和目的端口)為 53 的包。
- host 35.190.27.188 ,表示只顯示 IP 地址(包括源地址和目的地址)為 35.190.27.188 的包。
- 這兩個過濾條件中間的“ or ”,表示或的關(guān)系,也就是說,只要滿足上面兩個條件中的任一個,就可以展示出來。
- 36909+ 表示查詢標(biāo)識值,它也會出現(xiàn)在響應(yīng)中,加號表示啟用遞歸查詢。
- A? 表示查詢 A 記錄。
- geektime.org. 表示待查詢的域名。
- 30 表示報文長度。
tcpdump
我們知道,tcpdump 也是最常用的一個網(wǎng)絡(luò)分析工具。它基于 libpcap ,利用內(nèi)核中的 AF_PACKET 套接字,抓取網(wǎng)絡(luò)接口中傳輸?shù)木W(wǎng)絡(luò)包;并提供了強大的過濾規(guī)則,幫你從大量的網(wǎng)絡(luò)包中,挑出最想關(guān)注的信息。 tcpdump 為你展示了每個網(wǎng)絡(luò)包的詳細細節(jié),這就要求,在使用前,你必須要對網(wǎng)絡(luò)協(xié)議有基本了解。而要了解網(wǎng)絡(luò)協(xié)議的詳細設(shè)計和實現(xiàn)細節(jié), RFC 當(dāng)然是最權(quán)威的資料。 不過,RFC 的內(nèi)容,對初學(xué)者來說可能并不友好。如果你對網(wǎng)絡(luò)協(xié)議還不太了解,推薦你去學(xué)《TCP/IP 詳解》,特別是第一卷的 TCP/IP 協(xié)議族。這是每個程序員都要掌握的核心基礎(chǔ)知識。 再回到 tcpdump 工具本身,它的基本使用方法,還是比較簡單的,也就是 tcpdump [選項] [過濾表達式]。當(dāng)然,選項和表達式的外面都加了中括號,表明它們都是可選的。 提示:在 Linux 工具中,如果你在文檔中看到,選項放在中括號里,就說明這是一個可選選項。這時候就要留意一下,這些選項是不是有默認值。 查看 tcpdump 的 手冊 ,以及 pcap-filter 的手冊,你會發(fā)現(xiàn),tcpdump 提供了大量的選項以及各式各樣的過濾表達式。不過不要擔(dān)心,只需要掌握一些常用選項和過濾表達式,就可以滿足大部分場景的需要了。 為了幫你更快上手 tcpdump 的使用,我在這里也幫你整理了一些最常見的用法,并且繪制成了表格,你可以參考使用。 首先,來看一下常用的幾個選項。在上面的 ping 案例中,我們用過 -nn 選項,表示不用對 IP 地址和端口號進行名稱解析。其他常用選項,我用下面這張表格來解釋。 接下來,我們再來看常用的過濾表達式。剛剛用過的是 udp port 53 or host 35.190.27.188 ,表示抓取 DNS 協(xié)議的請求和響應(yīng)包,以及源地址或目的地址為 35.190.27.188 的包。 其他常用的過濾選項,我也整理成了下面這個表格。 最后,再次強調(diào) tcpdump 的輸出格式,我在前面已經(jīng)介紹了它的基本格式: 時間戳 協(xié)議 源地址. 源端口 > 目的地址. 目的端口 網(wǎng)絡(luò)包詳細信息 其中,網(wǎng)絡(luò)包的詳細信息取決于協(xié)議,不同協(xié)議展示的格式也不同。所以,更詳細的使用方法,還是需要你去查詢 tcpdump 的 man 手冊(執(zhí)行 man tcpdump 也可以得到)。 不過,講了這么多,你應(yīng)該也發(fā)現(xiàn)了。tcpdump 雖然功能強大,可是輸出格式卻并不直觀。特別是,當(dāng)系統(tǒng)中網(wǎng)絡(luò)包數(shù)比較多(比如 PPS 超過幾千)的時候,你想從 tcpdump 抓取的網(wǎng)絡(luò)包中分析問題,實在不容易。 對比之下,Wireshark 則通過圖形界面,以及一系列的匯總分析工具,提供了更友好的使用界面,讓你可以用更快的速度,擺平網(wǎng)絡(luò)性能問題。接下來,我們就詳細來看看它。Wireshark
Wireshark 也是最流行的一個網(wǎng)絡(luò)分析工具,它最大的好處就是提供了跨平臺的圖形界面。跟 tcpdump 類似,Wireshark 也提供了強大的過濾規(guī)則表達式,同時,還內(nèi)置了一系列的匯總分析工具。 比如,拿剛剛的 ping 案例來說,你可以執(zhí)行下面的命令,把抓取的網(wǎng)絡(luò)包保存到 ping.pcap 文件中: $ tcpdump -nn udp port 53 or host 35.190.27.188 -w ping.pcap 接著,把它拷貝到你安裝有 Wireshark 的機器中,比如你可以用 scp 把它拷貝到本地來: $ scp host-ip/path/ping.pcap . 然后,再用 Wireshark 打開它。打開后,你就可以看到下面這個界面: 從 Wireshark 的界面里,你可以發(fā)現(xiàn),它不僅以更規(guī)整的格式,展示了各個網(wǎng)絡(luò)包的頭部信息;還用了不同顏色,展示 DNS 和 ICMP 這兩種不同的協(xié)議。你也可以一眼看出,中間的兩條 PTR 查詢并沒有響應(yīng)包。 接著,在網(wǎng)絡(luò)包列表中選擇某一個網(wǎng)絡(luò)包后,在其下方的網(wǎng)絡(luò)包詳情中,你還可以看到,這個包在協(xié)議棧各層的詳細信息。比如,以編號為 5 的 PTR 包為例: 你可以看到,IP 層(Internet Protocol)的源地址和目的地址、傳輸層的 UDP 協(xié)議(Uder Datagram Protocol)、應(yīng)用層的 DNS 協(xié)議(Domain Name System)的概要信息。 繼續(xù)點擊每層左邊的箭頭,就可以看到該層協(xié)議頭的所有信息。比如點擊 DNS 后,就可以看到 Transaction ID、Flags、Queries 等 DNS 協(xié)議各個字段的數(shù)值以及含義。 當(dāng)然,Wireshark 的功能遠不止如此。接下來我再帶你一起,看一個 HTTP 的例子,并理解 TCP 三次握手和四次揮手的工作原理。 這個案例我們將要訪問的是 http://example.com/ 。進入終端一,執(zhí)行下面的命令,首先查出 example.com 的 IP。然后,執(zhí)行 tcpdump 命令,過濾得到的 IP 地址,并將結(jié)果保存到 web.pcap 中。 $ dig +short example.com 93.184.216.34 $ tcpdump -nn host 93.184.216.34 -w web.pcap 實際上,你可以在 host 表達式中,直接使用域名,即 tcpdump -nn host example.com -w web.pcap。 接下來,切換到終端二,執(zhí)行下面的 curl 命令,訪問 http://example.com: $ curl http://example.com 最后,再回到終端一,按下 Ctrl+C 停止 tcpdump,并把得到的 web.pcap 拷貝出來。 使用 Wireshark 打開 web.pcap 后,你就可以在 Wireshark 中,看到如下的界面: 由于 HTTP 基于 TCP ,所以你最先看到的三個包,分別是 TCP 三次握手的包。接下來,中間的才是 HTTP 請求和響應(yīng)包,而最后的三個包,則是 TCP 連接斷開時的三次揮手包。 從菜單欄中,點擊 Statistics -> Flow Graph,然后,在彈出的界面中的 Flow type 選擇 TCP Flows,你可以更清晰的看到,整個過程中 TCP 流的執(zhí)行過程: 這其實跟各種教程上講到的,TCP 三次握手和四次揮手很類似,作為對比, 你通常看到的 TCP 三次握手和四次揮手的流程,基本是這樣的: (圖片來自酷殼) 不過,對比這兩張圖,你會發(fā)現(xiàn),這里抓到的包跟上面的四次揮手,并不完全一樣,實際揮手過程只有三個包,而不是四個。 其實,之所以有三個包,是因為服務(wù)器端收到客戶端的 FIN 后,服務(wù)器端同時也要關(guān)閉連接,這樣就可以把 ACK 和 FIN 合并到一起發(fā)送,節(jié)省了一個包,變成了“三次揮手”。 而通常情況下,服務(wù)器端收到客戶端的 FIN 后,很可能還沒發(fā)送完數(shù)據(jù),所以就會先回復(fù)客戶端一個 ACK 包。稍等一會兒,完成所有數(shù)據(jù)包的發(fā)送后,才會發(fā)送 FIN 包。這也就是四次揮手了。 抓包后, Wireshark 中就會顯示下面這個界面(原始網(wǎng)絡(luò)包來自 Wireshark TCP 4-times close 示例,你可以點擊 這里 下載): 當(dāng)然,Wireshark 的使用方法絕不只有這些,更多的使用方法,同樣可以參考官方文檔 以及 WIKI。小結(jié)
今天,我們一起學(xué)了 tcpdump 和 Wireshark 的使用方法,并通過幾個案例,學(xué)會了如何運用這兩個工具來分析網(wǎng)絡(luò)的收發(fā)過程,并找出潛在的性能問題。 當(dāng)你發(fā)現(xiàn)針對相同的網(wǎng)絡(luò)服務(wù),使用 IP 地址快而換成域名卻慢很多時,就要想到,有可能是 DNS 在搗鬼。DNS 的解析,不僅包括從域名解析出 IP 地址的 A 記錄請求,還包括性能工具幫你,“聰明”地從 IP 地址反查域名的 PTR 請求。 實際上,根據(jù) IP 地址反查域名、根據(jù)端口號反查協(xié)議名稱,是很多網(wǎng)絡(luò)工具默認的行為,而這往往會導(dǎo)致性能工具的工作緩慢。所以,通常,網(wǎng)絡(luò)性能工具都會提供一個選項(比如 -n 或者 -nn),來禁止名稱解析。 在工作中,當(dāng)你碰到網(wǎng)絡(luò)性能問題時,不要忘記 tcpdump 和 Wireshark 這兩個大殺器。你可以用它們抓取實際傳輸?shù)木W(wǎng)絡(luò)包,再排查是否有潛在的性能問題。 思考 最后,我想請你來聊一聊,你是如何使用 tcpdump 和 Wireshark 的。你用 tcpdump 或者 Wireshark 解決過哪些網(wǎng)絡(luò)問題呢?你又是如何排查、分析并解決的呢?你可以結(jié)合今天學(xué)到的網(wǎng)絡(luò)知識,總結(jié)自己的思路。 林沛滿的書都看過,確實寫的相當(dāng)好,都是案例驅(qū)動。 把協(xié)議講的生動有趣就數(shù)他。 wireshark的使用推薦閱讀林沛滿的《Wireshark網(wǎng)絡(luò)分析就這么簡單》和《Wireshark網(wǎng)絡(luò)分析的藝術(shù)》 老師,這個案例寫的極其生動:D, 就是問一句,現(xiàn)在我們的項目都是https,那么如果抓包https,tcpdump或者wireshark是否可以解密?因為我看到wireshark解密需要private key,但是private key涉及安全問題,肯定都拿不到,那么你們遇到抓包https后解析是怎么做的呢? 作者回復(fù): 嗯,證書解密是最簡單的方法,也可以使用 MitM(Man-in-the-middle)方法 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 37 | 案例篇:DNS 解析时快时慢,
- 下一篇: 39 | 案例篇:怎么缓解 DDoS 攻