【问题标题】:Capturing packets on loopback在环回上捕获数据包
【发布时间】:2016-09-05 09:37:35
【问题描述】:

这段代码在 Ubuntu 16.04 上运行良好,并且当我通过环回接口折腾 UDP 字节时打印正确的值 (ETHERTYPE_IP):

#include <pcap.h>
#include <iostream>
#include <net/ethernet.h>

int main(int argc,char **argv)
{
    char errbuf[PCAP_ERRBUF_SIZE];
    auto pcap = pcap_open_live("lo0", BUFSIZ, 0, 1000, errbuf);

    pcap_loop(pcap,0, [] (u_char *self, const struct pcap_pkthdr *header,
                          const u_char *packet) {
        auto eth = (struct ether_header *) packet;
        auto eth_type = ntohs(eth->ether_type);
        std::cout << "eth_type: " << std::hex << eth_type << std::endl;
    }, nullptr);

    return 0;
}

网猫:

➜  ~ nc -uv -l 54321
Listening on [0.0.0.0] (family 0, port 54321)

➜  ~ nc -4u localhost 54321
hello

程序输出:

➜  ~ sudo ./a.out
eth_type: 800

但是在 OS X 10.11.5 上它会打印 eth_type: 4011。有趣的是,它与 en1 适配器配合良好。

为什么环回和非环回适配器之间存在如此大的差异,在两者上捕获数据包的正确方法是什么?

更新: tcpdump 也可以:

➜  ~ sudo tcpdump -i lo0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
15:09:00.160664 IP localhost.54321 > localhost.63543: UDP, length 4

【问题讨论】:

  • 您可能必须使用“lo0”而不是“lo”。要在 Mac 上编译,请尝试:clang++ -std=c++11 -stdlib=libc++ -lpcap test.cpp -o test ...我还得到了 ether_type 的垃圾值。
  • 这是sn-p的错字,确实是lo0。

标签: c++ macos endianness libpcap


【解决方案1】:

由于链接类型不是以太网,因此标头不包含适合 ether_header 的数据。

使用 pcap_open_live 获取句柄后添加此代码以查看链接层标头类型:

if (pcap_datalink(pcap) != DLT_EN10MB) {
    fprintf(stderr, "Device doesn't provide Ethernet headers - link type was %d\n", pcap_datalink(pcap));
    return 1;
}

运行这个表示 lo0 的链接类型值为 0,DLT_NULL。文档指出,这意味着“BSD 环回封装;链路层标头是一个 4 字节字段,按主机字节顺序排列,包含来自 socket.h 的 PF_ 值,用于数据包的网络层协议。”

确实,当我查看 ether_dhost 字段的前 4 个字节时,我看到了值 2,对应于 PF_INET。最后,如果您尝试区分 UDP 数据包,这对您没有多大帮助。

您可以在此处找到更多文档:http://www.tcpdump.org/linktypes.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多