TCP
的三次握手、4次揮手是老生常談的東西,那麼具體的包資料傳輸過程你是否真正的試過呢?我們今天就通過具體的mysql
建聯實踐來看看是怎麼傳遞資料包的。
網路嗅探器和tcpdump
在共享式的網路中,資料的傳輸是怎麼完成的呢?又是怎麼找到對應的機器來進行資料互動的呢?
一般來說,在網路中,資訊報會廣播到網路中所有主機的網路介面,主機的網路裝置通過IP和MAC地址等資訊判斷該資訊包是否應該接收,通過拋棄與自己無關的資料包,這樣就達到網際網路中我們與指定機器通訊的目的。
但是在眾多的黑客技術中,嗅探器(sniffer)
是一種很常見的技術,它使主機的網路裝置接收所有到達的資訊包,從而達到網路監聽的目的。在共享式的區域網中,嗅探器可以對該網路中的流量一覽無餘。除了黑客,網路管理員也應該學會使用嗅探器來隨時掌握網路的使用情況,在網路效能急劇下降時,找到網路阻塞和問題的根源。
具體的嗅探器工具在Windows
平臺上有netxray
和sniffer pro
軟體,在Linux
平臺上有tcpdump
。我們今天要介紹的就是tcpdump sniffer
嗅探器工具。
安裝tcpdump
tcpdump
是Linux
平臺一個以命令列方式執行的網路流量檢測工具,它能截獲網路卡上收到的資料包,並通過一定的配置來完成對內容的解析和分析。
檢測系統中是否已經安裝了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
的場景。
步驟:
- A機器啟動嗅探器:
tcpdump host 10.92.143.15 -tttt -S -nn
- A機器執行
mysql -u root -h 10.92.143.15 -p
- 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…
參考資料
- Tcpdump的安裝和使用:https://blog.csdn.net/s_k_yli…
- Tcpdump(linux)下載、安裝、使用說明:http://www.voidcn.com/article…
- 深度解析mysql登入原理:https://www.cnblogs.com/cchus…
- TCP/IP詳解 卷1:協議 第18章 TCP連線的建立和終止
- Mysql通訊協議:https://jin-yang.github.io/po…