本人大學生,最近在研究arp防火牆,想實現主機攔截從本機出去發送的所有數據包,獲取其源mac地址,以防止主機欺騙.在網上大量調研後采用了netfilter鉤子來實現截獲數據包,但是在加載內核模塊時出現了問題.因為之前沒有接觸過網絡和內核,只能在幾天的時間裡自學了一下.所以問題比較多.現在貼出我的程序和makefile文件請大神幫忙解答!!小弟感謝不盡,這次開發對我真的很重要哈,但畢竟本人能力有限,先謝謝大家了!
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//static char *in_dev="eth0";
//MOUDLE_PARM(in_dev,"s");
static struct nf_hook_ops nfho;
//module_init(pack_init);
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 *))
{
// struct sk_buff *nskb;//mac地址通過網上給的方法無法獲取,所以直接執行DROP
// struct ethhdr *eth;
// nskb=*skb;
// eth=(struct ethhdr*)(nskb->mac.raw);
// printk("src mac:");
// printk("%02x",eth_hdr->h_source);
// printk("\n");
// switch(mac)
// {
// case 111111111111 :
return NF_DROP;
// default:
// return NF_DROP;
// }
}
int init_hook(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;
}
void cleanup_module()
{
nf_unregister_hook(&nfho);
}
makefile:
obj-m :=hook.o
KERNELDIR :=/lib/modules/uname -r
/build
PWD :=$(shell pwd)
default:
make -C ${KERNELDIR} M=${PWD} modules
clean:
rm -f .o *.ko *.mod.c *.mod.o modules. Module.*
現在有三個問題:
1、模塊加載成功後沒有實現DROP的效果,主機還是可以上網。
2、模塊無法卸載。執行一次rmmod顯示殺死成功,但是還是可以grep到。
3、網上的方法已經無法實現獲取數據包源mac地址,因為後來內核中取消了ethhdr結構體。求解決辦法。
參考
http://blog.chinaunix.net/uid-23390992-id-3030079.html