【发布时间】:2020-01-08 20:38:45
【问题描述】:
我正在尝试编写一个简单的数据包嗅探器,它只需要处理某些类型的流量。我正在用 C++ 对其进行编码,并在 Centos 7 机器上使用 libpcap。它工作得相当好,但希望通过使用 pcap 库的过滤选项来提高性能,以便只显示我感兴趣的数据包类型进行处理。
我的代码示例:
struct bpf_program filter;
if (pcap_compile(pcap, &filter,
"(ip && (tcp || udp)) || (vlan && (ip && (tcp || udp)))",
1 /*OPTIMIZE*/, PCAP_NETMASK_UNKNOWN) == PCAP_ERROR) {
std::cout << "Failed to compile filter: " << pcap_geterr(pcap);
} else {
// Load filter into packet capture device
if (pcap_setfilter(pcap, &filter) == PCAP_ERROR) {
std::cout << "Failed to set filter: " << pcap_geterr(pcap);
}
}
本质上,我想要包含 TCP 或 UDP 的 IP 数据包,并且还接受相同类型的 vlan 标记数据包。我相信过滤器语法是正确的,但现在需要支持双 vlan 数据包(802.1ad)并且不确定我应该如何重写过滤器字符串。我没有任何要测试的双 vlan 数据包,所以在我做对之前不能只是试验。有没有人对过滤字符串应该如何寻找接受双 vlan 数据包(以及单 vlan 和无 vlan)有任何建议?
我还注意到,当我实时运行时,pcap_compile 函数失败并出现错误 no VLAN support for data link type 113。奇怪的是,当我将相同的过滤器代码放入wireshark 时,它并没有抱怨。知道这里有什么问题吗?
更新 1:
我设法在网上找到了一些双 vlan 数据包进行测试。使用 wireshark,过滤器 ieee8021ad 工作正常,但在用作 pcap_compile 的参数时会产生语法错误
【问题讨论】:
-
您的数据包嗅探程序捕获的设备名称是什么(您传递给
pcap_open_live()或pcap_create()的名称)?您与 Wireshark 一起使用的设备的名称是什么? “任何”设备的工作方式,VLAN 标头不可用于过滤,因此您不能在“任何”设备上使用该过滤器。 -
它是“任何”设备,但我认为 wireshark 可能在幕后做一些时髦的事情,因为 vlan 过滤有效。我想知道wireshark是否只是检查'any'是否被勾选,如果是这样,而不是将其作为选项传递,它的行为就像我刚刚单独勾选了所有接口,然后允许在每个接口上进行vlan过滤(例如未煮熟)。
-
“我想知道wireshark是否只是检查是否勾选了'any',如果是这样,而不是将其作为选项传递,它的行为就像我刚刚单独勾选了所有接口一样”Wireshark不这样做。
-
在 Ubuntu 18.04 上,如果我从主屏幕选择“任何”设备并输入 capture “vlan”的过滤,过滤框变成红色,表示“不支持”,我什至无法开始捕获。
-
我个人使用的是我的 centos 7 安装附带的 wireshark 1.10.14。我还在 3 台带有wireshark 2.6.10 的不同Ubuntu 18.04 机器上进行了测试,选择“any”并将“vlan”放入过滤器中没有问题。我不确定为什么它不适合你。