我正在尝试编写一个用户空间应用程序,它可以连接到操作系统的网络堆栈,嗅探飞过的数据包并编辑它感兴趣的数据包。

经过多次谷歌搜索,在我看来,这样做的最简单(但相当健壮)的方法(在任何平台上)是 Linux 的 libnetfilter_queue 项目。但是,除了有限的 official 文档之外,我无法为该项目找到任何合理的文档。它的主要特点(如第一个链接所述)

  • 从内核 nfnetlink_queue 子系统接收排队的数据包
  • 发布判决和/或 将更改的数据包 重新注入(inject)内核 nfnetlink_queue 子系统

  • 重点是我自己。我到底是怎么想的?我试过修改提供的 sample 代码,但也许我误解了一些东西。代码在 NFQNL_COPY_PACKET 模式下运行,所以我收到了整个数据包——但我对它的修改似乎仅限于我自己的应用程序——正如人们所期望的,考虑到“复制”语义。

    我的感觉是我打算以某种方式使用 NF_QUEUE,但我还没有完全理解它。任何指针?

    (如果有一个更简单的机制来做到这一点,它也是跨平台的,我很想听听!)

    最佳答案

    我不敢相信我以前错过了这个。尽管我对在 SO 上发布问题保持沉默,但我认为我永远不会自己解决这个问题。 :)

    我没有正确查看函数原型(prototype)。事实证明,在“判决”函数中(如下所述),

    int nfq_set_verdict(struct nfq_q_handle *qh,
        u_int32_t id,
        u_int32_t verdict,
        u_int32_t data_len,
        const unsigned char *buf
    )
    

    最后两个参数用于返回网络堆栈的数据。事后看来很明显,但我完全错过了它,因为 print_pkt 函数没有将数据包数据作为参数,而是从 struct nfq_data 中提取它。

    关键是对数据包进行 NF_ACCEPT 并将适当修改的数据包传递回内核。

    关于networking - 使用 libnetfilter_queue 即时重写网络数据包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4283043/

    10-10 01:08
    查看更多