2015-01-16 34 views
1

我在Ubuntu 14.10上使用netfilter隊列。一切工作到目前爲止,我看到數據包並設定了判決結果,但我想更好地瞭解我從隊列中讀取的內容。使用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

貌似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); 

如果需要,從L2的源MAC地址可以是可用致電nfq_get_packet_hw()

相關問題