溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

linux中tcpdump抓取HTTP包的示例分析

發(fā)布時(shí)間:2021-06-11 11:49:05 來(lái)源:億速云 閱讀:1326 作者:小新 欄目:系統(tǒng)運(yùn)維

這篇文章將為大家詳細(xì)講解有關(guān)linux中tcpdump抓取HTTP包的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

tcpdump

tcpdump是linux系統(tǒng)自帶的抓包工具,主要通過(guò)命令行的方式,比較適合在線上服務(wù)器進(jìn)行抓包操作,如果是windows或者ubuntu完全可 以選擇一些圖形化的工具,ubuntu比較推薦用wireshark,安裝方式很簡(jiǎn)單sudo apt一下即可。

命令行格式:
tcpdump [ -adeflnNOpqStvx ] [ -c 數(shù)量 ] [ -F 文件名 ][ -i 網(wǎng)絡(luò)接口 ] [ -r 文件名] [ -s snaplen ][ -T 類型 ] [ -w 文件名 ] [表達(dá)式 ]
 
常用的參數(shù):
-l    使標(biāo)準(zhǔn)輸出變?yōu)榫彌_行形式;
-n    不把網(wǎng)絡(luò)地址轉(zhuǎn)換成名字;

-c    在收到指定的包的數(shù)目后,tcpdump就會(huì)停止;
-i    指定監(jiān)聽(tīng)的網(wǎng)絡(luò)接口;(如果沒(méi)有指定可能在默認(rèn)網(wǎng)卡上監(jiān)聽(tīng),需要指定綁定了特定IP的網(wǎng)卡)
-w    直接將包寫(xiě)入文件中,并不分析和打印出來(lái);
-s 指定記錄package的大小,常見(jiàn) -s 0 ,代表最大值65535,一半linux傳輸最小單元MTU為1500,足夠了
-X 直接輸出package data數(shù)據(jù),默認(rèn)不設(shè)置,只能通過(guò)-w指定文件進(jìn)行輸出

常用表達(dá)式:

關(guān)于類型的關(guān)鍵字,主要包括host,net,port
傳輸方向的關(guān)鍵字,主要包括src , dst ,dst or src, dst and src
協(xié)議的關(guān)鍵字,主要包括fddi,ip ,arp,rarp,tcp,udp等類型
邏輯運(yùn)算,取非運(yùn)算是 'not ' '! ', 與運(yùn)算是'and','&&';或運(yùn)算 是'or' ,'||'
其他重要的關(guān)鍵字如下:gateway, broadcast,less,greater

實(shí)際例子:

1. http數(shù)據(jù)包抓取 (直接在終端輸出package data)

tcpdump tcp port 80 -n -X -s 0 指定80端口進(jìn)行輸出

2. 抓取http包數(shù)據(jù)指定文件進(jìn)行輸出package

tcpdump tcp port 80 -n -s 0 -w /tmp/tcp.cap

對(duì)應(yīng)的/tmp/tcp.cap基本靠肉眼已經(jīng)能看一下信息,比如http Header , content信息等

3. 結(jié)合管道流

tcpdump tcp port 80 -n -s 0 -X -l | grep xxxx

這樣可以實(shí)時(shí)對(duì)數(shù)據(jù)包進(jìn)行字符串匹配過(guò)濾

4. mod_proxy反向代理抓包

線上服務(wù)器apache+jetty,通過(guò)apache mod_proxy進(jìn)行一個(gè)反向代理,80 apache端口, 7001 jetty端口

apache端口數(shù)據(jù)抓包: tcpdump tcp port 80 -n -s 0 -X -i eth0   注意:指定eth0網(wǎng)絡(luò)接口
jetty端口數(shù)據(jù)抓包: tcpdump tcp port 7001 -n -s 0 -X -i lo 注意:指定Loopback網(wǎng)絡(luò)接口

5. 只監(jiān)控特定的ip主機(jī)
tcpdump tcp host 10.16.2.85 and port 2100 -s 0 -X 
需要使用tcp表達(dá)式的組合,這里是host指示只監(jiān)聽(tīng)該ip

小技巧:

1. 可結(jié)合tcpdump(命令) + wireshark(圖形化)

操作: 

在服務(wù)器上進(jìn)行tcpdump -w /tmp/tcp.cap 指定輸出外部文件
scp /tmp/tcp.cap 拷貝文件到你本地
wireshark &  啟動(dòng)wireshark
通過(guò) File -> Open  打開(kāi)拷貝下來(lái)的文件,這樣就可以利用進(jìn)行數(shù)據(jù)包分析了
剩下來(lái)的事就非常方便了

tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

0x4745 為"GET"前兩個(gè)字母"GE"

0x4854 為"HTTP"前兩個(gè)字母"HT"

說(shuō)明: 通常情況下:一個(gè)正常的TCP連接,都會(huì)有三個(gè)階段:1、TCP三次握手;2、數(shù)據(jù)傳送;3、TCP四次揮手

里面的幾個(gè)概念:

  • SYN: (同步序列編號(hào),Synchronize Sequence Numbers)

  • ACK: (確認(rèn)編號(hào),Acknowledgement Number)

  • FIN: (結(jié)束標(biāo)志,FINish)

TCP三次握手(創(chuàng)建 OPEN)

  • 客戶端發(fā)起一個(gè)和服務(wù)創(chuàng)建TCP鏈接的請(qǐng)求,這里是SYN(J)

  • 服務(wù)端接受到客戶端的創(chuàng)建請(qǐng)求后,返回兩個(gè)信息: SYN(K) + ACK(J+1)

  • 客戶端在接受到服務(wù)端的ACK信息校驗(yàn)成功后(J與J+1),返回一個(gè)信息:ACK(K+1)

  • 服務(wù)端這時(shí)接受到客戶端的ACK信息校驗(yàn)成功后(K與K+1),不再返回信息,后面進(jìn)入數(shù)據(jù)通訊階段

數(shù)據(jù)通訊

  • 客戶端/服務(wù)端 read/write數(shù)據(jù)包

TCP四次握手(關(guān)閉 finish)

  • 客戶端發(fā)起關(guān)閉請(qǐng)求,發(fā)送一個(gè)信息:FIN(M)

  • 服務(wù)端接受到信息后,首先返回ACK(M+1),表明自己已經(jīng)收到消息。

  • 服務(wù)端在準(zhǔn)備好關(guān)閉之前,最后發(fā)送給客戶端一個(gè) FIN(N)消息,詢問(wèn)客戶端是否準(zhǔn)備好關(guān)閉了

  • 客戶端接受到服務(wù)端發(fā)送的消息后,返回一個(gè)確認(rèn)信息: ACK(N+1)

  • 最后,服務(wù)端和客戶端在雙方都得到確認(rèn)時(shí),各自關(guān)閉或者回收對(duì)應(yīng)的TCP鏈接。

詳細(xì)的狀態(tài)說(shuō)明(以及l(fā)inux相關(guān)參數(shù)調(diào)整)

  1. SYN_SEND

    • 客戶端嘗試鏈接服務(wù)端,通過(guò)open方法。也就是TCP三次握手中的第1步之后,注意是客戶端狀態(tài)

    • sysctl -w net.ipv4.tcp_syn_retries = 2 ,做為客戶端可以設(shè)置SYN包的重試次數(shù),默認(rèn)5次(大約180s)引用校長(zhǎng)的話:僅僅重試2次,現(xiàn)代網(wǎng)絡(luò)夠了

  2. SYN_RECEIVED

    • 服務(wù)接受創(chuàng)建請(qǐng)求的SYN后,也就是TCP三次握手中的第2步,發(fā)送ACK數(shù)據(jù)包之前

    • 注意是服務(wù)端狀態(tài),一般15個(gè)左右正常,如果很大,懷疑遭受SYN_FLOOD攻擊

    • sysctl -w net.ipv4.tcp_max_syn_backlog=4096 , 設(shè)置該狀態(tài)的等待隊(duì)列數(shù),默認(rèn)1024,調(diào)大后可適當(dāng)防止syn-flood,可參見(jiàn)man 7 tcp

    • sysctl -w net.ipv4.tcp_syncookies=1 , 打開(kāi)syncookie,在syn backlog隊(duì)列不足的時(shí)候,提供一種機(jī)制臨時(shí)將syn鏈接換出

    • sysctl -w net.ipv4.tcp_synack_retries = 2 ,做為服務(wù)端返回ACK包的重試次數(shù),默認(rèn)5次(大約180s)引用校長(zhǎng)的話:僅僅重試2次,現(xiàn)代網(wǎng)絡(luò)夠了

  3. ESTABLISHED

    • 客戶端接受到服務(wù)端的ACK包后的狀態(tài),服務(wù)端在發(fā)出ACK在一定時(shí)間后即為ESTABLISHED

    • sysctl -w net.ipv4.tcp_keepalive_time = 1200 ,默認(rèn)為7200秒(2小時(shí)),系統(tǒng)針對(duì)空閑鏈接會(huì)進(jìn)行心跳檢查,如果超過(guò)net.ipv4.tcp_keepalive_probes * net.ipv4.tcp_keepalive_intvl = 默認(rèn)11分,終止對(duì)應(yīng)的tcp鏈接,可適當(dāng)調(diào)整心跳檢查頻率

    • 目前線上的監(jiān)控 waring:600 , critial : 800

  4. FIN_WAIT1

    • 主動(dòng)關(guān)閉的一方,在發(fā)出FIN請(qǐng)求之后,也就是在TCP四次握手的第1步

  5. CLOSE_WAIT

    • 被動(dòng)關(guān)閉的一方,在接受到客戶端的FIN后,也就是在TCP四次握手的第2步

  6. FIN_WAIT2

    • 主動(dòng)關(guān)閉的一方,在接受到被動(dòng)關(guān)閉一方的ACK后,也就是TCP四次握手的第2步

    • sysctl -w net.ipv4.tcp_fin_timeout=30, 可以設(shè)定被動(dòng)關(guān)閉方返回FIN后的超時(shí)時(shí)間,有效回收鏈接,避免syn-flood.

  7. LASK_ACK

    • 被動(dòng)關(guān)閉的一方,在發(fā)送ACK后一段時(shí)間后(確??蛻舳艘咽盏?,再發(fā)起一個(gè)FIN請(qǐng)求。也就是TCP四次握手的第3步

  8. TIME_WAIT

    • 主動(dòng)關(guān)閉的一方,在收到被動(dòng)關(guān)閉的FIN包后,發(fā)送ACK。也就是TCP四次握手的第4步

    • sysctl -w net.ipv4.tcp_tw_recycle = 1 , 打開(kāi)快速回收TIME_WAIT,Enabling this option is not recommended since this causes problems when working with NAT (Network Address Translation)

    • sysctl -w net.ipv4.tcp_tw_reuse =1, 快速回收并重用TIME_WAIT的鏈接, 貌似和tw_recycle有沖突,不能重用就回收?

    • net.ipv4.tcp_max_tw_buckets: 處于time_wait狀態(tài)的最多鏈接數(shù),默認(rèn)為180000.

相關(guān)說(shuō)明

  • 主動(dòng)關(guān)閉方在接收到被動(dòng)關(guān)閉方的FIN請(qǐng)求后,發(fā)送成功給對(duì)方一個(gè)ACK后,將自己的狀態(tài)由FIN_WAIT2修改為T(mén)IME_WAIT,而必須 再等2倍的MSL(Maximum Segment Lifetime,MSL是一個(gè)數(shù)據(jù)報(bào)在internetwork中能存在的時(shí)間)時(shí)間之后雙方才能把狀態(tài) 都改為CLOSED以關(guān)閉連接。目前RHEL里保持TIME_WAIT狀態(tài)的時(shí)間為60秒

  • keepAlive策略可以有效的避免進(jìn)行三次握手和四次關(guān)閉的動(dòng)作

其他網(wǎng)絡(luò)重要參數(shù)

net.ipv4.tcp_rmem 參數(shù)

默認(rèn)值: min=4096 default=87380 max=4194304
 

net.ipv4.tcp_wmem 參數(shù)

默認(rèn)值: min=4096 default=16384 max=4194304

關(guān)于“l(fā)inux中tcpdump抓取HTTP包的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI