Inbound/outbound 读取保存文件时链接类型 1 不支持
Inbound/outbound not supported on linktype 1 when reading savefiles
从 pcap 文件获取传入数据包。我在 pcap_compile() 中设置了 "inbound" 过滤器,这里是部分代码。
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;
}
但这是错误信息。
Bad filter - inbound/outbound not supported on linktype 1 when reading savefiles
我只是用谷歌搜索并找到了可能的解决方案。
The "inbound" filter is not available for the Ethernet link type (a cooked capture would have it eg.). Is it sufficient for your needs to filter on destination MAC or IP address ?
How to determine packet direction using libpcap:
The source or target IP address is sufficient. If the source is local, it's outbound. If the target is local, it's inbound. If neither, it's a promiscuous sniff.
看来唯一的办法就是判断数据包的目标IP地址是否是本地的。但是如何从pcap文件中知道本地IP地址呢?
Barmar 是正确的,因为您不能仅通过 pcap 文件确定 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地址有大量的数据包。那是可能你的界面。
从 pcap 文件获取传入数据包。我在 pcap_compile() 中设置了 "inbound" 过滤器,这里是部分代码。
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;
}
但这是错误信息。
Bad filter - inbound/outbound not supported on linktype 1 when reading savefiles
我只是用谷歌搜索并找到了可能的解决方案。
The "inbound" filter is not available for the Ethernet link type (a cooked capture would have it eg.). Is it sufficient for your needs to filter on destination MAC or IP address ?
How to determine packet direction using libpcap:
The source or target IP address is sufficient. If the source is local, it's outbound. If the target is local, it's inbound. If neither, it's a promiscuous sniff.
看来唯一的办法就是判断数据包的目标IP地址是否是本地的。但是如何从pcap文件中知道本地IP地址呢?
Barmar 是正确的,因为您不能仅通过 pcap 文件确定 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地址有大量的数据包。那是可能你的界面。