tcpdump抓包mysql建聯驗證TCP的三次握手

趙帥強發表於2018-08-19

TCP的三次握手、4次揮手是老生常談的東西,那麼具體的包資料傳輸過程你是否真正的試過呢?我們今天就通過具體的mysql建聯實踐來看看是怎麼傳遞資料包的。

網路嗅探器和tcpdump

在共享式的網路中,資料的傳輸是怎麼完成的呢?又是怎麼找到對應的機器來進行資料互動的呢?

一般來說,在網路中,資訊報會廣播到網路中所有主機的網路介面,主機的網路裝置通過IP和MAC地址等資訊判斷該資訊包是否應該接收,通過拋棄與自己無關的資料包,這樣就達到網際網路中我們與指定機器通訊的目的。

但是在眾多的黑客技術中,嗅探器(sniffer)是一種很常見的技術,它使主機的網路裝置接收所有到達的資訊包,從而達到網路監聽的目的。在共享式的區域網中,嗅探器可以對該網路中的流量一覽無餘。除了黑客,網路管理員也應該學會使用嗅探器來隨時掌握網路的使用情況,在網路效能急劇下降時,找到網路阻塞和問題的根源。

具體的嗅探器工具在Windows平臺上有netxraysniffer pro軟體,在Linux平臺上有tcpdump。我們今天要介紹的就是tcpdump sniffer嗅探器工具。

安裝tcpdump

tcpdumpLinux平臺一個以命令列方式執行的網路流量檢測工具,它能截獲網路卡上收到的資料包,並通過一定的配置來完成對內容的解析和分析。

檢測系統中是否已經安裝了tcpdump的方法非常簡單,就是直接執行:

$ tcpdump
# 如果沒有安裝
tcpdump: no suitable device found
# 如果已經安裝,則當有網路請求時會出現許多的這種網路解析資料
21:44:14.109590 IP client.host > server.host: Flags [P.], seq 1031520:1031984, ack 1393, win 95, options [nop,nop,TS val 2242702304 ecr 3381086780], length 464

最新的tcpdump原始碼下載地址:http://www.tcpdump.org (tcpdump官網)

tcpdump的執行需要pcap的支援,請同時下載這兩個內容並安裝,一般最新版本的兩者是互相相容的。

筆者本次下載的是最新的版本,直接在命令列裡使用wget下載即可:

# 下載tcpdump檔案
wget www.tcpdump.org/release/tcpdump-4.9.2.tar.gz

# 下載pcap檔案
wget www.tcpdump.org/release/libpcap-1.9.0.tar.gz

# 安裝libpcap,make install的時候可能需要root許可權
tar -zxvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0.tar.gz
./configure
make
make install

# 安裝tcpdump的過程
tar -zxvf tcpdump-4.9.2
cd tcpdump-4.9.2
./configure
make
make install

安裝完成後跟上面一樣輸入tcpdump判斷是否成功安裝了:

$ tcpdump

tcpdump的命令列引數和過濾規則

tcpdump是個命令列方式的網路嗅探器,如果不使用任何引數,會持續捕獲所有的網路請求內容,無法有效分析,可以針對自己的需求使用合適的引數。

# 檢視所有的引數內容
$ tcpdump --help
tcpdump version 4.9.2
libpcap version 1.9.0-PRE-GIT (with TPACKET_V2)
OpenSSL 1.0.0-fips 29 Mar 2010
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
                [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
                [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
                [ -Q in|out|inout ]
                [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
                [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
                [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
                [ -Z user ] [ expression ]

常用的引數含義:

  • -a 將網路地址轉變為易識別的主機名(預設)
  • -n 不將網路地址轉變為易識別的主機名,即直接顯示IP地址,可以省略DNS查詢
  • -nn 不進行埠名稱的轉換
  • -t 不顯示時間戳
  • -tttt 輸出由date處理後的時間戳
  • -c 捕獲指定數量的資料包後退出
  • -e 顯示資料鏈路層的頭部資訊,即MAC地址資訊:00:8c:fa:f3:e3:04 (oui Unknown) > 00:e0:ec:3e:8d:39 (oui Unknown), ethertype IPv4 (0x0800), length 71
  • -f 將目標的internet地址以IP形式展示
  • -i 監聽指定的網路介面
  • -S 將tcp的序號以絕對值形式輸出,而不是相對值
  • -r 從指定文件中讀取資料包
  • -w 不分析和輸出,將截獲的資料包寫入指定文件
  • -T 將截獲的資料包按指定型別報文解析,如:cnfp/rpc/rtp/snmp/vat/wb
  • -F 從指定文件讀取過濾規則,忽略命令列的其他引數指定的過濾規則
  • -v 輸出較詳細的資訊,如IP包的TTL和協議型別
  • -vv 輸出詳細的資訊
  • -l 將標準輸出轉變為行緩衝方式
  • -d 將上次捕獲的資訊包以彙編格式顯示
  • -dd 將上次捕獲的資訊包以C語言格式顯示
  • -ddd 將上次捕獲的資訊包以十進位制格式顯示

除了引數之外,更重要的是過濾表示式,包含三個型別關鍵字:

  • host: 10.10.13.15 監聽的主機
  • net: 10.10.0.0 監聽的網路
  • port: 21 監聽的埠

四個截獲方向關鍵字:

  • dst: 10.10.13.15 目標主機
  • src: 10.10.0.0 源網路
  • dst and src
  • dst or src(預設值)

多個協議關鍵字:ether/fddi/tr/ip/ip6/rarp/decnet/tcp/udp

還支援組合表示式:not/!/and/&&/or/||

舉幾個常用的例子:

# 只捕獲指定IP的資料包
tcpdump host 10.10.13.15
# 捕獲兩個IP的資料包
tcpdump host 1010.13.15 and (10.10.13.47)
# 捕獲指定埠和協議的資料包
tcpdump tcp port 21 and host 10.10.13.15

例項測試

這個例項是A機器(client)向B機器(server)發起mysql例項連線,並立刻exit的場景。

步驟:

  1. A機器啟動嗅探器: tcpdump host 10.92.143.15 -tttt -S -nn
  2. A機器執行mysql -u root -h 10.92.143.15 -p
  3. A機器資料庫連線成功後,立刻exit;退出mysql例項連線

報文:

# 三次握手,其中S代表Syn,.代表Ack,S.代表Syn, Ack
2018-08-19 22:52:42.768100 IP 10.119.124.24.45298 > 10.92.143.15.3306: Flags [S], seq 864854527, win 14600, options [mss 1460,sackOK,TS val 2246810963 ecr 0,nop,wscale 8], length 0
2018-08-19 22:52:42.810055 IP 10.92.143.15.3306 > 10.119.124.24.45298: Flags [S.], seq 4288771247, ack 864854528, win 14480, options [mss 1460,sackOK,TS val 2062159250 ecr 2246810963,nop,wscale 8], length 0
2018-08-19 22:52:42.810065 IP 10.119.124.24.45298 > 10.92.143.15.3306: Flags [.], ack 4288771248, win 58, options [nop,nop,TS val 2246811005 ecr 2062159250], length 0
# 登入校驗,傳輸使用者名稱和密碼驗證階段,其中P代表Push,傳輸資料需要。這裡包含登入驗證和版本資訊等後設資料的交換
2018-08-19 22:52:42.852102 IP 10.92.143.15.3306 > 10.119.124.24.45298: Flags [P.], seq 4288771248:4288771308, ack 864854528, win 57, options [nop,nop,TS val 2062159292 ecr 2246811005], length 60
2018-08-19 22:52:42.852118 IP 10.119.124.24.45298 > 10.92.143.15.3306: Flags [.], ack 4288771308, win 58, options [nop,nop,TS val 2246811047 ecr 2062159292], length 0
2018-08-19 22:52:42.853251 IP 10.119.124.24.45298 > 10.92.143.15.3306: Flags [P.], seq 864854528:864854590, ack 4288771308, win 58, options [nop,nop,TS val 2246811048 ecr 2062159292], length 62
2018-08-19 22:52:42.895198 IP 10.92.143.15.3306 > 10.119.124.24.45298: Flags [.], ack 864854590, win 57, options [nop,nop,TS val 2062159335 ecr 2246811048], length 0
2018-08-19 22:52:42.895256 IP 10.92.143.15.3306 > 10.119.124.24.45298: Flags [P.], seq 4288771308:4288771319, ack 864854590, win 57, options [nop,nop,TS val 2062159335 ecr 2246811048], length 11
2018-08-19 22:52:42.895264 IP 10.119.124.24.45298 > 10.92.143.15.3306: Flags [.], ack 4288771319, win 58, options [nop,nop,TS val 2246811090 ecr 2062159335], length 0
2018-08-19 22:52:42.895312 IP 10.119.124.24.45298 > 10.92.143.15.3306: Flags [P.], seq 864854590:864854627, ack 4288771319, win 58, options [nop,nop,TS val 2246811090 ecr 2062159335], length 37
2018-08-19 22:52:42.937268 IP 10.92.143.15.3306 > 10.119.124.24.45298: Flags [.], ack 864854627, win 57, options [nop,nop,TS val 2062159377 ecr 2246811090], length 0
2018-08-19 22:52:42.937405 IP 10.92.143.15.3306 > 10.119.124.24.45298: Flags [P.], seq 4288771319:4288771409, ack 864854627, win 57, options [nop,nop,TS val 2062159377 ecr 2246811090], length 90
2018-08-19 22:52:42.937414 IP 10.119.124.24.45298 > 10.92.143.15.3306: Flags [.], ack 4288771409, win 58, options [nop,nop,TS val 2246811132 ecr 2062159377], length 0
# 傳送exit;正好5個字元
2018-08-19 22:52:44.366633 IP 10.119.124.24.45298 > 10.92.143.15.3306: Flags [P.], seq 864854627:864854632, ack 4288771409, win 58, options [nop,nop,TS val 2246812561 ecr 2062159377], length 5
# 四次揮手,其中F代表FIN,完成資料傳送
2018-08-19 22:52:44.366649 IP 10.119.124.24.45298 > 10.92.143.15.3306: Flags [F.], seq 864854632, ack 4288771409, win 58, options [nop,nop,TS val 2246812561 ecr 2062159377], length 0
## 這個是exit的答覆
2018-08-19 22:52:44.408575 IP 10.92.143.15.3306 > 10.119.124.24.45298: Flags [.], ack 864854632, win 57, options [nop,nop,TS val 2062160848 ecr 2246812561], length 0
2018-08-19 22:52:44.408618 IP 10.92.143.15.3306 > 10.119.124.24.45298: Flags [.], ack 864854633, win 57, options [nop,nop,TS val 2062160848 ecr 2246812561], length 0
2018-08-19 22:52:44.408652 IP 10.92.143.15.3306 > 10.119.124.24.45298: Flags [F.], seq 4288771409, ack 864854633, win 57, options [nop,nop,TS val 2062160848 ecr 2246812561], length 0
2018-08-19 22:52:44.408657 IP 10.119.124.24.45298 > 10.92.143.15.3306: Flags [.], ack 4288771410, win 58, options [nop,nop,TS val 2246812603 ecr 2062160848], length 0

具體的mysql通訊內容可以檢視這篇文章:https://jin-yang.github.io/po…

參考資料

  1. Tcpdump的安裝和使用:https://blog.csdn.net/s_k_yli…
  2. Tcpdump(linux)下載、安裝、使用說明:http://www.voidcn.com/article…
  3. 深度解析mysql登入原理:https://www.cnblogs.com/cchus…
  4. TCP/IP詳解 卷1:協議 第18章 TCP連線的建立和終止
  5. Mysql通訊協議:https://jin-yang.github.io/po…

相關文章