使用 pcap 捕获双 VLAN 流量
Using pcap to capture double vlan traffic
我正在尝试编写一个简单的数据包嗅探器,只需要处理某些类型的流量。我用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 的参数时会产生语法错误
我找到了允许 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 等。我们可以通过在每个接口(自己的线程(上打开和捕获来解决这个问题,以便我们拥有正确的链接类型,从而为我们提供更多过滤器选项。
- 具有非整数边容量的最大流量的Dinic算法
- 使用 pcap 捕获双 VLAN 流量
- 环回中的嗅探会捕获外部流量吗?
- 如何将HTTPS流量重定向到本地主机:443上的代理?
- 使用eBPF拦截Linux上的所有传出/传入流量
- Qt modbus 串行端口流量控制处理
- 如何将传入的流量重定向到模块中,以在Omnet 中的简单子模块中
- 为什么通用参考和右值参考的流量不同
- Boost::ASIO:针对最小流量、长连接、小消息、即时传递进行优化
- 如何让QML映射流量通过代理,并禁用该程序的其余部分
- 使用流量的数组大小不起作用
- C 提升库 - 最低成本最大流量
- 使用C++将流量转发到另一个设备
- 为什么 tinyxml2 无法解析流量服务器 xml 文件
- 字符串流量输出比较
- MIPS(EL)VU SOLO2 VLAN模块支持(8021Q)的交叉串联Linux 3.15.3
- 构建时OPENCV流量信号识别错误
- 如何使用Winsock LSP修改出站UDP流量
- 如何在C++中分析来自流量转储文件的数据包信息
- 根据Qt表调整流量布局