读取savefiles时,linktype 1上不支持入站/出站

从pcap文件获取传入数据包。 我在pcap_compile()中设置了“入站”filter,这里是部分代码。

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; } 

但这是错误信息。

错误的filter – 读取保存文件时,linktype 1上不支持入站/出站

我只是用Google搜索并找到了可能的解决方案。

如何在C中通过libpcap过滤入站数据包:

“入站”filter不适用于以太网链路类型(煮熟的捕获将具有它,例如。)。 您的需求是否足以过滤目标MAC或IP地址?

如何使用libpcap确定数据包方向:

源或目标IP地址就足够了。 如果源是本地的,则它是出站的。 如果目标是本地目标,则它是入站目标。 如果不是,那就是混杂的嗅觉。

看起来唯一的方法是确定数据包的目标IP地址是否是本地的。 但是如何从pcap文件中了解本地IP地址?

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地址。 这可能就是你的界面了。