使用libnetfilter_queue动态重写网络数据包

Sed*_*ien 6 networking netfilter rewriting

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

经过大量的谷歌搜索,在我看来,这样做(在任何平台上)最简单(但相当合理)的方法是Linux的libnetfilter_queue项目.但是,在有限的官方文档之外,我无法找到项目的任何合理文档.它的主要特征(如第一个链接所述)

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

重点是我自己的.我的意思到底是怎么回事?我已经尝试修改提供的示例代码,但也许我误解了一些东西.该代码在运行NFQNL_COPY_PACKET模式,所以我接收到整个数据包-但我的修改,它似乎被限制在自己的应用程序-正如人们所期望的那样,给予"复制"语义.

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

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

Sed*_*ien 12

我不敢相信我以前错过了这个.由于我对SO的问题保持沉默,我以为我永远不会自己解决这个问题.:)

我没有正确看待函数原型.事实证明,"判决"功能(如下所述),

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     
)
Run Code Online (Sandbox Code Playgroud)

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

关键是NF_ACCEPT数据包并将适当修改的数据包传递回内核.