代码之家  ›  专栏  ›  技术社区  ›  Aidan Steele

使用libnetfilter队列动态重写网络数据包

  •  6
  • Aidan Steele  · 技术社区  · 15 年前

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

    经过大量的google搜索,在我看来,最简单(但相当健壮)的方法(在任何平台上)是Linux的 libnetfilter_queue 项目。但是,我很难找到项目的任何合理文档,除了有限的 official 文档。它的主要特点(如第一个链接所述)

    • 从内核nfnetlink_队列子系统接收排队的数据包
    • 作出裁决和/或 回注更改的数据包 到内核nfnetlink_队列子系统

    重点是我自己。我到底该怎么做?我试过修改 sample 代码提供了,但也许我是误会了什么。代码正在运行 NFQNL_COPY_PACKET 模式,所以我 接收整个数据包——但我对它的修改似乎仅限于我自己的应用程序——正如人们所料,给定了“copy”语义。

    我的感觉是我注定要利用 NF_QUEUE 不知怎么的,但我还没完全摸索出来。有什么线索吗?

    (如果有一个更简单的机制,也就是跨平台的机制,我很想听听!)

    2 回复  |  直到 15 年前
        1
  •  12
  •   Aidan Steele    15 年前

    我不敢相信我之前错过了这个。尽管我不愿在上面发问,但我想我永远也不会自己解决这个问题。:)

    我没有正确地查看函数原型。结果在“裁决”功能(概述如下)中,

    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 包并将经过适当修改的包传递回内核。

        2
  •  0
  •   ephemient    15 年前

    从挖掘源代码中得到一个粗略的猜测:尝试使用 nfnl_addattr_l(…, NFQA_PAYLOAD, …) ?

    推荐文章