我在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);
答案 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地址。