linux - libpcap - 从所有接口(interface)捕获数据包

标签 linux networking network-protocols pcap libpcap

我需要从 Linux 机器上的所有网络接口(interface)捕获数据包。 为此,我计划使用 pcap_open_live() API 并将“any”作为设备参数传递。

我有不同类型的端口:以太网端口(例如 eth0)和 GRE 隧道(例如 tun0) 来自不同类型接口(interface)的数据包具有不同的 header 格式:

  1. 来自以太网端口的数据包具有 MAC header
  2. 来自隧道的数据包带有 Linux“熟”捕获封装(16 字节) header

我如何检查 pcap_loop() 回调处理程序我得到了哪种类型的数据包头?

最佳答案

您收到的所有数据包都具有相同类型的数据包 header ;这就是您在 pcap_t 上调用 pcap_datalink() 时得到的类型。 pcap_datalink() 返回的值是 DLT_ 值,如 Link-Layer Header Types 中所示。 tcpdump.org 网站上的页面。

如果您打开了任何设备,pcap_datalink() 将返回DLT_LINUX_SLL,这意味着ALL您捕获的数据包将具有“熟化”捕获 header - 即使是来自 eth0 的数据包!您必须在 eth0 而不是 any 上捕获这些数据包的以太网 header 。

关于linux - libpcap - 从所有接口(interface)捕获数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8995741/

相关文章:

networking - Gcloud 实例无法 ping 另一个实例

java - TcpSockets 无法连接

linux - epoll的EPOLLEXCLUSIVE模式如何与电平触发相互作用?

Linux 中的 java.lang.UnsatisfiedLinkError

c - Recv一次只能获取8个字符

sockets - 带多宿主的 SCTP 作为 TCP 的直接替代

java - NRPE 协议(protocol)说明

c++ - 共享库中的成员函数指针地址

linux - 文件如何映射到进程地址空间?

sockets - 在子网掩码和路由方面的主机设备通信