仅在接收本地流量的混杂模式下的数据包套接字

时间:2009-08-24 23:54:39

标签: c linux security raw-sockets promiscuous-mode

我有一个用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显示所有数据包都很好,所以我知道它不是我的电脑或网卡。 ifconfig报告它在运行时为PROMISC

4 个答案:

答案 0 :(得分:4)

与Rob Jones的建议一起,尝试使用像Wireshark这样的工具来确保您收到了您在界面上所期望的数据包。至少这将确认(或否认)您的代码有问题。

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

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

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

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


尝试了所提供的代码。适合我。当然(由于第102行的测试),这只会打印TCP流量的详细信息。

答案 1 :(得分:1)

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

如果您在交换机上,您可能只会看到发往或源自您的计算机的数据包。试试中心。

答案 2 :(得分:0)

您的交换机端口也需要正确配置(思科领域的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

答案 3 :(得分:0)

这可能不是软件问题。

您可能使用了错误的硬件。您的计算机可能已连接到交换机。 交换机非常智能,可以“了解”哪些计算机位于哪些端口上,并且只将流量路由到需要的位置。因此,交换机正在为您过滤数据包。

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

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