我有socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
创build一个套接字,我已经设置为混杂模式使用:
struct ifreq ifr; strncpy((char*)ifr.ifr_name, interface, IF_NAMESIZE); if(ioctl(sock, SIOCGIFINDEX, &ifr)<0) fail(2); struct packet_mreq mr; memset(&mr, 0, sizeof(mr)); mr.mr_ifindex = ifr.ifr_ifindex; mr.mr_type = PACKET_MR_PROMISC; if(setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) fail(2);
问题是,当我从套接字执行read()
,它只返回来自或到达我的计算机的数据。
我怎样才能读取和处理networking上的所有数据包?
Wireshark显示所有的数据包都很好,所以我知道这不是我的电脑或网卡。 ifconfig
在运行时报告它是PROMISC
。
与Rob Jones的建议一起,尝试使用像Wireshark这样的工具,以确保您正在接收您期望的界面上的数据包。 至少这将确认(或否认)你的代码有问题。
还需要确保将接口本身设置为混杂模式。 如果没有,那么你可以使用ioctl()来设置它:
ifr.ifr_flags |= IFF_PROMISC; if( ioctl(sock, SIOCSIFFLAGS, &ifr) != 0 ) { // handle error here }
当您的应用程序正在运行时,请确保ifconfig报告该接口的PROMISC标志。
请注意,这将需要作为特权用户执行。
试验出了代码。 为我工作。 当然(由于第102行的测试),这将只打印TCP通信的细节。
尝试使用SOCK_PACKET作为socket()的第二个参数,而不是SOCK_RAW。
如果你在交换机上,你可能只会看到目的地或源自你的计算机的数据包。 尝试一个中心。
您的交换机端口也需要进行适当配置(思科世界中的SPAN端口)。 在这里看到更多的细节:
http://www.winpcap.org/misc/faq.htm#Q-22
以下是思科有关SPAN端口如何工作的信息:
http://www.cisco.com/en/US/products/hw/switches/ps708/products_tech_note09186a008015c612.shtml
这可能不是一个软件问题。
你可能会使用错误的硬件。 您的计算机可能连接到交换机。 交换机足够聪明,可以“学习”哪些计算机在哪个端口上,并且只将流量路由到需要去的地方。 因此,交换机正在为您过滤数据包。
要解决这个问题,你需要获得一个Hub。 虽然集线器和交换机看起来非常相似,但它们的工作方式不同 该集线器是愚蠢的,将路由到所有端口的所有流量,使您看到混杂模式下的其他流量。
请注意,即使您更换了计算机连接的设备,也可能会连接到更多的交换机,这也会限制流量。 因此,您将无法从比您自己的中心或测试实验室设置更远的地方嗅探流量。