在Ubuntu 18.04中未调用Netfilter挂钩-内核4.18

时间:2019-06-04 21:54:30

标签: ubuntu hook icmp netfilter

我正在尝试创建一个仅捕获ICMP数据包的netfilter挂钩。我一辈子都无法弄清楚自己在做什么错(我是编写内核模块的新手)。我到目前为止的代码是

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/skbuff.h>
#include <linux/udp.h>
#include <linux/icmp.h>
#include <linux/ip.h>
#include <linux/inet.h>

#define DIP "1.2.3.4"

static struct nf_hook_ops nfho;
static struct net n;

MODULE_DESCRIPTION("Monitor packets");
MODULE_AUTHOR("john");
MODULE_LICENSE("GPL");

unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
    printk(KERN_INFO "hook!\n");
    return NF_ACCEPT;
}

int init_module()
{
    int ret;
    nfho.hook = hook_func;
    nfho.hooknum = NF_INET_PRE_ROUTING; 
    nfho.pf = AF_INET;
    nfho.priority = NF_IP_PRI_FIRST;

    ret = nf_register_net_hook(&n, &nfho);

    if (ret != 0)
    {
        printk(KERN_INFO "module is NOT loaded into the kernel\n");    
        return -1;    
    }
    else
    {
        printk(KERN_INFO "module IS loaded into the kernel\n");      
        return 0;  
    }
}

void cleanup_module()
{
    nf_unregister_net_hook(&n, &nfho);
    printk(KERN_INFO "module has been unloaded\n");  
}

在我的系统日志中,看来内核模块已正确加载/卸载(从打印消息中)。我没有收到“钩子”! ping我的机器时出现提示信息。它是错误的pf吗?错误的挂接优先级?我可以以某种方式调试它吗?

应该说我在虚拟机中,并且正在从不是主机的另一台物理机ping虚拟机。我的操作系统是Ubuntu 18.04 LTS,结果为``uname -a'':Linux ubuntu 4.18.0-20-generic#21〜18.04.1-Ubuntu SMP Wed May 8 08:43:37 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux < / p>

我知道有一些未使用的包含。这是从另一个内核版本的代码示例改编而成的,我计划稍后再填写。我真的希望有人能给我一个从哪里开始寻找的想法,或者看看我做错了什么。

谢谢大家

1 个答案:

答案 0 :(得分:0)

似乎缺少LKM进入/退出点:

{{1}}