gpt4 book ai didi

linux - 使用 netfilter 队列时包头的格式是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:35 37 4
gpt4 key购买 nike

我在 Ubuntu 14.10 上使用 netfilter 队列。到目前为止一切正常,我看到了数据包并设置了判断,但我想更好地了解我从队列中读取的内容。

从此page开始.

这是有问题的代码:

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

在他们有 printf() 的地方,究竟从 fd 中读取了什么?我假设它是在某种特定于 netfilter 的 header 之前的数据包,但我不知道该 header 是什么。我正在查看正在读取的字节转储,但在其中的任何地方都没有看到有效的 L2、L3 或 L4。

请注意,根据文档,我确实使用以下行将队列设置为复制模式:

nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff);

最佳答案

看起来 netfilter 队列返回 L3+。没有L2。当回调运行时——由 nfq_handle_packet() 调用-- 我看到的是 58 个字节的 (不是 L2),后跟 L3。

“缺失的”L2 中的以太网类型可以通过以下方式获得:

struct nfqnl_msg_packet_hdr *ph = nfq_get_msg_packet_hdr(nfad);
const uint32_t id = ntohl(ph->packet_id);
const uint16_t ethertype = ntohs(ph->hw_protocol);

然后通过以下方式获得L3:

uint8_t *payload_data = nullptr;
const int payload_len = nfq_get_payload(nfad, &payload_data);

如果需要,可以通过调用 nfq_get_packet_hw() 获得来自 L2 的源 MAC 地址.

关于linux - 使用 netfilter 队列时包头的格式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27979224/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com