作者:趙黎明
愛可生 MySQL DBA 團(tuán)隊(duì)成員,熟悉 Oracle、MySQL 等數(shù)據(jù)庫(kù),擅長(zhǎng)數(shù)據(jù)庫(kù)性能問題診斷、事務(wù)與鎖問題的分析等,負(fù)責(zé)處理客戶 MySQL 及我司自研 DMP 平臺(tái)日常運(yùn)維中的問題,對(duì)開源數(shù)據(jù)庫(kù)相關(guān)技術(shù)非常感興趣。
1常用抓包工具
tshark、tcpdump 和 Wireshark 都是網(wǎng)絡(luò)抓包工具,它們可以在網(wǎng)絡(luò)上捕獲和分析數(shù)據(jù)包。
tcpdump
一個(gè)開源的,基于命令行的網(wǎng)絡(luò)抓包工具。它可以捕獲和分析網(wǎng)絡(luò)數(shù)據(jù)包,運(yùn)行在幾乎所有的 Unix 和 Linux 系統(tǒng)上;可以抓取實(shí)時(shí)網(wǎng)絡(luò)通信中的數(shù)據(jù)包,然后通過過濾器及其他參數(shù),對(duì)數(shù)據(jù)包進(jìn)行解析和處理。
tshark
Wireshark 的命令行版本,也是一個(gè)開源的網(wǎng)絡(luò)分析工具。它可以在命令行下捕獲和分析網(wǎng)絡(luò)流量數(shù)據(jù),并使用 Wireshark 的過濾器來提取所需的數(shù)據(jù),還支持與各種腳本語言(如 Python 和 Perl)結(jié)合使用,以自動(dòng)化分析過程。
Wireshark
是一個(gè)流行的網(wǎng)絡(luò)協(xié)議分析器,支持從在線網(wǎng)絡(luò)或本地文件中捕獲數(shù)據(jù)包,并提供了圖形化用戶界面來展示數(shù)據(jù)包內(nèi)容;可以解析并顯示各種網(wǎng)絡(luò)協(xié)議,并提供了強(qiáng)大的分析工具以及過濾器;與 tshark 和 tcpdump 相比,Wireshark 的優(yōu)勢(shì)在于它提供了友好的 GUI 界面,使用戶更輕松地進(jìn)行網(wǎng)絡(luò)協(xié)議的分析和調(diào)試。
小結(jié)
以上這些工具都可以直接捕獲和分析網(wǎng)絡(luò)數(shù)據(jù)包,但它們?cè)谑褂梅绞胶凸δ苌下杂胁煌?;通常,我們?huì)先用 tcpdump 或 tshark 在目標(biāo)服務(wù)器上抓包生成 pcap 文件,再將其拿到裝有 Wireshark 的主機(jī)上進(jìn)行分析,本文將會(huì)分享 tshark 和 Wireshark 的一些使用技巧。
2三次握手和四次揮手
TCP 協(xié)議中的三次握手和四次揮手是 TCP 連接建立和關(guān)閉的過程。
三次握手
客戶端向服務(wù)器發(fā)送 SYN 報(bào)文(請(qǐng)求建立連接)
服務(wù)器收到 SYN 報(bào)文后,回復(fù) SYN+ACK 報(bào)文(同意建立連接)
客戶端收到 SYN+ACK 報(bào)文后,再回復(fù) ACK 報(bào)文(確認(rèn)連接建立)
四次揮手
客戶端向服務(wù)器發(fā)送 FIN 報(bào)文(請(qǐng)求斷開連接)
服務(wù)器收到 FIN 報(bào)文后,回復(fù) ACK 報(bào)文(確認(rèn)收到請(qǐng)求)
當(dāng)服務(wù)器確認(rèn)數(shù)據(jù)已經(jīng)全部發(fā)送完畢后,它會(huì)向客戶端發(fā)送 FIN 報(bào)文(關(guān)閉連接)
客戶端收到 FIN 報(bào)文后,回復(fù) ACK 報(bào)文(表示確認(rèn)收到關(guān)閉請(qǐng)求),至此,整個(gè) TCP 連接就被徹底關(guān)閉了
三次握手用于建立連接,是雙方協(xié)商建立 TCP 連接的過程;四次揮手用于斷開連接,是雙方結(jié)束 TCP 連接的過程;不過,有時(shí)候四次揮手也會(huì)變成三次(如果沒有數(shù)據(jù)發(fā)送,2 個(gè)包會(huì)合并傳輸)。
3三次握手和四次揮手的過程
我們可以通過 tshark 抓包來觀察 TCP 連接、斷開的具體過程。
--在服務(wù)端執(zhí)行tshark命令進(jìn)行抓包 dmp2(master)~#tshark-f'tcpport3332andhost10.186.61.83' Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'eth0' ==>等待捕獲TCP包直到有內(nèi)容輸出 #此處省略了-i,默認(rèn)會(huì)選擇第一個(gè)非loopback的網(wǎng)絡(luò)接口(可簡(jiǎn)寫為lo),效果與指定-ieth0相同 #-f,指定捕獲過濾器的表達(dá)式,可指定需要捕獲的內(nèi)容,如:協(xié)議、端口、主機(jī)IP等 --通過MySQL客戶端遠(yuǎn)程連接到MySQL實(shí)例,等待片刻后再退出 {master}~#m3332-s(此處配置了alias,可省略具體的連接串) mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure. mysql>exit --觀察屏幕輸出 1、三次握手 從左到右的字段依次代表序號(hào)、時(shí)間戳(納秒)、源端IP、目標(biāo)端IP、協(xié)議、包的長(zhǎng)度(字節(jié))、具體信息(包括源/目標(biāo)端口號(hào)或設(shè)備名、標(biāo)志位等內(nèi)容) 10.00000000010.186.61.83->10.186.60.68TCP7438858>mcs-mailsvr[SYN]Seq=0Win=29200Len=0MSS=1460SACK_PERM=1TSval=2369606050TSecr=0WS=128 20.00001836810.186.60.68->10.186.61.83TCP74mcs-mailsvr>38858[SYN,ACK]Seq=0Ack=1Win=28960Len=0MSS=1460SACK_PERM=1TSval=2369617045TSecr=2369606050WS=128 30.00023316110.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=1Ack=1Win=29312Len=0TSval=2369606050TSecr=2369617045 40.00059242010.186.60.68->10.186.61.83TCP148mcs-mailsvr>38858[PSH,ACK]Seq=1Ack=1Win=29056Len=82TSval=2369617045TSecr=2369606050 50.00082792010.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=1Ack=83Win=29312Len=0TSval=2369606051TSecr=2369617045 60.00083351210.186.61.83->10.186.60.68TCP10238858>mcs-mailsvr[PSH,ACK]Seq=1Ack=83Win=29312Len=36TSval=2369606051TSecr=2369617045 70.00083726310.186.60.68->10.186.61.83TCP66mcs-mailsvr>38858[ACK]Seq=83Ack=37Win=29056Len=0TSval=2369617045TSecr=2369606051 80.00199799810.186.61.83->10.186.60.68TCP26438858>mcs-mailsvr[PSH,ACK]Seq=37Ack=83Win=29312Len=198TSval=2369606052TSecr=2369617045 90.00202191610.186.60.68->10.186.61.83TCP66mcs-mailsvr>38858[ACK]Seq=83Ack=235Win=30080Len=0TSval=2369617047TSecr=2369606052 100.00697722310.186.60.68->10.186.61.83TCP2088mcs-mailsvr>38858[PSH,ACK]Seq=83Ack=235Win=30080Len=2022TSval=2369617052TSecr=2369606052 110.00722734010.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=235Ack=2105Win=33280Len=0TSval=2369606057TSecr=2369617052 120.00842644710.186.61.83->10.186.60.68TCP17138858>mcs-mailsvr[PSH,ACK]Seq=235Ack=2105Win=33280Len=105TSval=2369606058TSecr=2369617052 130.00881232410.186.60.68->10.186.61.83TCP308mcs-mailsvr>38858[PSH,ACK]Seq=2105Ack=340Win=30080Len=242TSval=2369617053TSecr=2369606058 140.00909971210.186.61.83->10.186.60.68TCP29138858>mcs-mailsvr[PSH,ACK]Seq=340Ack=2347Win=36224Len=225TSval=2369606059TSecr=2369617053 150.00918964410.186.60.68->10.186.61.83TCP106mcs-mailsvr>38858[PSH,ACK]Seq=2347Ack=565Win=31104Len=40TSval=2369617054TSecr=2369606059 160.00944393610.186.61.83->10.186.60.68TCP13238858>mcs-mailsvr[PSH,ACK]Seq=565Ack=2387Win=36224Len=66TSval=2369606059TSecr=2369617054 170.00965640510.186.60.68->10.186.61.83TCP187mcs-mailsvr>38858[PSH,ACK]Seq=2387Ack=631Win=31104Len=121TSval=2369617054TSecr=2369606059 180.04964153210.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=631Ack=2508Win=36224Len=0TSval=2369606100TSecr=2369617054 #序號(hào)1-3的包,即TCP三次握手的過程 #1)110.186.61.83->10.186.60.68TCP7438858>mcs-mailsvr[SYN]Seq=0 #2)210.186.60.68->10.186.61.83TCP74mcs-mailsvr>38858[SYN,ACK]Seq=0Ack=1 #3)310.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=1Ack=1 2、四次揮手(在客戶端執(zhí)行exit命令后才會(huì)輸出) 1986.74417350110.186.61.83->10.186.60.68TCP10038858>mcs-mailsvr[PSH,ACK]Seq=631Ack=2508Win=36224Len=34TSval=2369692794TSecr=2369617054 2086.74419455110.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[FIN,ACK]Seq=665Ack=2508Win=36224Len=0TSval=2369692794TSecr=2369617054 2186.74438941710.186.60.68->10.186.61.83TCP66mcs-mailsvr>38858[FIN,ACK]Seq=2508Ack=666Win=31104Len=0TSval=2369703789TSecr=2369692794 2286.74463220310.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=666Ack=2509Win=36224Len=0TSval=2369692795TSecr=2369703789 #序號(hào)20-22的包,為四次揮手的過程,這里由于服務(wù)器并沒有數(shù)據(jù)要傳輸給客戶端,所以將FIN和ACK合并在一個(gè)TCP包中了,即所謂的四次揮手變成了三次 #1)201986.74417350110.186.61.83->10.186.60.68TCP10038858>mcs-mailsvr[PSH,ACK]Seq=631Ack=2508 #2)2110.186.60.68->10.186.61.83TCP66mcs-mailsvr>38858[FIN,ACK]Seq=2508Ack=666 #3)2210.186.61.83->10.186.60.68TCP6638858>mcs-mailsvr[ACK]Seq=666Ack=2509
4TCP 包標(biāo)志位的說明
TCP (傳輸控制協(xié)議)包頭部有 6 個(gè)標(biāo)志位(Flag),分別為 URG、ACK、PSH、RST、SYN、FIN,它們的十六進(jìn)制值分別為:0x20、0x10、0x08、0x04、0x02、0x01,其中每個(gè)標(biāo)志位的意義如下:
URG 標(biāo)志:緊急指針是否有效
ACK 標(biāo)志:確認(rèn)號(hào)是否有效
PSH 標(biāo)志:Push操作,盡可能快地將數(shù)據(jù)交給應(yīng)用層
RST 標(biāo)志:重置連接
SYN 標(biāo)志:發(fā)起一個(gè)新的連接
FIN 標(biāo)志:釋放連接
5tshark 常見用法示例
1. tshark 以自定義字段來展示信息
--服務(wù)端執(zhí)行抓包 dmp2(master)~#tshark-ieth0-dtcp.port==3332,mysql-f"host10.186.61.83andtcpport3332"-Tfields-eframe.time-eip.host-etcp.flags Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'eth0' #-Tfields,可以指定需要輸出的字段,需配合-e一起使用,此處將分別打印獲取包的時(shí)間、主機(jī)IP及TCP的標(biāo)志位,這些字段會(huì)按照-e的順序進(jìn)行排列展示 #-e,支持多種協(xié)議下的字段展示,具體用法查詢路徑:Wireshark ->分析->顯示過濾器表達(dá)式 --通過 MySQL 客戶端連接實(shí)例,執(zhí)行一個(gè)查詢,再退出(共有 3 部分:連接、通信、斷連) {master}~#m3332-s mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure. mysql>select@@version; @@version 5.7.36-log mysql>exit --觀察屏幕輸出 1、三次握手 "Jun6,20231442.839863403CST"10.186.61.83,10.186.60.680x00000002 "Jun6,20231442.839904347CST"10.186.60.68,10.186.61.830x00000012 "Jun6,20231442.840263352CST"10.186.61.83,10.186.60.680x00000010 "Jun6,20231442.840666158CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231442.841604106CST"10.186.61.83,10.186.60.680x00000010 "Jun6,20231442.841612112CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231442.841616568CST"10.186.60.68,10.186.61.830x00000010 "Jun6,20231442.842524996CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231442.842550796CST"10.186.60.68,10.186.61.830x00000010 "Jun6,20231442.848566815CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231442.848826004CST"10.186.61.83,10.186.60.680x00000010 "Jun6,20231442.850258537CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231442.850881377CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231442.851278991CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231442.851395808CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231442.851667278CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231442.851926804CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231442.892409030CST"10.186.61.83,10.186.60.680x00000010 #前三個(gè)包分別為:0x02 [SYN]、0x12 [SYN, ACK]、0x10[ACK],即三次握手的過程 #后面的幾個(gè)包:0x18 [PSH, ACK]、0x10[ACK],是數(shù)據(jù)傳輸?shù)倪^程 2、執(zhí)行一個(gè)查詢 "Jun6,20231419.967273148CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231419.967553321CST"10.186.60.68,10.186.61.830x00000018 "Jun6,20231419.967835719CST"10.186.61.83,10.186.60.680x00000010 #當(dāng)TCP連接完成后,在數(shù)據(jù)傳輸過程中獲取的包,其標(biāo)志位為0x18[PSH,ACK]或0x10[ACK] 3、四次揮手 "Jun6,20231406.157240404CST"10.186.61.83,10.186.60.680x00000018 "Jun6,20231406.157833986CST"10.186.61.83,10.186.60.680x00000011 "Jun6,20231406.166359966CST"10.186.61.83,10.186.60.680x00000011 "Jun6,20231406.166378115CST"10.186.60.68,10.186.61.830x00000010 "Jun6,20231406.166971169CST"10.186.60.68,10.186.61.830x00000011 "Jun6,20231406.167317550CST"10.186.61.83,10.186.60.680x00000010 #看最后4個(gè)包,0x11[FIN,ACK]、0x10[ACK]、0x11[FIN,ACK]、0x10[ACK],這是標(biāo)準(zhǔn)的四次揮手過程
2. tshark 抓取 MySQL 中執(zhí)行的 SQL
--在服務(wù)器上執(zhí)行抓包 dmp2(master)~#tshark-f'tcpport3332'-Y"mysql.query"-dtcp.port==3332,mysql-Tfields-eframe.time-eip.src-eip.dst-emysql.query Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'eth0' #-Y,指定顯示過濾器表達(dá)式,在單次分析中可以代替-R選項(xiàng),此處表示僅顯示mysql.query相關(guān)的包 #-d,用于指定該抓包會(huì)話的協(xié)議詳細(xì)解析器模塊,可以執(zhí)行tshark-dhelp來查看可用的協(xié)議(執(zhí)行雖然會(huì)報(bào)錯(cuò),但會(huì)顯示所有支持的協(xié)議),此處表示將3332端口上的TCP包以MySQL協(xié)議進(jìn)行解析 #-Tfields-emysql.query,即可獲取符合MySQL協(xié)議的SQL語句 #-eip.src-eip.dst的寫法,也可以用-eip.host來替換 --先停止從庫(kù)復(fù)制后再啟動(dòng) zlm@10.186.60.74[(none)]>stopslave; QueryOK,0rowsaffected(0.06sec) zlm@10.186.60.74[(none)]>startslave; QueryOK,0rowsaffected(0.05sec) --觀察屏幕輸出 "Jun6,20231638.831359581CST"10.186.60.7410.186.60.68SELECTUNIX_TIMESTAMP() "Jun6,20231638.832278722CST"10.186.60.7410.186.60.68SELECT@@GLOBAL.SERVER_ID "Jun6,20231638.832613595CST"10.186.60.7410.186.60.68SET@master_heartbeat_period=1000000000 "Jun6,20231638.832861743CST"10.186.60.7410.186.60.68SET@master_binlog_checksum=@@global.binlog_checksum "Jun6,20231638.833078690CST"10.186.60.7410.186.60.68SELECT@master_binlog_checksum "Jun6,20231638.833278049CST"10.186.60.7410.186.60.68SELECT@@GLOBAL.GTID_MODE "Jun6,20231638.833489342CST"10.186.60.7410.186.60.68SELECT@@GLOBAL.SERVER_UUID "Jun6,20231638.833769721CST"10.186.60.7410.186.60.68SET@slave_uuid='90161133-88b1-11ed-bbcc-02000aba3c4a' #通過指定MySQL協(xié)議解析模塊,此處捕獲到了MySQL從實(shí)例在啟動(dòng)復(fù)制時(shí)會(huì)執(zhí)行的SQL語句 #如已用-d 選項(xiàng)指定了協(xié)議、端口等信息時(shí),可省略-f(抓包過濾器表達(dá)式),除非還有其他的過濾需求,但不建議省略-Y(顯示過濾器表達(dá)式),否則會(huì)輸出非常多的信息,以下兩種寫法是等效的: tshark-f'tcpport3332'-Y"mysql.query"-dtcp.port==3332,mysql-Tfields-eframe.time-eip.host-emysql.query tshark-Y"mysql.query"-dtcp.port==3332,mysql-Tfields-eframe.time-eip.host-emysql.query --獲取類型為Query的SQL dmp2(master)~#tshark-ilo-dtcp.port==3332,mysql-Y"mysql.command==3"-Tfields-eip.host-emysql.query-eframe.time-c10 Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' 127.0.0.1,127.0.0.1STARTTRANSACTION"Jun7,20231729.194080437CST" 127.0.0.1,127.0.0.1insertignoreintouniverse.u_delay(source,real_timestamp,logic_timestamp)values('ustats',now(),0)"Jun7,20231729.194306733CST" 127.0.0.1,127.0.0.1updateuniverse.u_delaysetreal_timestamp=now(),logic_timestamp=logic_timestamp+1wheresource='ustats'"Jun7,20231729.194647464CST" 127.0.0.1,127.0.0.1COMMIT"Jun7,20231729.194953692CST" 4packetscaptured #mysql.command=3,表示執(zhí)行的SQL類型為Query,共支持30多種預(yù)設(shè)值 #對(duì)于熟悉DMP的小伙伴,一看便知這是由平臺(tái)納管的一個(gè)實(shí)例,當(dāng)前正在做時(shí)間戳的寫入(判斷主從延時(shí)的依據(jù)) --獲取與show相關(guān)的SQL dmp2(master)~#tshark-ilo-dtcp.port==3332,mysql-Y'mysql.querycontains"show"'-Tfields-eip.host-emysql.query-eframe.time-c10 Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' 127.0.0.1,127.0.0.1showslavestatus"Jun7,20231744.672060318CST" 127.0.0.1,127.0.0.1showglobalstatus"Jun7,20231744.672808866CST" 127.0.0.1,127.0.0.1showglobalvariables"Jun7,20231744.672845236CST" 127.0.0.1,127.0.0.1showglobalvariableswhereVariable_name='innodb_flush_log_at_trx_commit'orVariable_name='sync_binlog'"Jun7,20231744.673036197CST" 4packetscaptured dmp2(master)~#tshark-ilo-dtcp.port==3332,mysql-Y'mysql.querymatches"^show"'-Tfields-eip.host-emysql.query-eframe.time-c10 Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' 127.0.0.1,127.0.0.1showglobalstatus"Jun7,20231702.671895630CST" 127.0.0.1,127.0.0.1showslavestatus"Jun7,20231702.671944388CST" 127.0.0.1,127.0.0.1showglobalvariables"Jun7,20231702.671998965CST" 127.0.0.1,127.0.0.1showmasterstatus"Jun7,20231702.672673795CST" 4packetscaptured #contains使用字符串進(jìn)行匹配,只要在數(shù)據(jù)包中存在指定的字符串,就會(huì)匹配成功,不論該字符串出現(xiàn)在查詢的任何位置 #matches 支持使用正則表達(dá)式進(jìn)行匹配,匹配符合指定規(guī)則的數(shù)據(jù)包,如:^show #用contains/maches進(jìn)行匹配查找時(shí),關(guān)鍵詞需用雙引號(hào)包圍,此時(shí)外層建議使用單引號(hào),因?yàn)閙aches進(jìn)行正則匹配時(shí),外層使用雙引號(hào)會(huì)報(bào)錯(cuò),contains則不限制 #以上匹配方式類似模糊查詢,但會(huì)區(qū)分大小寫,如果指定Show或SHOW為關(guān)鍵詞,可能獲取不到SQL
3. tshark 抓取 OB 中執(zhí)行 SQL
與之前的方法類似,只需調(diào)整 IP 地址和端口號(hào)即可。
--抓取5個(gè)mysql.query協(xié)議的包 [root@10-186-65-73~]#tshark-ilo-Y"mysql.query"-dtcp.port==2881,mysql-Tfields-eframe.time-eip.host-emysql.query-c5 Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' "Jun7,20231512.886615893CST"127.0.0.1,127.0.0.1select/*+MONITOR_AGENTREAD_CONSISTENCY(WEAK)*/__all_tenant.tenant_id,tenant_name,mem_used,access_count,hit_countfromv$plan_cache_statjoin__all_tenantonv$plan_cache_stat.tenant_id=__all_tenant.tenant_id "Jun7,20231512.889500546CST"127.0.0.1,127.0.0.1select/*+MONITOR_AGENTREAD_CONSISTENCY(WEAK)*/tenant_name,tenant_id,casewhenevent_id=10000then'INTERNAL'whenevent_id=13000then'SYNC_RPC'whenevent_id=14003then'ROW_LOCK_WAIT'when(event_id>=10001andevent_id<=?11006)?or?(event_id?>=11008andevent_id<=?11011)?then?'IO'?when?event?like?'latch:%'?then?'LATCH'?else?'OTHER'?END?event_group,?sum(total_waits)?as?total_waits,?sum(time_waited_micro?/?1000000)?as?time_waited?from?v$system_event?join?__all_tenant?on?v$system_event.con_id?=?__all_tenant.tenant_id?where?v$system_event.wait_class?<>'IDLE'and(con_id>1000orcon_id=1)groupbytenant_name,event_group 2packetscaptured #執(zhí)行抓包命令的服務(wù)器是OBServer集群內(nèi)的一個(gè)節(jié)點(diǎn),2881是OB的對(duì)外服務(wù)的端口號(hào) #-c,指定抓取5個(gè)包,實(shí)際上只抓到了2個(gè)符合過濾條件的包 #從獲取的SQL語句來看,猜測(cè)是由ocp_monagent監(jiān)控組件發(fā)起的信息收集相關(guān)的SQL --抓包時(shí)過濾包含“__all_”視圖的SQL [root@10-186-65-73~]#tshark-ilo-Y'mysql.querycontains"__all_"'-dtcp.port==2881,mysql-Tfields-eframe.time-eip.host-emysql.query-c5 Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' "Jun7,20231838.895171334CST"127.0.0.1,127.0.0.1select/*+MONITOR_AGENTREAD_CONSISTENCY(WEAK)*/tenant_name,tenant_id,stat_id,valuefromv$sysstat,__all_tenantwherestat_idIN(10000,10001,10002,10003,10004,10005,10006,140002,140003,140005,140006,40030,60019,60020,60024,80040,80041,130000,130001,130002,130004,20000,20001,20002,30000,30001,30002,30005,30006,30007,30008,30009,30010,30011,30012,30013,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40018,40019,50000,50001,50002,50004,50005,50008,50009,50010,50011,50037,50038,60000,60001,60002,60003,60004,60005,60019,60020,60021,60022,60023,60024,80057,120000,120001,120009,120008)and(con_id>1000orcon_id=1)and__all_tenant.tenant_id=v$sysstat.con_idandclass1000 "Jun??7,?2023?1838.896653822?CST"???127.0.0.1,127.0.0.1?????select?/*+?MONITOR_AGENT?READ_CONSISTENCY(WEAK)?*/?tenant_id,?tenant_name,?sum(total_waits)?as?total_waits,?sum(time_waited_micro)?/?1000000?as?time_waited?from?v$system_event?join?__all_tenant?on?v$system_event.con_id?=?__all_tenant.tenant_id?where?v$system_event.wait_class?<>'IDLE'groupbytenant_name 2packetscaptured [root@10-186-65-73~]#tshark-ilo-Y'mysql.querycontains"__all_"'-dtcp.port==2881,mysql-Tfields-eframe.time-eip.host-emysql.query>/tmp/monit_ob.txt Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'Loopback' 124^C Youhavemailin/var/spool/mail/root [root@10-186-65-73~]#cat/tmp/monit_ob.txt|grep-iselect|wc-l #可用此方法來獲取一些常用的“__all_”視圖相關(guān)的監(jiān)控SQL #將捕獲的SQL重定向到文本文件,再用awk處理一下就能獲取完整的SQL [root@10-186-65-73~]#awk-F""'{for(i=7;i<=NF;i++)printf("%s?",?$i);print?""}'?/tmp/monit_ob.txt|cat?-n|head?-5 ?????1??select?/*+?MONITOR_AGENT?READ_CONSISTENCY(WEAK)?*/?zone,?name,?value,?time_to_usec(now())?as?current?from?__all_zone ?????2??select?/*+?MONITOR_AGENT?READ_CONSISTENCY(WEAK)?*/?__all_tenant.tenant_id,?tenant_name,?cache_name,?cache_size?from?__all_virtual_kvcache_info,?__all_tenant?where?__all_tenant.tenant_id?=?__all_virtual_kvcache_info.tenant_id?and?svr_ip?=?'10.186.65.73'?and?svr_port?=?2882 ?????3??select?/*+?MONITOR_AGENT?READ_CONSISTENCY(WEAK)?*/?case?when?cnt?is?null?then?0?else?cnt?end?as?cnt,?tenant_name,?tenant_id?from?(select?__all_tenant.tenant_name,?__all_tenant.tenant_id,?cnt?from?__all_tenant?left?join?(select?count(1)?as?cnt,?tenant?as?tenant_name?from?__all_virtual_processlist?where?svr_ip?=?'10.186.65.73'?and?svr_port?=?2882?group?by?tenant)?t1?on?__all_tenant.tenant_name?=?t1.tenant_name)?t2 ?????4??select?/*+?MONITOR_AGENT?READ_CONSISTENCY(WEAK)?*/?case?when?cnt?is?null?then?0?else?cnt?end?as?cnt,?tenant_name,?tenant_id?from?(select?__all_tenant.tenant_name,?__all_tenant.tenant_id,?cnt?from?__all_tenant?left?join?(select?count(`state`='ACTIVE'?OR?NULL)?as?cnt,?tenant?as?tenant_name?from?__all_virtual_processlist?where?svr_ip?=?'10.186.65.73'?and?svr_port?=?2882?group?by?tenant)?t1?on?__all_tenant.tenant_name?=?t1.tenant_name)?t2 ?????5??select?/*+?MONITOR_AGENT?READ_CONSISTENCY(WEAK)?*/?__all_tenant.tenant_id,?tenant_name,?mem_used,?access_count,?hit_count?from?v$plan_cache_stat?join?__all_tenant?on?v$plan_cache_stat.tenant_id?=?__all_tenant.tenant_id?
4. tshark 抓包后用 Wireshark 解析
tshark 也可以像 tcpdump 一樣,先在服務(wù)器上抓包,再拿到 Wireshark 的圖形窗口中做進(jìn)一步分析。
--抓取50個(gè)包并生成pcap文件 dmp2(master)~#tshark-dtcp.port==3332,mysql-f'tcpport3332andhost10.186.61.83'-c50-w/tmp/61_83.pcap Runningasuser"root"andgroup"root".Thiscouldbedangerous. Capturingon'eth0' #注意,-w 指定的文件無需提前創(chuàng)建,但抓包會(huì)話必須對(duì)該目錄有寫入權(quán)限,否則會(huì)報(bào)權(quán)限不足的錯(cuò)誤。
以下截圖為三次握手和四次揮手的過程。
?
同樣地,也可以在 Wireshark 中將 mysql.query 字段展示出來:Wireshark -> 編輯 -> 首選項(xiàng) -> 外觀 -> 列 。
以下顯示過濾器表達(dá)式中的內(nèi)容表示:將包中 TCP 端口為 3332,源端 IP 地址為 10.186.60.74,協(xié)議類型為 MySQL 的內(nèi)容過濾并展示,效果如圖:
6結(jié)語
tshark 作為 Wireshark 的命令行工具,與我們比較熟悉的 tcpdump 相比,有其不少優(yōu)點(diǎn):
1. 更多的過濾條件
具有比 tcpdump 更多的過濾條件,可以更加精確地過濾所需的數(shù)據(jù)包,tshark 支持 Wireshark 過濾器語法的全部特性,并提供了更高級(jí)的功能。
2. 更加靈活的輸出格式
可以以不同的文件格式和標(biāo)準(zhǔn)輸出打印輸出捕獲數(shù)據(jù),而 tcpdump 的輸出格式非常有限。
3. 更好的可讀性和易用性
輸出會(huì)更加易于閱讀,因?yàn)樗鼤?huì)對(duì)分組進(jìn)行解析并顯示其中包含的各種數(shù)據(jù),比如協(xié)議、參數(shù)和錯(cuò)誤信息等。這些信息對(duì)數(shù)據(jù)包分析非常有幫助。
4. 更加輕量級(jí)
相比于 tcpdump,占用的系統(tǒng)資源較少,并且不需要將所有數(shù)據(jù)存儲(chǔ)在內(nèi)存中,從而能夠處理更大的數(shù)據(jù)流。
5. 更多的網(wǎng)絡(luò)協(xié)議
支持更多的網(wǎng)絡(luò)協(xié)議,包括 IPv6、IS-IS、IPX 等,而 tcpdump 支持的協(xié)議種類相對(duì)較少。
綜上,在一些較為復(fù)雜的數(shù)據(jù)包分析和網(wǎng)絡(luò)問題診斷場(chǎng)景中,更推薦使用 tshark,而對(duì)于只需快速捕捉網(wǎng)絡(luò)流量的簡(jiǎn)單應(yīng)用場(chǎng)景,tcpdump 可能會(huì)更適合一些。
審核編輯:湯梓紅
-
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3752瀏覽量
64241 -
開源
+關(guān)注
關(guān)注
3文章
3229瀏覽量
42344 -
MySQL
+關(guān)注
關(guān)注
1文章
798瀏覽量
26403 -
DBA
+關(guān)注
關(guān)注
0文章
18瀏覽量
7867 -
Wireshark
+關(guān)注
關(guān)注
0文章
49瀏覽量
6491
原文標(biāo)題:DBA抓包神器tshark測(cè)評(píng)
文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論