一、簡介
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>
tcpdump 的功能結合參數排列組合非常多,感興趣的朋友可以自己多動手實踐。畢竟,紙上來得終覺淺,絕知此事要躬行。
三、解析包
知道如何使用tcpdump命令,我們接下來分析抓到的報文。抓包命令:
tcpdump -i bond0 -n -s 0 port 3312 -c 10 -tttt
第一列是時間 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結構瞭解一下
四、案例分析
利用 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,進行抓包。
獲取 20190202.tcpdump 使用 wrieshark 進行分析。忽略三次握手啥的,我們直接分析MySQL交互協議。要查看MySQL協議,要使用右鍵
設置 MySQL 協議
確定之後,可以看到協議那部分出現 MySQL,info 部分有我們比較熟悉的 select ,show tables 等語句。
登陸數據庫的
執行查詢的數據流,其實我們可以通過26 ,27兩個包的時間差計算 sql 的執行時間,用於性能問題分析或者故障排查。
執行退出命令 exit
上面的舉例只是利用 tcpdump 簡單分析 MySQL 的交互,實際生產中可能更復雜,出現問題的場景不一定穩定復現,要抓很多包來分析定位。所以出現問題的時候抓包和分析包是個體力活。
GOPS 2019 · 上海站,11月1-2日,近70位AIOps、DevOps、自動化運維專家,全面深入為您介紹國內外名企落地案例,通信、金融、互聯網運維明星導師等你來~
閱讀更多 高效運維 的文章