Wireshark / tcpdump / libpcap在Linux内核中拦截数据包在哪里?

据此,Wireshark能够在数据包丢失之前得到数据包(因此我无法自己获得这样的数据包)。 而且我仍然想知道wireshark获取数据包的确切位置。

答案是“On UN * Xes,它使用libpcap,在Linux上,它使用AF_PACKET套接字”。 有没有人有更具体的例子来使用“AF_PACKET套接字”? 如果我正确理解wireshark,networking接口卡(NIC)将复制所有传入的数据包并将其发送到用户定义的filter(berkeley数据包filter)。 但是,这发生在哪里? 还是我错误的理解,我想念这里的任何东西?

提前致谢!

但是,这发生在哪里?

如果我正确地理解了你 – 你想知道,在哪里初始化这样的套接字。
pcap_create 函数 ,它试图确定源接口的类型,创建它的副本并激活它。
对于网络来说,请参阅pcap_create_interface 函数 => pcap_create_common 函数 => pcap_activate_linux 函数 。
所有初始化都发生在pcap_activate_linux => activate_new function => iface_bind 函数中
(使用handlep->device = strdup(device);的设备的副本描述符handlep->device = strdup(device);
使用socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL))创建套接字socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL))
使用绑定将套接字绑定到设备bind(fd, (struct sockaddr *) &sll, sizeof(sll)) )。
有关更详细的信息,请阅读所提及功能的源文件中的注释 – 它们非常详细。
初始化后,所有的工作都在一组函数中进行,例如pcap_read_linux等。

在Linux上,您应该可以简单地使用tcpdump (利用libpcap库)来执行此操作。 这可以通过文件或STDOUT完成,并在tcpdump命令末尾指定过滤器。