使用Linux的tcpdump命令結合Windows的wireshark抓包和分析

tcpdump簡介

tcpdump是Linux系統下的一款抓包命令集,工做原理是基於網卡抓取流動在網卡上的數據包。在Linux系統中因爲tcpdump命令的簡單和強大,咱們通常直接使用tcpdump命令來抓取數據包。保存以後,拖下來在wireshark中分析(不要問我爲何,廠長是我表哥)windows

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

tcpdump -h

若出現如下信息,恭喜你躲過一劫(Linux通常會自帶,若是沒有,證實你醜!)數組

若是沒有那麼得先在Linux安裝這個軟件了。你覺得很難麼,一行命令就搞定啦:服務器

yum install -y tcpdump

安裝完成以後敲入命令:網絡

tcpdump -h

可以出現上面的信息以及幫助,證實你已經成功安裝好了。ssh

如今,你覺得你輸入tcpdump就能抓包了嗎?啊哈哈能夠的,能抓取到全部通過第一個網卡的數據包哦。可是,表着急,在這樣的數據包中查看咱們感興趣的數據,那堪比大海撈針吶,因此先學習吧。tcp

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

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

來講下:測試

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

瞭解了這個以後,咱們來看下服務器下有哪些網卡,輸入:ui

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下,就能夠愉快的繼續下一步了。

若是你不知道怎麼把這個數據包下載到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 短消息隊列傳輸協議(物聯網實時通信方面用的比較多)

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

TCP三次握手與四次揮手

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數據包

好,說到這裏,咱們就正式進入到了Window裏的wireshark啦

wireshark簡介

相關文章
相關標籤/搜索