从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;
}
但这是错误信息。
错误的过滤器 - 读取保存文件时,linktype 1上不支持入站/出站
我只是用Google搜索并找到了可能的解决方案。
How to filter the inbound packet by libpcap in C:
“入站”过滤器不适用于以太网链接类型(煮熟的捕获将具有它,例如。)。您的需求是否足以过滤目标MAC或IP地址?
How to determine packet direction using libpcap:
源或目标IP地址就足够了。如果源是本地的,则它是出站的。如果目标是本地目标,则它是入站目标。如果不是,那就是混杂的嗅觉。
看起来唯一的方法是确定数据包的目标IP地址是否为本地IP地址。但是如何从pcap文件中了解本地IP地址?
答案 0 :(得分:0)
Barmar是正确的,因为您无法确定IP地址是否仅来自您的pcap文件。但是,如果您知道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地址。那可能你的界面。