netfilter 防火墙 包过滤 实例

下面这个模块是用来将

 

#include
#include

static struct nf_hook_ops user_hook_ops= {  
{ NULL, NULL },  
user_hookfn, //用户定义的钩子函数 
 PF_INET,  
NF_IP_LOCAL_IN, //挂载点 。对于所有进入本机的数据包
(包括使用网络套接字的IPC),都是在此挂载点完成的过滤工作之后再被交给上层用户进
程。
 NF_IP_PRI_FILTER-1 };  

static unsigned int user_hookfn(unsigned int hooknum, struct sk_buff **skb,
const struct net_device *in, const struct net_device *out,
int (*okfn)(struct sk_buff *))

 return NF_QUEUE;//将数据包送入用户空间
}
int init_module{
 return nf_register_hook(&user_hook_ops );//注册
}
int cleanup_module{
 nf_unregister_hook(&user_hook_ops );//注销
}

//#gcc –O –c –Wall usermodule.c
//#insmod usermodule.o
//#rmmod usermodule.o

//unsigned char buf[BUFSIZE]; //读取数据包用的临时缓存
//struct ipq_handle *h; //访问ip_queue 用的句柄
//unsigned int verdict; //对数据包的判决
//h = ipq_create_handle(0, PF_INET); //创建句柄
//ipq_set_mode(h, IPQ_COPY_PACKET, BUFSIZE); //设置数据拷贝模式
//while(1)
//{
//ipq_read(h, buf, BUFSIZE, 0); //读取消息
//switch (ipq_message_type(buf)) //判断消息类型
//{
//case NLMSG_ERROR: //读取的是出错消息(例如队列满了)
//break;
//case IPQM_PACKET: //读取到数据包,则获取其指针
//ipq_packet_msg_t *m = ipq_get_packet(buf);
//verdict=handle_packet(m); //处理数据包,得到判决值
//break;
//}
//ipq_set_verdict(h, m->packet_id, verdict, 0, NULL);
判决数据包,重新注入内核
//} 

你可能感兴趣的:(linux)