我使用libnetfilter_queue
和iptables
以及NFQUEUE
目標將傳入數據包存儲在三個不同隊列中,其中--queue-num x
。用NFQUEUE發送排隊的數據包?
我成功地創建了三個隊列與libnetfilter_queue
功能,綁定他們,聽取他們的意見,並從他們的內容如下:
/* given 'h' as a handler of one of my three queues */
fd = nfq_fd(h);
while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv >= 0) {
nfq_handle_packet(h, buf, rv);
}
回調函數,觸發與nfq_handle_packet
,有nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);
命令,其中它發送數據包儘快處理完畢。 問題是:我不要希望每個數據包立即發送,因爲我需要將它們存儲在自定義結構(下面寫)。
所以我遇到了一個潛在的解決方案:我可能會調用NF_DROP
判決而不是NF_ACCEPT
我想排隊的每個數據包(所以它不會立即發送),將其存儲在我的自定義結構中,然後(更快或後來)根據我的需要重新注入它。
聽起來不錯,但情況是:我不知道如何從我的用戶空間應用程序我的樂趣重新注入排隊的數據包。在我的代碼的同一點再次使用nfq_set_verdict
是正確的,但用NF_ACCEPT
判定?或者我應該打開一個插座(也許是一個原始的)?
這是我的自定義結構
struct List {
int queue;
int pktsize;
unsigned char *buffer;
struct nfq_q_handle *qh;
struct nfqnl_msg_packet_hdr *hdr;
struct List *next;
};
代表抓住上面的規則的數據包。
這些是我的隊列在哪裏存儲數據包。
struct List *List0 = NULL; // low priority
struct List *List1 = NULL; // medium priority
struct List *List2 = NULL; // high priority
我有Ubuntu 14.04 3.13.0-57-generic
。
任何建議,將不勝感激。
我想你只需要簡單地推遲這些數據包的'nfq_set_verdict()'調用,直到你準備好將它們推回堆棧爲止。整個問題是他們在內核中排隊。 AFAIK,你不必立即調用'nfq_set_verdict()'來獲取數據包。您可以將數據包或ID保存在列表中,稍後再調用。 –