使用netfilter以原始形式获取数据包

Get packet in a raw form with netfilter

本文关键字:获取 数据包 原始 netfilter 使用      更新时间:2023-10-16

我想用UDP封装所有的流量。我可以捕获它并转发。但现在我想做封装。对于这项任务,我需要以原始形式获得完整的数据包。但我该怎么做呢?我的代码是

while ((rv = recv(fd, buf, sizeof(buf), 0)))
{
        printf("pkt receivedn");
        nfq_handle_packet(h, buf, rv);
}

我应该在回调中这样做吗?如果是,那又是怎么回事?或者我可以在我的回调中设置NF_DROP,并使用bufrev from while循环?我只能从netfilter找到功能来获得有效载荷,dst, src等,但不是原始形式的数据包。或者我可以重新解释nfq_data为char*?

您确实需要在回调中这样做。您将需要调用nfq_get_payload,它将为您提供指向数据包的整个内容的指针,包括IP和UDP标头。根据您将如何封装数据包,您可以使用指向新数据包数据的指针调用nfq_set_verdict,或者使用NF_DROP删除数据包,然后通过原始套接字或类似的方法重新注入新封装的数据包。