Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2236437
  • 博文数量: 292
  • 博客积分: 10016
  • 博客等级: 中将
  • 技术积分: 3381
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-06 11:26
文章分类

全部博文(292)

文章存档

2011年(1)

2010年(4)

2009年(3)

2008年(6)

2007年(47)

2006年(63)

2005年(168)

分类: LINUX

2005-11-09 19:00:39

在netfilter中注册钩子函数即可,一个参考实现

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

//define interface packet coming from
static char *in_dev="eth0";
MODULE_PARM(in_dev,"s");

//capture packet and analyse it
static unsigned int packet_cap(unsigned int hooknum,struct sk_buff **pskb,const struct net_device *in,const struct net_device *out,int (*okfn)(struct sk_buff *))
{
unsigned int ret=NF_ACCEPT;
if(in&&(strcmp(in_dev,in->name)!=0)) goto no_interest;
struct iphdr *iph=(*pskb)->nh.iph;
unsigned int data_len=(*pskb)->len;

void *protoh=(u_int32_t *)iph+iph->ihl;
data_len-=iph->ihl*4;
switch(iph->protocol) {
case IPPROTO_TCP: {
struct tcphdr *tcph=protoh;
/*if((iph->frag_off)&IP_OFFSET)
break;
if(data_lenprintk(" incomplete packet[%u bytes]",data_len);
break;
} */
__u16 sport=ntohs(tcph->source);
if(sport%2==0) ret=NF_DROP;
printk("packet sport=%d ",sport);

break;
}
case IPPROTO_UDP: {
struct udphdr *udph=protoh;
/*if((iph->frag_off)&IP_OFFSET)
break;
if(data_lenprintk(" incomplete packet[%u bytes]",data_len);
break;
} */
__u16 sport=ntohs(udph->source);
if(sport%2==0) ret=NF_DROP;
break;
}
default:
break;
}
no_interest:
return ret;
}

//define one hook function
static struct nf_hook_ops hook_pcap={{NULL,NULL},packet_cap,PF_INET,NF_IP_LOCAL_IN,NF_IP_PRI_FILTER+1};

static int __init init(void)
{
return nf_register_hook(&hook_pcap);
}

static void __exit fini(void)
{
nf_unregister_hook(&hook_pcap);
}

module_init(init);
module_exit(fini);

MODULE_LICENSE("GPL");

阅读(1217) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~