【问题标题】:What is the format of the packet header when using netfilter queues?使用 netfilter 队列时数据包头的格式是什么?
【发布时间】:2015-01-16 07:37:07
【问题描述】:

我在 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);

【问题讨论】:

    标签: linux iptables netfilter


    【解决方案1】:

    看起来 netfilter queues 返回 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 地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2011-08-05
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      相关资源
      最近更新 更多