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

时间:2015-10-17 14:00:52

标签: c++ c linux network-programming netfilter

我想封装UDP中的所有流量。我已经可以捕获它并向前发送。但现在我想做封装。对于此任务,我需要以原始形式获取完整数据包。但是我怎么能这样做呢?我的代码是

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

我应该在回调中执行此操作吗?如果是这样,那怎么样?或者我可以在我的回调中设置NF_DROP,并在循环时使用 buf rev 来自? 我只能从netfilter找到函数来获取有效载荷,dst,src等,但不能找到原始形式的数据包。或者我可以以某种方式将nfq_data重新解释为char *?

1 个答案:

答案 0 :(得分:1)

您确实希望在回调中执行此操作。您将需要调用nfq_get_payload,它将为您提供指向数据包的全部内容的指针,包括IP和UDP标头。根据您将如何封装数据包,您可以使用指向新数据包数据的指针调用nfq_set_verdict,或者使用NF_DROP丢弃数据包,然后通过原始套接字或类似内容重新注入新封装的数据包。