Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C insmod:错误:无法插入模块内核。ko:参数无效-与内核模块命名方案相关的错误_C_Linux Kernel_Netfilter - Fatal编程技术网

C insmod:错误:无法插入模块内核。ko:参数无效-与内核模块命名方案相关的错误

C insmod:错误:无法插入模块内核。ko:参数无效-与内核模块命名方案相关的错误,c,linux-kernel,netfilter,C,Linux Kernel,Netfilter,我正在使用C创建一个自定义内核模块,以便在我的Ubuntu设备上挂接netfilter操作。但是,围绕module_param参数,我遇到了一个问题。在插入模块时,我试图添加一个自定义字段,特别是在指定时,这将删除ICMP通信量。使用标准的make文件,代码可以很好地编译,但是当使用insmod插入它时,我得到了错误 insmod: ERROR: could not insert module kernel.ko: Invalid parameters 我正在使用命令 insmod kerne

我正在使用C创建一个自定义内核模块,以便在我的Ubuntu设备上挂接netfilter操作。但是,围绕module_param参数,我遇到了一个问题。在插入模块时,我试图添加一个自定义字段,特别是在指定时,这将删除ICMP通信量。使用标准的make文件,代码可以很好地编译,但是当使用insmod插入它时,我得到了错误

insmod: ERROR: could not insert module kernel.ko: Invalid parameters
我正在使用命令

insmod kernel.ko dropicmp=1
从我所读到的内容来看,这应该适用于module params参数,但我尝试过的任何方法都无法解决这一问题

请在下面找到我的代码

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/ip.h>
#include <linux/tcp.h>

static struct nf_hook_ops nfho;
struct iphdr *iph;
struct tcphdr *tcp_header;
struct sk_buff *sock_buff;
unsigned int sport, dport;

// command line argument | called using insmod kernel_firewall.ko drop_icmp=1 
static int dropicmp = 1;

module_param(dropicmp, int , 0); // takes in an int from command line | (name, variable, permissions)

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 *)){

    sock_buff = skb;

    if (!sock_buff) { // if there is no socket buffer, accept
        return NF_ACCEPT;
    }

    iph = (struct iphdr *)skb_network_header(sock_buff); // using the socket buffer, create our ip header structure out of packets in it

    if (!iph) {
        printk(KERN_INFO "no ip header, dropping\n"); // self explanatory
        return NF_DROP;
    }

    if(iph->protocol==IPPROTO_TCP) {
        if(iph->saddr | 0x11000000){ // if the first prefix is in the 192 range | might need to change the if statement up | considering sprintf
            printk(KERN_INFO "192 subnet detected, dropping\n");
            return NF_DROP;
        }
        else{
            return NF_ACCEPT;
        }
    }

    if(iph->protocol==IPPROTO_ICMP) { // if ICMP

        if(dropicmp == 1){
            return NF_DROP; // drop our ICMP traffic if required
        }
        else{
            return NF_ACCEPT;
        }
    }

    return NF_ACCEPT; // default to accept

}

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

// rmmod 
static void __exit teardown(void) {
    nf_unregister_hook(&nfho);
}

module_init(initialize);
module_exit(teardown);
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
静态结构nf_hook_ops nfho;
结构iphdr*iph;
结构tcphdr*tcp_头;
结构sk_buff*sock_buff;
未签名的int sport,dport;
//命令行参数|使用insmod kernel_firewall.ko drop_icmp=1调用
静态int-dropicmp=1;
模块参数(dropicmp,int,0);//从命令行|接收int(名称、变量、权限)
unsigned int hook_func(unsigned int hooknum,
结构sk_buff**skb,
const struct net_device*in,
const结构网络设备*out,
int(*okfn)(结构sk_buff*)){
sock_buff=skb;
如果(!sock_buff){//如果没有套接字缓冲区,则接受
返回NF_接受;
}
iph=(struct iphdr*)skb_network_header(sock_buff);//使用套接字缓冲区,用其中的数据包创建我们的ip头结构
如果(!iph){
printk(KERN_INFO“无ip头,正在删除”;//不言自明
返回NF_滴;
}
如果(iph->协议==IPPROTO_TCP){
if(iph->saddr | 0x11000000){//如果第一个前缀在192范围内|可能需要将if语句更改为up |考虑到sprintf
printk(KERN_INFO“192子网检测到,正在删除\n”);
返回NF_滴;
}
否则{
返回NF_接受;
}
}
if(iph->protocol==IPPROTO_ICMP){//if ICMP
如果(dropicmp==1){
return NF_DROP;//如果需要,删除我们的ICMP通信
}
否则{
返回NF_接受;
}
}
返回NF_ACCEPT;//默认为接受
}
//初始化
静态整型初始化(无效){
nfho.hook=hook_func;
nfho.hooknum=NF\u INET\u POST\u路由;
nfho.pf=pf_INET;
nfho.priority=NF_IP_PRI_FIRST;
nf_寄存器_挂钩(&nfho);
返回0;
}
//rmmod
静态无效\u退出拆卸(无效){
nf_取消注册_挂钩(&nfho);
}
模块初始化(初始化);
模块退出(拆卸);

这都是因为我愚蠢的命名方案。。。我将模块命名为内核。。。这显然已经被内核使用了。。。。。。所以不要这样做…

这个错误的原因几乎总是你编译模块的内核不是你试图加载它的内核。嗯,你能再扩展一下吗?我以前在没有模块参数的情况下成功地编译和加载了它,并且它工作了,只是在我添加模块参数时才停止。啊,好吧,它在没有模块参数的情况下工作了吗?它是否在代码中加载modparam,但不在insmod命令行中指定参数?此外,在您的评论中,您声明了drop_icmp,但在其他情况下,您使用dropicmp,您在这里混淆了什么吗?@Crumblez尝试将模块_param()的权限字段从0更改为0444。关于堆栈溢出,我们倾向于提出一个对未来访问者有用的问题。由于您发现
模块_参数
与您的实际问题无关,您能否删除问题帖子并删除这些不必要的部分?理想情况下,它应该是一个反映确切问题的函数(将模块命名为
内核
)。