- 论坛徽章:
- 0
|
内核版本号:3.13.0-43
#define arp_hrd ea_hdr.ar_hrd
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/netfilter.h>
#include<linux/netfilter_ipv4.h>
#include<linux/ip.h>
#include<net/ip.h>
#include<linux/udp.h>
#include<linux/in.h>
#include<linux/skbuff.h>
#include<linux/netdevice.h>
#include<linux/if_ether.h>
#include<linux/if.h>
#include<linux/if_arp.h>
#include<linux/netfilter_arp.h>
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 arphdr *arp;//定义ARP包结构体
unsigned char *sha,*arp_ptr;
char buf[20];
arp=arp_hdr(skb);//获取数据包ARP头
arp_ptr=(unsigned char*)(arp+1);
//指针偏移找到数据包源MAC地址
sha=arp_ptr;
sprintf(buf,"%02x:%02x:%02x:%02x:%02x:%02x",sha[0],sha[1],sha[2],sha[3],sha[4],sha[5]);
if(strcmp(buf,"dc:0e:a1:e8:94:d6")==0)
{
printk("MATCH!\n");
return NF_ACCEPT;
//若数据包源MAC地址与本机MAC一致则通过
}
else
{
printk("UNMATCH!\n");
//若数据包源MAC地址与本机MAC地址不一致,则丢弃该数据包
return NF_DROP;
}
}
static struct nf_hook_ops nfho={
.hook=hook_func,//注册功能函数
.pf=NFPROTO_ARP,//协议规则
.hooknum=NF_ARP_OUT,//挂载点
.priority=NF_IP_PRI_FIRST,//处理优先级
.owner=THIS_MODULE,//指定模块
};
static int __init hook_init(void)//注册模块
{
if (nf_register_hook(&nfho)) {
printk(KERN_ERR"<0>nf_register_hook() failed\n");
return -1;
}
return 0;
}
static void __exit hook_fini(void)//注销模块
{
nf_unregister_hook(&nfho);
}
module_init(hook_init);
module_exit(hook_fini);
MODULE_LICENSE("GPL");
这个钩子对于自己编写ARP发包程序发出去的ARP包不起作用,不明白为什么?请您指教!
回复 4# tc1989tc
|
|