2015-10-17 67 views
0

我想將所有通信封裝在UDP中。我已經可以捕獲併發送了。但是現在我想要封裝。爲了這個任務,我需要以原始格式獲得完整的數據包。但我該怎麼做?我的代碼是使用netfilter以原始格式獲取數據包

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

我應該在回調中做這個嗎?如果是這樣,那麼怎麼樣?或者我可以在我的回撥中只設置NF_DROP,並使用bufrev from while loop? 我只能從netfilter中找到函數來獲取有效載荷,dst,src等,但不是原始格式的數據包。或者我可以重新解釋nfq_data char *?

+1

你會在這裏找到一個輕量級的TCP/IP庫,在doc文件夾的rawapi.txt中有一個有趣的文檔,我認爲它會幫助你,我不知道你使用的女巫原始tcp/ip庫。鏈接:http://savannah.nongnu.org/projects/lwip/ – HDJEMAI

回答

1

你確實想在你的回調中做到這一點。您將需要調用nfq_get_payload,它會爲您提供一個指向包含IP和UDP標頭的全部內容的指針。根據封裝數據包的方式,您可以使用指向新數據包數據的指針調用nfq_set_verdict,或使用NF_DROP丟棄數據包,然後通過原始套接字或類似的東西重新注入新封裝的數據包。

+0

謝謝!我只是認爲nfq_get_payload只返回有效負載(只是沒有IP頭的ip包有效負載等),而不是整個數據包。 ps:對於offtopic抱歉,但你有一些有用的鏈接到libnetfilter手冊?在我看來,官方的doxygen文檔並不全面。 – user2123079

+0

我誠實地從Doxygen和libnetfilter_queue代碼本身獲得大部分我需要的東西。我還沒有處理過原始的libnetfilter/libnetlink。 –