使用tcpdump和wireshark分析tcp流
Tcpdump抓包
tcpdump -w packets.pcap -n -i eth0 tcp port 60 and dst host 10.22.47.66
- -i: 指定網絡接口
- -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'
只想查看目標機器端口是53或80的包:
tcpdump -i eth0 'dst port 53 or dst port 80'
抓到那些通過eth0網卡的,且來源是roclinux.cn服務器或者目標是roclinux.cn服務器的網絡包:
tcpdump -i eth0 'host roclinux.cn'
抓通過eth0網卡的,且roclinux.cn和baidu.com之間通訊的網絡包,或者,roclinux.cn和qiyi.com之間通訊的網絡包:
tcpdump -i eth0 'host roclinux.cn and (baidu.com or qiyi.com)'
獲取使用ftp端口和ftp數據端口的網絡包:
tcpdump 'port ftp or ftp-data'
獲取roclinux.cn和baidu.com之間建立TCP三次握手中第一個網絡包,即帶有SYN標記位的網絡包,另外,目的主機不能是 qiyi.com:
tcpdump 'tcp[tcpflags] & tcp-syn != 0 and not dst host qiyi.com'
打印IP包長超過576字節的網絡包:
tcpdump 'ip[2:2] > 576'
proto [ expr : size],只要掌握了這個語法格式,就能看懂上面的三個稀奇古怪的表達式了。
proto就是protocol的縮寫,表示這里要指定的是某種協議的名稱,比如ip、tcp、ether。其實proto這個位置,總共可以指定的協議類型有15個之多,包括:
- ether – 鏈路層協議
- fddi – 鏈路層協議
- tr – 鏈路層協議
- wlan – 鏈路層協議
- ppp – 鏈路層協議
- slip – 鏈路層協議
- link – 鏈路層協議
- ip
- arp
- rarp
- tcp
- udp
- icmp
- ip6
- radio
expr用來指定數據報偏移量,表示從某個協議的數據報的第多少位開始提取內容,默認的起始位置是0;而size表示從偏移量的位置開始提取多少個字節,可以設置為1、2、4。 如果只設置了expr,而沒有設置size,則默認提取1個字節。比如ip[2:2],就表示提取出第3、4個字節;而ip[0]則表示提取ip協議頭的第一個字節。
在我們提取了特定內容之后,我們就需要設置我們的過濾條件了,我們可用的“比較操作符”包括:>,<,>=,<=,=,!=,總共有6個。
ip[0] & 0xf != 5
IP協議的第0-4位,表示IP版本號,可以是IPv4(值為0100)或者IPv6(0110);第5-8位表示首部長度,單位是“4字節”,如果首部長度為默認的20字節的話,此值應為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流:
