我正在尝试编写一个绑定到NFQUEUE套接字的用户空间应用程序,内核模块将转发传入的数据包(通过标记它们为NF_QUEUE)。这是通过使用iptables规则来实现的:
iptables -A INPUT -j NFQUEUE --queue-num 0
iptables ACCEPT链如下所示:
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
NFQUEUE all -- anywhere anywhere NFQUEUE num 0
这是轮询NFQUEUE套接字的代码(QNUM为0):
printf("binding nfnetlink_queue as nf_queue handler for AF_INET\n");
if (nfq_bind_pf(h, AF_INET) < 0)
{
fprintf(stderr, "error during nfq_bind_pf()\n");
return 1;
}
/* Register a callback function for our queue number */
qh = nfq_create_queue(h, QNUM, &cb_func, NULL);
if (!qh)
{
fprintf(stderr, "error during creating nf_queue\n");
return 1;
}
/* See if we have received a packet and send it to our cb func */
fd = nfq_fd(h);
if (fd < 0)
return 1;
#if 1
for (;;)
{
if ((rv = recv(fd, buf, sizeof(buf), 0)) >= 0) {
nfq_handle_packet(h, buf, sizeof(buf)); /* send packet to callback */
continue;
}
}
#endif
问题是/ proc / net / netfilter / nf_queue列出了正在使用的队列号2而不是数字0,因此我的用户空间程序没有检测到相关套接字中的任何传入数据包。那是为什么?
cat /proc/net/netfilter/nf_queue
0 NONE
1 NONE
2 nf_queue
3 NONE
4 NONE
5 NONE
6 NONE
7 NONE
8 NONE
9 NONE
10 NONE
11 NONE
12 NONE
答案 0 :(得分:0)
我明白了。毕竟,我甚至不需要内核模块来执行此操作,只需要iptables规则。问题是规则不是链中的第一个。先用
移动它sudo iptables -I INPUT -j NFQUEUE --queue-num 0
解决了它。
答案 1 :(得分:0)
您可能希望将NFQUEUE调整为仅针对特定端口,否则可能会意外地将自己锁定在系统之外。
例如,NFQUEUE的典型用法是suricata IPS。如果suricata进入故障状态,ssh访问将随之进行。
您可以使用以下IP表规则来定位特定端口:
-A INPUT -p tcp --dport <port> -j NFQUEUE --queue-num 0
-A OUTPUT -p tcp --sport <port> -j NFQUEUE --queue-num 0