从混杂的网络设备读取(Reading from a promiscuous network devi

2019-06-26 07:12发布

我想写用于无线业务的实时分析工具。

有谁知道如何从在C混杂(或嗅探)设备读取?

我知道你需要有root权限才能做到这一点。 我不知道是否有人知道哪些功能是必须做到这一点。 普通插座似乎没有意义在这里。

Answer 1:

在Linux上使用一个插座PF_PACKET读取从原始设备数据,如运行在混杂模式以太网接口:

s = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))

这将发送接收到你的插座每个数据包的副本。 这是很可能的是,你真的不希望每一个数据包,虽然。 内核可以执行使用BPF,滤波的第一级Berkeley包过滤 。 BPF本质上是一个基于堆栈的虚拟机:它处理的小集合的诸如指令:

ldh = load halfword (from packet)  
jeq = jump if equal  
ret = return with exit code  

BPF的退出代码告诉内核是否将数据包复制到插座与否。 它是可以直接写入相对小的BPF程序,使用setsockopt的(S,SOL_SOCKET,SO_ATTACH_FILTER,)。 (警告:内核需要一个结构sock_fprog,不是结构bpf_program,不要混用这些向上或你的程序将无法在某些平台上工作)。

对于任何事情相当复杂,你真的想使用libpcap的。 BPF是它能做什么限制,特别是在它可以为每个分组执行的指令数。 libpcap的会照顾分裂复杂的过滤器了成两片,与执行滤波的第一级和功能更强的用户空间代码删除它并没有真正想看到的分组内核。

libpcap的也抽象内核接口出你的应用程序代码。 Linux和BSD使用类似的API,但Solaris要求DLPI和Windows使用别的东西。



Answer 2:

我曾经听在原始以太网帧和结束了创建这个包装。 通过调用与设备名称的功能,前eth0我得到的回报插座,这是处于混杂模式。 什么,你需要做的是创建一个原始套接字,然后放入混杂模式。 这里是我做到了。

int raw_init (const char *device)
{
    struct ifreq ifr;
    int raw_socket;

    memset (&ifr, 0, sizeof (struct ifreq));

    /* Open A Raw Socket */
    if ((raw_socket = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL))) < 1)
    {
        printf ("ERROR: Could not open socket, Got #?\n");
        exit (1);
    }

    /* Set the device to use */
    strcpy (ifr.ifr_name, device);

    /* Get the current flags that the device might have */
    if (ioctl (raw_socket, SIOCGIFFLAGS, &ifr) == -1)
    {
        perror ("Error: Could not retrive the flags from the device.\n");
        exit (1);
    }

    /* Set the old flags plus the IFF_PROMISC flag */
    ifr.ifr_flags |= IFF_PROMISC;
    if (ioctl (raw_socket, SIOCSIFFLAGS, &ifr) == -1)
    {
        perror ("Error: Could not set flag IFF_PROMISC");
        exit (1);
    }
    printf ("Entering promiscuous mode\n");

    /* Configure the device */

    if (ioctl (raw_socket, SIOCGIFINDEX, &ifr) < 0)
    {
        perror ("Error: Error getting the device index.\n");
        exit (1);
    }

    return raw_socket;
}

然后,当你有你的插槽,你可以只使用选择,他们到达处理数据包。



Answer 3:

您可以使用PCAP库(见http://www.tcpdump.org/pcap.htm ),它也使用tcpdump和Wireshark的。



Answer 4:

你为什么不使用类似的是Wireshark ?

它是开源的,所以至少你可以从中学到一些东西,如果你不想只是使用它。



Answer 5:

是Wireshark Linux上具有捕获的PLCP(物理层会聚协议)报头信息的能力。



文章来源: Reading from a promiscuous network device