【问题标题】:Where did Wireshark/tcpdump/libpcap intercept packet inside Linux kernel?Wireshark/tcpdump/libpcap 在哪里截获 Linux 内核中的数据包?
【发布时间】:2016-06-14 04:09:53
【问题描述】:

根据this,wireshark 能够在数据包被丢弃之前获取数据包(因此我无法自己获取此类数据包)。而且我仍然想知道 linux 内核中wireshark 获取数据包的确切位置。

答案是“在 UN*Xes 上,它使用 libpcap,而在 Linux 上,它使用 AF_PACKET 套接字。”有没有人有更具体的例子来使用“AF_PACKET 套接字”?如果我正确理解wireshark,网络接口卡(NIC)将复制所有传入的数据包并将其发送到用户定义的过滤器(伯克利数据包过滤器)。但这是在哪里发生的?还是我的理解有误,我在这里错过了什么?

提前致谢!

【问题讨论】:

    标签: linux networking linux-kernel wireshark


    【解决方案1】:

    但这发生在哪里呢?

    如果我理解正确 - 你想知道,这样的套接字在哪里初始化。
    pcap_createfunction,它试图确定源接口的类型,创建它的副本并激活它。
    网络见pcap_create_interface function => pcap_create_common function => pcap_activate_linux function.
    所有初始化都发生在pcap_activate_linux => activate_new function => iface_bind function
    (使用handlep->device = strdup(device);复制设备描述符,
    使用socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL)) 创建套接字,
    使用bind(fd, (struct sockaddr *) &sll, sizeof(sll)) 将套接字绑定到设备。
    有关更多详细信息,请阅读上述函数的源文件中的 cmets - 它们非常详细。
    初始化后,所有工作都发生在一组functions中,例如pcap_read_linux等。

    【讨论】:

    • 非常感谢!!!这确实是我想要的。还有一个问题,考虑到这一点,我觉得 libpcap 对内核的东西没有任何作用,它是一个纯粹的用户空间程序。它试图拥有另一个套接字实例并监听它,拥有所有数据包的副本。我对这些理解是否正确?
    • “我觉得 libpcap 与内核无关,是一个纯粹的用户空间程序。” libpcap 是一个用户空间库,但我不确定它“与内核无关”。我已经简要地查看了网络(主要是以太网)捕获,但有 USB、蓝牙等。您需要检查自己的代码以查找您感兴趣的案例。“它尝试拥有另一个套接字实例并监听它,有所有数据包的副本。”是的,网络(主要是以太网)捕获似乎以这种方式工作。
    • 我知道这是一个旧线程。只是把我的理解放在这里,这样它可以帮助别人。对于内核的东西,你可以查看这篇很长的帖子。但它提到了 tcpdump 如何为 tx 端获取数据包。 (Rx 端不同)blog.packagecloud.io/eng/2017/02/06/… 简而言之,对于 tx 端 tcpdump,在内核中搜索以下代码: if (!list_empty(&ptype_all)) dev_queue_xmit_nit(skb, dev); tcpdump 将满足 type_all 检查。
    【解决方案2】:

    在 Linux 上,您应该能够简单地使用 tcpdump(它利用 libpcap 库)来执行此操作。这可以通过文件或 STDOUT 来完成,您可以在 tcpdump 命令末尾指定过滤器。

    【讨论】:

    • 嗯...但是找到数据包后,我还需要对它做一些事情(例如,丢弃它,修改数据等),tcpdump可能无法完成如此复杂的任务。
    • 不,它不能。但是,您可以使用 iptables 的 mangle table 或任何 firewalld 等效项来执行其中的一些操作。如果您正在构建更健壮的代码,那么您可以看到它使用了哪些内核挂钩。您可以在修改后使用tcpreplay 重播数据包,但仅限于 UDP 或单个 TCP 流。
    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2015-01-19
    • 2015-05-05
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多