NFQ演示:为什么我所有的netfilter示例都不起作用?
在Suricata中,它使用NFQ来实现其IPS(入侵保护服务)功能,但在我的情况下,NFQ并没有按预期工作(我的内核是3.11),我编写了一个简化的演示来测试NFQ功能:NFQ演示:为什么我所有的netfilter示例都不起作用?,netfilter,Netfilter,在Suricata中,它使用NFQ来实现其IPS(入侵保护服务)功能,但在我的情况下,NFQ并没有按预期工作(我的内核是3.11),我编写了一个简化的演示来测试NFQ功能: #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> /* timeval */ #include <arpa/inet.h> #inc
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h> /* timeval */
#include <arpa/inet.h>
#include <linux/netfilter.h>
#include <libnetfilter_queue/libnetfilter_queue.h>
#define NFQ_NUM 4
#define QUEUE_MAXLEN 4096
static int nfq_cb(struct nfq_q_handle *qh, struct nfgenmsg *msg, struct nfq_data *nfa, void *data) {
return 0;
}
int nfq_demo(void) {
struct nfq_handle *h = nfq_open();
if (!h) {
return -1;
}
/* here, failed on nfq_unbind_pf */
if (nfq_unbind_pf(h, AF_INET) < 0) {
printf("nfq_unbind_pf failed\n");
return -1;
}
if (nfq_unbind_pf(h, AF_INET6) < 0) {
printf("nfq_unbind_pf failed\n");
return -1;
}
if (nfq_bind_pf(h, AF_INET) < 0) {
printf("nfq_bind_pf failed\n");
return -1;
}
if (nfq_bind_pf(h, AF_INET6) < 0) {
printf("nfq_bind_pf failed\n");
return -1;
}
/* if comment above bind/unbind, the create fail too */
struct nfq_q_handle *qh = nfq_create_queue(h, NFQ_NUM, nfq_cb, NULL);
if (!qh) {
printf("nfq_create_queue failed\n");
return -1;
}
/* ... */
}
int main() {
nfq_demo();
return 0;
}
我检查了/proc/net/netfilter/
,除了nf\u日志之外什么都没有:
0 NONE ()
1 NONE ()
2 NONE ()
3 NONE ()
4 NONE ()
5 NONE ()
6 NONE ()
7 NONE ()
8 NONE ()
9 NONE ()
10 NONE ()
11 NONE ()
12 NONE ()
我的NFQ演示有什么问题
第二个问题是,当我调试Suricata时,所有的NFQ设置都工作得很好,当curl google.com
时,会有一个HTTP请求发送到google,但是与NFQ相关的套接字上的调用recv
总是返回-1,并且意味着没有收到任何内容(以及curl
超时),为什么会发生这种情况?获得第一个答案,以root用户身份运行程序,所有NFQ API均按预期工作。获得第一个答案,以root用户身份运行程序,所有NFQ API均按预期工作。获得第一个答案,以root用户身份运行程序,所有NFQ API均按预期工作。获得第一个答案,以root用户身份运行程序,所有NFQAPI都按预期工作
0 NONE ()
1 NONE ()
2 NONE ()
3 NONE ()
4 NONE ()
5 NONE ()
6 NONE ()
7 NONE ()
8 NONE ()
9 NONE ()
10 NONE ()
11 NONE ()
12 NONE ()