阅读:2401回复:6
linux 截包模块
给位大虾,我想请教一个问题,希望各位不吝赐教,也希望感兴趣的朋友一起讨论。我想做一个截包的模块,用来把应用层的数据包截获后做一些处理然后再发送。参看了libpcap,和libnet的部分代码,知道如何获得注册的网络接口以及如何发送数据包,但是我不知道如何使系统先调用我的模块进行处理然后再发送。以前看过一些windows的中间层驱动的例子,但是它的实现似乎是系统留有接口,再linux下我就不清楚如何实现了。希望大家给我些建议。
|
|
沙发#
发布于:2008-01-23 18:52
使用netfilter技术,在ip_pre_routing和ip_post_routing点挂接hook 接口。
|
|
|
板凳#
发布于:2008-01-23 19:59
非常感谢您的提点,我正在看netfilter的资料,希望能尽早找到突破口。非常感谢!
|
|
地板#
发布于:2008-01-24 11:22
请问一下,我看了netfilter后,觉得应该在NF_IP_FORWARD 处挂接hook,因为我要处理的只是发往其他主机的数据包。不知道我这种理解对不对?还有就是,我需要把不符合条件的包发回用户空间进行处理然后在转发,这样当我把包返回用户空间后,应该在hook处理函数的返回值传NF_QUEUE吗,担心效率太低
|
|
地下室#
发布于:2008-01-24 20:42
转发包就在forward点。如果在应用层处理就用queue。你说的完全正确。
但是为什么一定要在应用层作呢?内核也是一样的,唯一区别就是权限不同而已。 |
|
|
5楼#
发布于:2008-01-25 12:59
主要是我对数据包做的更改比较复杂,基本上是重新构造。为了怕增加系统负担,因此打算把更改的那部分放到用户空间。
我今天试着写了个很简单的模块,虽然t能通过编译运行,不过有些问题:应该是每个发出的数据包到达挂接点的时候都会调用HOOK处理函数的,可是我每次装载好模块只有一个输出,似乎HOOK处理函数只调用了一次。麻烦您指点一下!谢谢! #include <linux/module.h> #include <linux/kernel.h> #include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> MODULE_LICENSE("Dual BSD/GPL"); static unsigned int nerfilteripv4_hook(unsigned int hookunm, struct sk_buff** pskb,const struct net_device *in,const struct net_device *out,int(*okfn)(struct sk_buff *)) {printk(KERN_EMERG "send an ip pocket\n"); return NF_ACCEPT; } struct nf_hook_ops netfilteripv4_ops={ {NULL,NULL},nerfilteripv4_hook,PF_INET,NF_IP_FORWARD,NF_IP_PRI_FILTER}; static int netipv4hook_init(void) { nf_register_hook(&netfilteripv4_ops); printk(KERN_EMERG "THE MOD IS WORKING\n"); return 0; } static void netipv4hook_exit(void) { nf_unregister_hook(&netfilteripv4_ops); } module_init(netipv4hook_init); module_exit(netipv4hook_exit); |
|
6楼#
发布于:2008-01-25 22:09
我将程序改了一下,问题是解决了,不过不是很明白。还有就是我在编译上面的代码的时候会有警告,说是在PF_INET赋值时将一个整型赋给了一个指针?不过在编译下面的代码时并没有给出警告。哎,看来我还是太菜,呵呵
#include <linux/module.h> #include <linux/kernel.h> #include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> MODULE_LICENSE("Dual BSD/GPL"); static unsigned int nerfilteripv4_hook(unsigned int hookunm, struct sk_buff **pskb,const struct net_device *in,const struct net_device *out,int(*okfn)(struct sk_buff *)) { struct sk_buff *skb=*pskb; printk(KERN_EMERG "send an ip pocket:%d\n",skb->len); return NF_ACCEPT; } static struct nf_hook_ops netfilteripv4_ops; static int netipv4hook_init(void) { netfilteripv4_ops.hook=nerfilteripv4_hook; netfilteripv4_ops.hooknum=NF_IP_PRE_ROUTING; netfilteripv4_ops.pf=PF_INET; netfilteripv4_ops.priority=NF_IP_PRI_FIRST; nf_register_hook(&netfilteripv4_ops); printk(KERN_EMERG "THE MOD IS WORKING\n"); return 0; } static void netipv4hook_exit(void) { nf_unregister_hook(&netfilteripv4_ops); printk(KERN_EMERG "THE MOD IS CLOSSED\n"); } module_init(netipv4hook_init); module_exit(netipv4hook_exit); |
|