【发布时间】:2018-06-16 01:45:27
【问题描述】:
从 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 地址呢?
【问题讨论】:
-
除非其中一台设备是您运行程序的机器,否则您无法判断,然后您可以获得所有接口的 MAC 地址。
-
所以没有办法从 pcap 文件中确定以太网链路类型的入站数据包?
-
这就是你引用的文档所说的。
-
感谢您的回复。你知道数据包中是否还有其他信息可以知道它的方向吗?
-
如果您的 pcap 文件包含无线数据包,您可以使用the DS flag。
标签: c linux wireshark pcap libpcap