5

我有一个使用 创建的套接字socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)),并使用以下方法将其设置为混杂模式:

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()从套接字执行时,它只返回来自或来自我的计算机的数据。

如何让它读取和处理网络上的所有数据包?

Wireshark 显示所有数据包都很好,所以我知道它不是我的计算机或 NIC。ifconfig报告它PROMISC在运行时。

4

4 回答 4

4

除了 Rob Jones 的建议之外,请尝试使用Wireshark之类的工具来确保您在接口处接收到您期望的数据包。至少这将确认(或否认)您的代码有问题。

还需要确保接口本身设置为混杂模式。如果没有,那么您可以使用 ioctl() 来设置它:

ifr.ifr_flags |= IFF_PROMISC;
if( ioctl(sock, SIOCSIFFLAGS, &ifr) != 0 )
{
    // handle error here
}

当您的应用程序正在运行时,请确保 ifconfig 报告该接口的 PROMISC 标志。

请注意,这需要以特权用户身份执行。


试用了提供的代码。为我工作。当然(由于第 102 行的测试)这只会打印 TCP 流量的详细信息。

于 2009-08-25T00:07:29.063 回答
1

尝试使用 SOCK_PACKET 作为 socket() 的第二个参数,而不是 SOCK_RAW。

如果您在交换机上,您可能只会看到发往或来自您计算机的数据包。试试集线器。

于 2009-08-25T00:04:33.377 回答
1

这可能不是软件问题。

您可能使用了错误的硬件。您的计算机可能已连接到 Switch。交换机足够聪明,可以“了解”哪些计算机在哪些端口上,并将流量仅路由到它需要去的地方。因此,交换机正在为您过滤数据包。

要解决此问题,您需要获得一个集线器。尽管集线器和交换机看起来非常相似,但它们的工作方式不同。集线器很笨,会将所有流量路由到所有端口,使您能够以混杂模式查看其他流量。

请注意,即使您更换了计算机连接的设备,它也可能连接到更多上游交换机,这也会限制流量。因此,您将无法从比您自己的集线器或测试实验室设置更远的地方嗅探流量。

于 2009-08-25T03:58:43.883 回答
0

您的交换机端口也需要适当配置(思科世界中的 SPAN 端口)。有关更多详细信息,请参见此处:

http://www.winpcap.org/misc/faq.htm#Q-22

以下是 Cisco 关于 SPAN 端口如何工作的信息:

http://www.cisco.com/en/US/products/hw/switches/ps708/products_tech_note09186a008015c612.shtml

于 2009-08-25T00:17:12.960 回答