10.22 作為一個DBA,你有必要了解一下tcpdump

作為一個DBA,你有必要了解一下tcpdump

作為一個DBA,你有必要了解一下tcpdump

一、簡介

tcpdump 是一款強大的網絡抓包工具,dump the traffice on anetwork,對網絡上的數據包進行截獲的包分析工具。熟練掌握 tcpdump 可以方便我們跟蹤解決網絡丟包,重傳,數據庫鏈路調用等問題。

二、使用 tcpdump

2.1 語法

tcpdump 的語法如下:

<code>Usage: tcpdump [-aAdDefhIJKlLnNOpqRStuUvxX] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ] [ -y datalinktype ] [ -z command ]
[ -Z user ] [ expression ]/<code>

我們重點說一下表達式 expression,tcpdump 通過表達式對不同類型的網絡流量進行過濾,以獲取到需要的信息。tcpdump 主要支持3種類型的表達式:

1. Type(類型)選項包括 host,net 和 port,缺省為 host

<code>host(缺省類型): 指明一臺主機,如:host 10.215.20.13
net: 指定網絡地址,net 10.215.20.0
port: 指明端口號,port 3306/<code>

2. Direction(方向)選項包括 src 和 dst 以及它們的組合

<code>確定方向的關鍵字
dst or src(缺省值) 指定源或者目標地址是 10.215.20.13的流量包
src: src 10.9.51.13, 指定源地址是10.9.51.13
dst: dst net 172.0.0.0, 指定目標網絡地址是172.0.0.0
dst and src 比如: src host 10.9.51.13 and dst host 10.215.20.13/<code>

3. Proto(協議)包括 tcp 、udp 、ICMP 和 ah 等

協議的關鍵字:缺省值是監聽所有協議的信息包

<code>ip
arp
tcp
udp
icmp
其他關鍵字 gateway broadcast less greater/<code>

常用表達式:多條件時可以用括號,但是要用轉義

2.2 參數

以一個實際例子說明

tcpdump tcp -i bond0 -tttt -s 0 -c 100 and dst port ! 22 and src net 10.10.1.0/24 -w 20190131.tcpdump

解釋

<code>(1)tcp: 協議類型,用來過濾數據報的協議類型
(2)-i bond0: 只抓取經過接口bond0的包
(3)-tttt: 使用格式 2019-02-02 10:37:37.120297,便於分析

(4)-s 0: 抓取數據包時默認抓取長度為68字節。加上-s 0 後可以抓到完整的數據包
(5)-c 100: 只抓取100個數據包
(6)dst port ! 22: 不抓取目標端口是22的數據包
(7)src net 10.10.1.0/24: 數據包的源網絡地址為10.10.1.0/24
(8)-w 20190131.tcpdump: 保存成tcpdump文件中,方便使用wireshark分析抓包結果。/<code>

還有其他常用的參數:

<code>-D:列出所有可用的網絡接口
-n:禁用域名解析,讓tcpdump直接輸出IP地址.
-X:以16進制格式輸出數據包的內容,不加該參數,會只輸出iptcp/udp頭部信息。加上該選項會將整個數據包輸出。-vvvv 該參數其實是-v與-vvv的組合。-v會輸出稍微詳細一點的信息包括校驗和ttl之類的;-vvv會嘗試解析應用層協議,輸出詳細信息。二者組合就能完整的詳細信息。-A:以ASCII值顯示抓到的包,比如和MySQL的交互時,可以通過-A查看包的文本內容./<code>
作为一个DBA,你有必要了解一下tcpdump

tcpdump 的功能結合參數排列組合非常多,感興趣的朋友可以自己多動手實踐。畢竟,紙上來得終覺淺,絕知此事要躬行。

三、解析包

知道如何使用tcpdump命令,我們接下來分析抓到的報文。抓包命令:

tcpdump -i bond0 -n -s 0 port 3312 -c 10 -tttt

作为一个DBA,你有必要了解一下tcpdump

第一列是時間 2019-02-02 10:46:13.447563

第二列 IP是網絡協議名稱。

10.215.20.13.appman-server > 10.9.51.13.25569 表示 數據包發送的源端十進制地址和接收端的ip地址10.9.51.13和端口號25569。其中 > 表示數據包的流向。

Flags [P.] 包的狀態標誌,

<code>S=SYN 發起連接標誌。P=PUSH 傳送數據標誌。F=FIN, 關閉連接標誌。ack, 表示確認包。RST=RESET,異常關閉連接。., 表示沒有任何標誌。/<code>

seq 3771602051:3771602105 請求同步的序列號,注意3771602105-3771602051=54 表示數據包的大小和後面的length的大小一致。

ack 1872251807 確認已經同步的序列號+1

win 1857 當前可用的窗口大小,

註釋:window size:窗口大小,16bits,窗口字段用來控制對方發送的數據量,單位為字節。TCP 連接的一端根據設置的緩存空間大小確定自己的接收窗口大小,然後通知對方以確定對方的發送窗口的上限。

length 54 tcp 包體的長度。

一圖勝千言,tcp結構瞭解一下

作为一个DBA,你有必要了解一下tcpdump

圖片來自 https://www.cnblogs.com/the-tops/p/6587498.html

四、案例分析

利用 tcpdump 和 wireshark 分析 MySQL 交互。利用如下命令收集數據包,

<code># tcpdump -i bond0 -n -s 0 port 3320 -tttt -A -w /tmp/20190202.tcpdump
tcpdump: listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes
32 packets captured
36 packets received by filter
0 packets dropped by kernel/<code>

同時在通過其他窗口執行sql,進行抓包。

作为一个DBA,你有必要了解一下tcpdump

獲取 20190202.tcpdump 使用 wrieshark 進行分析。忽略三次握手啥的,我們直接分析MySQL交互協議。要查看MySQL協議,要使用右鍵

作为一个DBA,你有必要了解一下tcpdump

設置 MySQL 協議

作为一个DBA,你有必要了解一下tcpdump

確定之後,可以看到協議那部分出現 MySQL,info 部分有我們比較熟悉的 select ,show tables 等語句。

作为一个DBA,你有必要了解一下tcpdump

登陸數據庫的

作为一个DBA,你有必要了解一下tcpdump

執行查詢的數據流,其實我們可以通過26 ,27兩個包的時間差計算 sql 的執行時間,用於性能問題分析或者故障排查。

作为一个DBA,你有必要了解一下tcpdump

執行退出命令 exit

作为一个DBA,你有必要了解一下tcpdump

上面的舉例只是利用 tcpdump 簡單分析 MySQL 的交互,實際生產中可能更復雜,出現問題的場景不一定穩定復現,要抓很多包來分析定位。所以出現問題的時候抓包和分析包是個體力活。

作为一个DBA,你有必要了解一下tcpdump

GOPS 2019 · 上海站,11月1-2日,近70位AIOps、DevOps、自動化運維專家,全面深入為您介紹國內外名企落地案例,通信、金融、互聯網運維明星導師等你來~

作为一个DBA,你有必要了解一下tcpdump
作为一个DBA,你有必要了解一下tcpdump


分享到:


相關文章: