如何使用pcap捕获来自多个接口的流量

问题描述 投票:4回答:4

为了使用pcap从多个接口嗅探,我将执行以下操作(以伪代码方式:]

foreach interface:
    open a file descriptor using pcap_open_live()
    set the file descriptor to non-blocking

while true:
    check for a ready file descriptor using select() or an equivalent I/O multiplexer
    read data from every ready file descriptor using pcap_dispatch()
    handle EndOfStream or Errors and break out of loop if needed

这是否足够或是否有一些需要特别注意的注意事项?

c linux interface pcap
4个回答
2
投票
这里是一个小的C程序片段,可用于使用PCAP库以网络中的混杂(隐身)模式捕获(嗅探)网络数据包。

#include <stdio.h> #include <stdlib.h> #include <pcap.h> /* GIMME a libpcap plz! */ #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> void callback(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char* packet) { static int count = 1; printf("\nPacket number [%d], length of this packet is: %d\n", count++, pkthdr->len); } void pktinit(char *dev) /*function: for individual interface packet capturing*/ { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t* descr; struct bpf_program fp; /* to hold compiled program */ bpf_u_int32 pMask; /* subnet mask */ bpf_u_int32 pNet; /* ip address*/ pcap_if_t *alldevs, *d; char dev_buff[64] = {0}; int i =0; pcap_lookupnet(dev, &pNet, &pMask, errbuf); descr = pcap_open_live(dev, BUFSIZ, 0,-1, errbuf); if(descr == NULL) { printf("pcap_open_live() failed due to [%s]\n", errbuf); return -1; } return 0; } int main(int argc, char **argv) { int pid,i; if(argc < 2) /*command <eth0> [eth1]...*/ { fprintf(strerr,"command needs ethernet name") return 0; } for(i = 1; i < argc; i++) { if((pid=fork()) != -1) { pktinit(argv[i]) } else { fprintf(stderr,"pacp failed for: %s\n", argv[i]); } } return 0; }

gcc file.c -lpcap

./ file eth0 eth1 wlan0


1
投票
我在尝试使用pcap从特定接口捕获时遇到了一些问题,并在此处询问有关问题。似乎很少有人熟悉pcap。我的问题以及我最后指出非常有用的细节的答案都可以在下面的链接中找到,您可能会觉得有用:

Confused by libcap (pcap) and wireless


0
投票
pcap_open_live(3)的手册页说:

pcap_open_live()用于获取要查看的数据包捕获句柄网络上的数据包。设备是指定网络的字符串打开设备在具有2.2或更高版本内核的Linux系统上,参数“ any”或NULL可用于捕获所有数据包接口。

答案在最后一行。

因此,请在"any"调用的NULL参数中使用devicepcap_open_live()从所有接口捕获。


-1
投票
要从多个网络接口捕获数据包,您需要调用fork()新的子进程,然后依次执行pcap_lookupnet()pcap_open_live()

注:您不能使用线程代替为每个网络接口创建子进程。

© www.soinside.com 2019 - 2024. All rights reserved.