使用tcpdump和wireshark分析tcp流
Tcpdump抓包
tcpdump -w packets.pcap -n -i eth0 tcp port 60 and dst host 10.22.47.66
- -i: 指定網(wǎng)絡(luò)接口
- -n: 不做域名解析,使用ip
- -w: 抓包存儲為可供wireshark解析的pcap格式
- tcp port 60 and dst host 10.22.47.66: 條件表達式
Tcpdump條件式
條件表達式語法可以參考: man pcap-filter,下面是一些常見的例子:
只抓udp的包:
tcpdump -i eth0 'udp'
只想查看源機器和目的機器的包:
tcpdump -i eth0 'dst 8.8.8.8'
只想查看目標(biāo)機器端口是53或80的包:
tcpdump -i eth0 'dst port 53 or dst port 80'
抓到那些通過eth0網(wǎng)卡的,且來源是roclinux.cn服務(wù)器或者目標(biāo)是roclinux.cn服務(wù)器的網(wǎng)絡(luò)包:
tcpdump -i eth0 'host roclinux.cn'
抓通過eth0網(wǎng)卡的,且roclinux.cn和baidu.com之間通訊的網(wǎng)絡(luò)包,或者,roclinux.cn和qiyi.com之間通訊的網(wǎng)絡(luò)包:
tcpdump -i eth0 'host roclinux.cn and (baidu.com or qiyi.com)'
獲取使用ftp端口和ftp數(shù)據(jù)端口的網(wǎng)絡(luò)包:
tcpdump 'port ftp or ftp-data'
獲取roclinux.cn和baidu.com之間建立TCP三次握手中第一個網(wǎng)絡(luò)包,即帶有SYN標(biāo)記位的網(wǎng)絡(luò)包,另外,目的主機不能是 qiyi.com:
tcpdump 'tcp[tcpflags] & tcp-syn != 0 and not dst host qiyi.com'
打印IP包長超過576字節(jié)的網(wǎng)絡(luò)包:
tcpdump 'ip[2:2] > 576'
proto [ expr : size],只要掌握了這個語法格式,就能看懂上面的三個稀奇古怪的表達式了。
proto就是protocol的縮寫,表示這里要指定的是某種協(xié)議的名稱,比如ip、tcp、ether。其實proto這個位置,總共可以指定的協(xié)議類型有15個之多,包括:
- ether – 鏈路層協(xié)議
- fddi – 鏈路層協(xié)議
- tr – 鏈路層協(xié)議
- wlan – 鏈路層協(xié)議
- ppp – 鏈路層協(xié)議
- slip – 鏈路層協(xié)議
- link – 鏈路層協(xié)議
- ip
- arp
- rarp
- tcp
- udp
- icmp
- ip6
- radio
expr用來指定數(shù)據(jù)報偏移量,表示從某個協(xié)議的數(shù)據(jù)報的第多少位開始提取內(nèi)容,默認的起始位置是0;而size表示從偏移量的位置開始提取多少個字節(jié),可以設(shè)置為1、2、4。 如果只設(shè)置了expr,而沒有設(shè)置size,則默認提取1個字節(jié)。比如ip[2:2],就表示提取出第3、4個字節(jié);而ip[0]則表示提取ip協(xié)議頭的第一個字節(jié)。
在我們提取了特定內(nèi)容之后,我們就需要設(shè)置我們的過濾條件了,我們可用的“比較操作符”包括:>,<,>=,<=,=,!=,總共有6個。
ip[0] & 0xf != 5
IP協(xié)議的第0-4位,表示IP版本號,可以是IPv4(值為0100)或者IPv6(0110);第5-8位表示首部長度,單位是“4字節(jié)”,如果首部長度為默認的20字節(jié)的話,此值應(yīng)為5。
安裝mac版Wireshark
Wireshark支持多種OS,包括windows, Mac和Linux,我在這里是使用的Mac版本。
$ brew search wireshark==> Formulaewireshark==> Caskswireshark wireshark-chmodbpf$ brew cask install wireshark
Wireshark分析指定的tcp流
在過濾條件中填寫tcp.flags.syn==1,或者tcp.flags.fin==1, 找到tcp連接的首包或者尾包,這樣的tcp流會相對比較完整;
在找到的包上點右鍵,選擇Follow=>TCP Stream, 找到這條完整的tcp流: