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

时间:2010-11-26 06:39:26

标签: networking netfilter rewriting

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

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

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

重点是我自己的。我的意思到底是怎么回事?我已经尝试修改了提供的sample代码,但也许我误解了一些东西。代码在NFQNL_COPY_PACKET模式下运行,所以我接收整个数据包 - 但我对它的修改似乎仅限于我自己的应用程序 - 正如人们所预料的那样,给定“复制”语义。

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

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

2 个答案:

答案 0 :(得分: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     
)

最后两个参数是将数据返回到网络堆栈。后见之明显而易见,但我完全错过了它,因为print_pkt函数没有将数据包数据作为参数,而是从struct nfq_data中提取它。

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

答案 1 :(得分:0)

只是在挖掘源代码时疯狂猜测:尝试使用nfnl_addattr_l(…, NFQA_PAYLOAD, …)明确添加损坏的有效负载?