嗅探 C 中的所有网络流量

Sniffing all network traffic in C

我一直在寻找关于制作小型网络嗅探器和 found this one 的最简单教程。我照做了,但是建议嗅探数据包的方法是:

sock_raw = socket( AF_PACKET , SOCK_RAW , htons(ETH_P_ALL)) ;;
while(1)
{
  data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , &saddr_size);
}

有理数:

A raw socket when put in recvfrom loop receives all incoming packets. This is because it is not bound to a particular address or port.

在我看来,这只会监控进出我自己计算机的网络流量,而不是整个 LAN。一个测试-运行证实了我的直觉。

是否正确?这种方法只能嗅探进出笔记本电脑的数据包吗?

我应该采用哪种方法来嗅探所有网络流量(即:netsniff-ng、Wireshark)?

我想避免在这种情况下使用 libpcap。

这取决于您的网络,尤其是连接一切的路由器和交换机的类型和配置。在大多数安装中,计算机之间并不直接相连。相反,他们与开关交谈。开关只会向您发送用于您的计算机的数据包 - 理由是开关精心地将电子推向您是没有意义的,而您只会扔掉这些电子。

但是计算机可以告诉开关进入“promiscuous mode”。这会将您的交换机端口配置为向您发送交换机看到的每个数据包的副本。有两个问题:

  1. 交换机仍然看不到其他 switches/routers 未发送给它的数据包。混杂模式不会传播 - 否则,您将很快获得通过 Internet 发送到任何地方的每个数据包的副本。甚至 Google 或 NSA 都无法处理这种流量。

  2. 如果您的交换机不是即插即用类型,您的系统管理员将禁用此功能。

[编辑] Wireshark 使用 libpcap 这是一个低级库,它可以完成从配置网络设备到获取和过滤它可以看到的数据包的所有工作.所以你应该尝试找到这个库的源代码,以便更好地理解它是如何完成的。

相关: