1

我正在用 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;
}

我可以指定队列的数量吗?如果没有,我怎么能找到这个号码?

4

1 回答 1

1

libnetfilter_queue 和 ip 表

来自 libnetfilter_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。

希望这会有所帮助。

于 2013-09-04T10:36:19.990 回答