需要写个程序通过
pcap-filter
表达式过滤数据包,测试时发现过滤结果不对!现将问题简化如下(以tcpdump举例)
问题描述
- 通过 tcpdump 过滤出173_20170107_180747_p5p2.pcap 文件中IP为 10.10.88.173的数据包,并保存为result.pcap,过滤命令
tcpdump -r 173_20170107_180747_p5p2.pcap -w result.pcap "host 10.10.88.173"
- 原始数据包用wireshark打开,设置过滤表达式为
ip.addr==10.10.88.173
,发现IP为 10.10.88.173的数据包个数为7150
- 但用wireshark打开tcpdump过滤出的result.pcap文件,发现其数据包个数为
7152
,如下图!(此时如果知道原因就不用往下看了)
问题分析
- 通过对比wireshark和tcpdump过滤出的数据包,发现tcpdump过滤出的pcap文件,多了两个ARP数据包。如图
- 但就自己所了解的,ARP协议应属于链路层的,不属于IP网络层的(这种表述可能有争论),为什么tcpdump会将其包含在过滤结果内呢?
- 通过
man pcap-filter
查阅pcap-filter表达式语法,发现自己写的tcpdump过滤表达式host 10.10.88.173
是正确的啊
- 但细看却发现,默认下的
host
,src host
,dst host
过滤出的数据包,是包含ARP, RARP协议的!!!wireshark解析ARP数据包,其也包含对应的IP 10.10.88.173,man pcap-filter
,其准确描述如下
问题解决
- 将tcpdump过滤表达式修改为
ip host 10.10.88.173
,即运行命令tcpdump -r 173_20170107_180747_p5p2.pcap -w result.pcap "ip host 10.10.88.173"
即可!
问题总结
- 在使用tcpdump或其他工具过特定IP的数据包时,pcap-filter过滤表达式的书写要注意!
- 如果仅仅是想过滤出IP层的特定IP的数据,需要使用
ip host X.X.X.X
或ip src X.X.X.X
或ip dst X.X.X.X
- 如果仅仅是想过滤出ARP或RARP协议的IP数据包时,需要使用
arp host X.X.X.X
或rarp host X.X.X.X
man pcap-filter
,多熟悉下