我使用C创建一个自定义内核模块,以挂钩到我的Ubuntu盒子上的netfilter操作。但是,我遇到了围绕module_param参数的问题。插入模块时,我尝试添加自定义字段,特别是在指定时会丢弃ICMP流量。代码使用标准的make文件编译得很好但是当使用insmod插入它时,我得到了错误
insmod: ERROR: could not insert module kernel.ko: Invalid parameters
我正在使用命令
insmod kernel.ko dropicmp=1
从我读过的内容来看,这应该与模块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);
答案 0 :(得分:0)
这完全归功于我愚蠢的命名方案......我将模块内核命名为......内核显然已经使用了......所以不要这样做...... < / p>