我正在尝试编写一个可以挂钩到操作系统网络堆栈的用户空间应用程序,嗅探飞过的数据包并编辑它感兴趣的数据包。
经过大量谷歌搜索后,在我看来,最简单(但相当强大)的方法(在任何平台上)都是Linux的libnetfilter_queue
项目。但是,在有限的official文档之外,我无法为项目找到任何合理的文档。它的主要特征(如第一个链接所述)
重点是我自己的。我的意思到底是怎么回事?我已经尝试修改了提供的sample代码,但也许我误解了一些东西。代码在NFQNL_COPY_PACKET
模式下运行,所以我我接收整个数据包 - 但我对它的修改似乎仅限于我自己的应用程序 - 正如人们所预料的那样,给定“复制”语义。
我的感觉是,我打算以某种方式使用NF_QUEUE
,但我还没有完全理解它。有什么指针吗?
(如果有一个更简单的机制,这也是跨平台的,我很乐意听到它!)
答案 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, …)
明确添加损坏的有效负载?