从pcap获取传入数据包。我在pcap_compile()中设置了“入站”过滤器,下面是部分代码。
pcap = pcap_open_offline("test.pcap", errbuf);
if (pcap == NULL)
{
fprintf(stderr, "error reading pcap file: %s\n", errbuf);
exit(1);
}
char filter_exp[] = "inbound";
struct bpf_program pgm;
if (pcap_compile(pcap, &pgm, filter_exp, 0, PCAP_NETMASK_UNKNOWN) == -1) {
printf("Bad filter - %s\n", pcap_geterr(pcap));
return 1;
}
if (pcap_setfilter(pcap, &pgm) == -1) {
printf("Error setting filter - %s\n", pcap_geterr(pcap));
return 1;
}但这是错误信息。
坏过滤器-在读取保存文件时,链接类型1不支持入站/出站。
我只是搜索并找到了可能的解决方案。
How to filter the inbound packet by libpcap in C:
“入站”过滤器对于以太网链路类型是不可用的(熟透的捕获会有它)。对目标MAC或IP地址进行过滤是否足以满足您的需要?
How to determine packet direction using libpcap:
源或目标IP地址就足够了。如果源是本地的,则是出站。如果目标是本地的,那么它是入站的。如果两者都没有,那就是一种滥交的嗅觉。
看起来唯一的方法是确定数据包的目标IP地址是否是本地的。但是如何从pcap中知道本地IP地址呢?
发布于 2018-06-16 12:54:30
Barmar是对的,因为您无法确定一个IP地址是否仅从pcap中本地。但是,如果您知道不是在杂乱的接口上捕获的,那么可以尝试猜测接口的地址。
您可以猜测IP地址或以太网地址。以太网地址可能是最好的,因为您的pcap中可能没有IP数据包。但是,可能不太清楚哪个以太网地址是您的接口地址,因为网关的地址也将包含在大量的数据包中。
猜测接口的以太网地址
$ tshark -r tmp.pcap -T fields -e eth.src -e eth.dst | grep -Po "(\w{2}:){5}\w{2}" | sort | uniq -c
11 01:00:5e:00:00:01
41 01:00:5e:00:00:fb
11 01:00:5e:00:00:fc
27 01:00:5e:7f:ff:fa
34 00:00:00:00:00:01
31 00:00:00:00:00:fb
11815 00:00:d9:97:5b:37
905 00:00:eb:12:48:d6
11115 00:00:b0:7b:ce:08
80 ff:ff:ff:ff:ff:ff每个以太网地址都显示它包含的数据包数量(作为源或目的地)。数据包数量最多的以太网地址可能是您的接口地址,第二大地址可能是网关的地址。
以接口地址作为目的地的数据包是入站数据包,反之亦然。
猜测接口的IP地址
tshark -r tmp.pcap -T fields -e ip.src -e ip.dst ip | grep -Po "(\d+.){3}\d+" | sort | uniq -c同样的原则,您应该看到一个IP地址有大量的数据包。很可能是你的界面。
https://stackoverflow.com/questions/50884335
复制相似问题