我正在尝试编写一个用户空间应用程序,它可以连接到操作系统的网络堆栈,嗅探飞过的数据包并编辑它感兴趣的数据包。
经过多次谷歌搜索,在我看来,这样做的最简单(但相当健壮)的方法(在任何平台上)是 Linux 的 libnetfilter_queue
项目。但是,除了有限的 official 文档之外,我无法为该项目找到任何合理的文档。它的主要特点(如第一个链接所述)
重点是我自己。我到底是怎么想的?我试过修改提供的 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/