对不起,如果这是一个蹩脚的问题。我是tcpdump和pcap的新手。我正在使用pcap static lib开发和应用程序,它监听指定端口上的TCP数据。我有一个小型原型,它可以在嗅探通过端口80发送的tcp数据包(默认来自HTTP)时运行良好。但是,我想查看进出端口5984的HTTP数据包(这是CouchDB使用的默认端口)。由于某种原因,我的应用程序没有注意到/嗅探/查看此端口上的任何数据包。由于我不是一个经验丰富的网络开发人员,我可能会遗漏一些基本的东西。
我不想在这里粘贴整个应用程序,但我可以添加找到问题所需的任何代码。请告诉我。
这是我的pcap过滤器表达式:
char filter_exp[] = "tcp port 5984";/* The filter expression */
过滤器编译并在pcap会话上设置没有问题。会话设置为以混杂模式运行。
//get a pcap session
//args device, # of packets to capture, promisc mode, timeout, err buff
handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
if (handle == NULL) {
fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf);
return(2);
//compile our filter
if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
return(2);
}
//set the filter
if (pcap_setfilter(handle, &fp) == -1) {
fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
return(2);
}
//begin sniffing packets. cnt -1: keep sniffing until err occurs
//last arg is optional. It can be used to pass additonal information to callback
pcap_loop(handle, -1, got_packet, NULL);
'got_packet'是我的回调函数。使用相同的过滤器多次调用,但使用端口80代替5984。
使用Curl我尝试过:$ curl http://localhost:5984/test
为了它的地狱,我尝试使用环回:$ curl http://127.0.0.1:5984/test
我的pcap应用程序都没有注意到这些。但是,如果我更改我的过滤器以侦听端口80并执行$ curl http://www.google.com
我可以看到数据包通过。我在忽视或不理解什么?
非常感谢!
-Nick
答案 0 :(得分:1)
如果数据包从Mac传输到同一台Mac - 例如,如果您正在与“localhost”或127.0.0.1(这是同一件事 - “localhost”解析为127.0.0.1)进行通信,则捕获在lo0
上,而不在en0
或en1
上。到127.0.0.1的流量不会在任何真实网络上发送,它会在内部循环回到您的计算机,因此您必须查看“环回”网络和“环回”接口。
(类似的答案适用于其他UN * Xes,除了在Linux上,环回接口只调用lo
,而不是lo0
。在Windows上和某些版本的UN *上没有等价物X,例如Solaris 10和更早版本,您无法在环回接口上捕获。)