Linux的tcpdump命令詳解


Linux的tcpdump命令

 

tcpdump簡介

tcpdump是Linux系統下的一款抓包命令集,工作原理是基於網卡抓取流動在網卡上的數據包。在Linux系統中由於tcpdump命令的簡單和強大,我們一般直接使用tcpdump命令來抓取數據包。保存之后,拖下來在wireshark中分析。

怎樣判斷你的Linux系統中是否有tcpdump呢?很簡單輸入一下命令:

tcpdump -h

若出現以下信息,恭喜你躲過一劫(Linux一般會自帶)。

如果沒有那么得先在Linux安裝這個軟件了。你以為很難么,一行命令就搞定啦:

yum install -y tcpdump

安裝完成之后敲入命令:

tcpdump -h

能夠出現上面的信息以及幫助,證明你已經成功安裝好了。

現在,你以為你輸入tcpdump就能抓包了嗎?啊哈哈可以的,能抓取到所有經過第一個網卡的數據包哦。但是,表着急,在這樣的數據包中查看我們感興趣的數據,那堪比大海撈針吶,所以先學習吧。

來看看tcpdump命令的一些參數說明吧先~

tcpdump -D        #列出可用於tcpdump抓取數據包的網卡列表

來說下:

復制代碼
eth0     //表示該服務器的第一塊網卡,一般我們tcpdump抓包都使用這塊網卡來抓取。可能有eth1,eth2等等
nflog    //Linux下的網絡過濾網卡,一般我們不使用它
nfqueue   //Linux網絡過濾隊列接口,一般不使用它
usbmon1    //USB總線接口,一般不使用它
any      //任何網卡接口
lo      //指的是該主機的回環地址(127.0.0.1),一般用來測試網絡專用,一般的數據都不通過這塊網卡,所以我們用tcpdump抓包的時候也不使用這塊網卡。
復制代碼

了解了這個之后,我們來看下服務器下有哪些網卡,輸入:

ifconfig                //這可不是Windows下的ipconfig哦,不要記混了

看見沒有,我的系統有兩塊網卡,我們使用第一塊。

我們現在使用tcpdump的第一個命令

tcpdump    //抓取通過第一個網卡的數據包,並將信息打印在屏幕上實時顯示出來

這么容易嗎?哈哈,那服務器的網卡不是有多個嗎?我想抓取指定網卡的數據包怎么辦呢?

tcpdump -i eth0  //抓取通過eth0網卡的數據包,信息實時打印在屏幕上。-i表示指定哪個網卡接口,后面跟網卡名字,比如eth0或者lo

這樣夠了嗎?哈哈,和eth0網卡會話的目的地址可多了,我只關心並找到和某一個IP地址之間會話的數據怎么辦呢?

tcpdump -i eth0 host 192.39.45.66  //抓取該網卡和該IP地址會話的數據包,實時打印在屏幕上,host后面跟IP地址或者域名,比如也可以寫成host www.baidu.com

哈哈,這樣,好像有點味道了喲,但是還不滿足哦,我只想查看所有192.39.45.66發送給服務器的數據包呢?(說白了就是我的服務器接收到的數據)

tcpdump -i eth0 src host 192.39.45.66  //抓取所有該網卡和該IP之間,收到的數據,src表示服務器收到的數據,如果該參數缺省,默認抓取所有數據

我只想查看服務器網卡eth0發送給192.39.45.66的所有數據包呢?(說白了就是我的服務器發出去的數據)

tcpdump -i eth0 dst host 192.39.45.66  //抓取所有該網卡和該IP之間,收到的數據,dst表示服務器發出去的數據,如果該參數缺省,默認抓取所有數據

哈哈,但是,有個問題,我想查看這個網卡下,某個端口號和目的IP會話的數據包,比如8080端口,怎么辦啊?這里如果端口和IP地址同時存在的話,需要加and

tcpdump -n -i eth0 port 8080 and host 192.39.45.66    //查看8080端口號的會話數據包,port表示端口號,后面比如跟8080。-n表示不對具體ip地址做域名解析,直接顯示會話兩邊的具體ip地址

還有個小小的問題,我現在只需要抓取某種協議的數據包,其他類型不關心,怎么辦?例如tcp或者udp協議的數據包

注:如果沒有標明抓取哪種協議類型的數據包,默認抓取全部協議類型的數據哦

tcpdump -n -i eth0 port 8080 and host 192.39.45.66 tcp

到這里,你都覺得好像可以了哈,但是有個很重要的問題,不是說好的Linux用tcpdump,Windows下用wireshark來分析嗎?這打印在屏幕上,怎么分析嘛,應該有個保存成某個文件的命令,下載到windows中用wireshark打開才對吧?😀😀,沒錯,接下來講的這幾個參數,還是工作中很常用的,由於參數過多,不列舉例子了:

復制代碼
-c:表示要抓取的包數量,比如-c 100表示我要抓取100個滿足條件的包。
-i:表示指定對哪個網卡接口進行抓包,比如-i eth0,表示對eth0這個網卡進行抓包
-n:不對具體ip地址進行域名解析,直接顯示ip地址
-nn:不對具體ip進行域名解析,並且端口號也不顯示服務的名稱,直接顯示數字
-D:列出可用於抓包的接口。將會列出接口的數值編號和接口名,它們都可以用於"-i"后。
-w:將抓包數據輸出到文件中而不是打印到屏幕上。
以下這兩個參數:可作抓包的時候打印出信息,作為參考,畢竟我們要在wireshark分析的😀
-XX:輸出數據包的頭部數據。
-vvv:打印和分析的時候,產生非常詳細的輸出。
復制代碼

下面,寫一個工作中很常用的抓包命令:

tcpdump -c 10 -nn -i eth0 tcp dst port 8080 and host 192.39.45.66 -w /home/huidong/MyTest.pcap

最后的路徑,為絕對路徑,如果只有文件名,保存在當前文件夾下,pcap格式可被wireshark打開,抓包完成后,你就可以在保存的路勁下看到那個包啦!最后,特別要注意,使用tcpdump命令的時候,建議加上-c命令,因為如果不加任何過濾的話,就會無限制的抓取數據包,直到磁盤存滿為止,很可怕的,有些時候我們需要觸發抓包的時候,可不用-c,觸發完之后停止抓包,就OK了。

然后將包下載到Windows下,就可以愉快的繼續下一步了。

接下來我們直接使用tcpdump命令抓一些數據包在屏幕上打印,看看數據包長啥樣:

tcpdump

第一項是時間,如果命令加上-tttt參數,那么會顯示年月日,但是大多數情況下用不到這個參數。
第二項是IP地址,我沒有加-nn參數,所以這里服務器ip地址和服務器端口號被域名解析成了VM_0_10_centos.ssh,箭頭是指數據發送方向。
第三項Flags,seq,ack,是不是很熟悉!?哈哈,沒錯,這就是TCP協議的三次握手標識

這里說一個小插曲哈,由於tcpdump是基於網卡獲取流動數據,抓取的數據協議是基於傳輸層的協議,

最常用的兩種傳輸層協議:

TCP 面向連接的可靠協議(eg:打電話)
UDP 面向無連接的不可靠協議(eg:發短信)

而我們熟知的fiddler是基於端口監聽獲取數據,只能抓取基於應用層協議的數據

而應用層協議就多啦:

HTTP/HTTPS 超文本傳輸協議
FTP 文件傳輸協議
SMTP 郵件傳輸協議
MQ 短消息隊列傳輸協議(物聯網實時通訊方面用的比較多)

說到這,可能你對三次握手還不是很清楚,下面的圖就讓你明白是怎么回事:

OK,說了這么多關於TCP協議的東西,但是,可能你現在有個疑問,tcpdump抓取的是TCP/UDP協議的包,承載的應用層數據包的協議又有這么多種,如果我想判斷這個包,是否承載着HTTP協議的數據,怎么辦呢?這個時候呢,有兩種方法,一種,是直接在抓包命令上做條件限制,讓抓取的過程中,自動過濾掉不是HTTP協議的數據。

tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 -c 10 -w ./HttpPort.pcap   //0x4745 為"GET"前兩個字母"GE",0x4854 為"HTTP"前兩個字母"HT"

如果對-XvvennSs參數不了解,沒什么神秘的,就是之前說的幾個參數組合,詳細了解可以查看tcpdump的文檔:Tcpdump官方文檔

接下來實際操作一下,我們復制上面的命令(沒有-w寫入文件,直接顯示在屏幕上),獲取一下數據包:

獲取數據包,寫入文件:

第二種,是全部獲取之后,用wireshark打開並過濾HTTP協議的數據包,這里由於HTTP承載於TCP之上,所以我們這里抓取TCP協議數據包。-s 0參數標識該數據包防止被截斷。

tcpdump tcp -i eth0 -t -s 0 port 8080 -w ./HTTPPort.pcap

然后在wireshark中使用過濾語句,篩選HTTP數據包,注意這里文件后綴為pcap

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM