Netfilter钩子获取接口名称

时间:2018-08-28 12:29:13

标签: linux-kernel hook kernel-module netfilter

我试图在我写的netfilter钩子中获取in / out的net_device名称。

在阅读了以下问答之后,NetFilterHook: Displaly Interface Name,我尝试按照说明进行打印,但是它不起作用。

每次我尝试打印IN接口的名称时我得到一个全零的字符数组(空白字符串)。 每次我尝试打印OUT接口的名称计算机卡住时,好像驱动程序中存在分段错误。

如果我取消打印线-驱动程序工作正常。

//Filename: hello-netfilter.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>

static struct nf_hook_ops nfho;

unsigned int hook_func(unsigned int hooknum,
                       struct sk_buff **skb,
                       const struct net_device *in,
                       const struct net_device *out,
                       int (*okfn)(struct sk_buff *)) {

        printk(KERN_INFO "Packet!\n"); 

        if (in != NULL && in->name != NULL)
        {
                    printk(KERN_INFO "net_device in name: %s\n", in->name);
        }

        if (out != NULL && out->name != NULL)
        {
                    printk(KERN_INFO "net_device out name: %s\n", out->name);
        }

        return NF_ACCEPT; 
}

static int __init initialize(void) {
        nfho.hook     = hook_func; //Points to our hook function.
        nfho.hooknum  = NF_INET_PRE_ROUTING; 
        nfho.pf       = PF_INET; 
        nfho.priority = NF_IP_PRI_FIRST; 
        nf_register_hook(&nfho); 
        return 0;
}

static void __exit cleanup(void) {
        nf_unregister_hook(&nfho);
}

module_init(initialize);
module_exit(cleanup);

我尝试从两个字符数组打印每个字符-IN数组全为0,OUT使计算机再次卡住。

0 个答案:

没有答案