c++ - 使用pcap捕获双vlan流量
问题描述
我正在尝试编写一个简单的数据包嗅探器,它只需要处理某些类型的流量。我正在用 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 并且还接受相同类型的 vlan 标记数据包的 IP 数据包。我相信过滤器语法是正确的,但现在需要支持双 vlan 数据包(802.1ad)并且不确定我应该如何重写过滤器字符串。我没有任何要测试的双 vlan 数据包,所以在我做对之前不能只是试验。有没有人对过滤器字符串应该如何寻找接受双 vlan 数据包(以及单 vlan 和无 vlan)有任何建议?
我还注意到,当我实时运行时,pcap_compile
函数失败并出现错误no VLAN support for data link type 113
。奇怪的是,当我将相同的过滤器代码放入wireshark 时,它并没有抱怨。知道这里有什么问题吗?
更新1:
我设法在网上找到了一些双 vlan 数据包进行测试。使用 wireshark,过滤器 ieee8021ad 工作正常,但在用作 pcap_compile 的参数时会产生语法错误
解决方案
我找到了允许 802.1ad 标记的数据包通过的正确过滤器字符串。这是更新的代码:
if (pcap_compile(pcap, &filter,
"(ip && (tcp || udp)) ||"
"(vlan && (ip && (tcp || udp))) ||"
"((ether[12:2] == 34984) && (vlan && (ip && (tcp || udp))))"
"|| vlan",
1 /*OPTIMIZE*/, PCAP_NETMASK_UNKNOWN) == PCAP_ERROR) {
LOG(ERROR) << "Failed to compile filter: " << pcap_geterr(pcap);
} else {
// Load filter into packet capture device
if (pcap_setfilter(pcap, &filter) == PCAP_ERROR) {
LOG(ERROR) << "Failed to set filter: " << pcap_geterr(pcap);
}
}
基本上,它允许 tcp/udp(IP)、VLAN 中的 tcp/udp(IP)、双 VLAN 中的 tcp/udp(IP),然后如果有 3 级或更多级别的 VLAN,则允许一切进入。据我所知告诉,当您想指定其他选项时,没有允许所有嵌套 VLAN 的通配符选项,所以现在可以这样做。
问题的第二部分是由于使用煮熟的捕获(“任何”接口),并非所有过滤器都受支持,例如 vlan、eth addr 等。我们可以通过在每个接口(自己的线程)上打开和捕获来解决这个问题这样我们就有了正确的链接类型,可以让我们有更多的过滤选项。
推荐阅读
- c# - 在 windows 上运行多个具有不同端口的 mqtt 服务器
- c# - RestSharp 异步函数错误与 ExecuteAsync()
- c# - 如何仅为正确的用户更改存储在文本文件中的用户名和密码
- javascript - 如何在momentjs中做HH:mm:ss减法
- android - 使用键盘时,ActionBar 会上升
- java - 每次向 ArrayList 对象添加新数据时如何加载或刷新 jTable 的数据
- ms-access - 如何将日期字段设置为空白值
- python-3.x - 将 CSV 文件的第一行打印为字典格式,按键排序
- c# - 将列表条目转换为数组
- javascript - 在 JS 中使用 Input 字段中的信息