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

Get packet in a raw form with netfilter

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

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

我应该在回调中这样做吗?如果是这样,那又如何呢?或者我可以在我的回调中设置 NF_DROP,然后使用 bufrev 来自 while 环形? 我只能从 netfilter 中找到函数来获取有效载荷、dst、src 等,但不能找到原始形式的数据包。或者我可以以某种方式将 nfq_data 重新解释为 char*?

您确实希望在回调中执行此操作。你会想要调用 nfq_get_payload,它会给你一个指向数据包全部内容的指针,包括 IP 和 UDP headers。根据封装数据包的方式,您可以使用指向新数据包数据的指针调用 nfq_set_verdict 或使用 NF_DROP 丢弃数据包,然后通过原始套接字或类似方式重新注入新封装的数据包.