netfilter队列的数量

时间:2013-03-13 15:36:22

标签: c unix network-programming netfilter

我正在使用netfilter的钩子编写一些内核模块。钩子函数:

uint main_hook(uint hooknum,
                  struct sk_buff *skb,
                  const struct net_device *in,
                  const struct net_device *out,
                  int (*okfn)(struct sk_buff *)  )
{
    struct iphdr *ip;
    struct udphdr *udp;
    if (skb->protocol == htons(ETH_P_IP)){
        ip = (struct iphdr *)skb->data;//skb_network_header(skb);
        if (ip->version == 4 && ip->protocol == IPPROTO_UDP){
            udp = (struct udphdr *)(skb->data + sizeof(struct iphdr));
            printk("[udp-catch] packet from %d to %d\n", ntohs(udp->source), ntohs(udp->dest));
            return NF_QUEUE;
        }
    }
    return NF_ACCEPT;
}

我可以指定一些队列吗?如果没有,那我怎么能找到这个号码呢?

1 个答案:

答案 0 :(得分:1)

libnetfilter_queue和ip table

来自libnetfilter_queue网页的功能文档:

create_queue()

创建队列时,num的默认值为0。

如果你在同一台机器上运行两个队列,比如一个队列发送IP数据包而另一个队列接收,你需要创建两个不同号码的队列:

发送

qh = nfq_create_queue(h,  0, &cb, NULL);

<强>得到:

qh = nfq_create_queue(h,  1, &cb, NULL);

要正确过滤IP表,您应指定netfilter队列号:

<强>发件人:

sudo iptables -A OUTPUT -p all -d <dest ip> -j NFQUEUE --queue-num 0

<强>接收器:

sudo iptables -A INPUT -p all -s <src ip> -d <dest ip> -j NFQUEUE --queue-num 1

您还可以查看iptables手册并搜索NFQUEUE。

希望这有所帮助。