使用netfilter队列时数据包标头的格式是什么?

时间:2015-01-16 07:37:08

标签: linux iptables netfilter

我在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的标头之前的数据包,但我不知道该标头是什么。我正在查看我正在阅读的字节转储,但我没有在那里看到有效的L2,L3和L4。

请注意,根据文档,我使用此行在复制模式下设置了队列:

nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff);

1 个答案:

答案 0 :(得分:0)

看起来netfilter队列返回L3 +。没有L2。当回调正在运行时 - 由nfq_handle_packet()调用 - 我所看到的是58字节< something> (不是L2)接着是L3。

来自“缺失”L2的ethertype可以使用:

获得
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地址。