pbxiaoliang
驱动牛犊
驱动牛犊
  • 注册日期2007-07-24
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望19点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
阅读:2300回复:6

linux 截包模块

楼主#
更多 发布于:2008-01-23 16:57
给位大虾,我想请教一个问题,希望各位不吝赐教,也希望感兴趣的朋友一起讨论。我想做一个截包的模块,用来把应用层的数据包截获后做一些处理然后再发送。参看了libpcap,和libnet的部分代码,知道如何获得注册的网络接口以及如何发送数据包,但是我不知道如何使系统先调用我的模块进行处理然后再发送。以前看过一些windows的中间层驱动的例子,但是它的实现似乎是系统留有接口,再linux下我就不清楚如何实现了。希望大家给我些建议。
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2008-01-23 18:52
使用netfilter技术,在ip_pre_routing和ip_post_routing点挂接hook 接口。
走走看看开源好 Solaris vs Linux
pbxiaoliang
驱动牛犊
驱动牛犊
  • 注册日期2007-07-24
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望19点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-01-23 19:59
非常感谢您的提点,我正在看netfilter的资料,希望能尽早找到突破口。非常感谢!
pbxiaoliang
驱动牛犊
驱动牛犊
  • 注册日期2007-07-24
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望19点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-01-24 11:22
请问一下,我看了netfilter后,觉得应该在NF_IP_FORWARD 处挂接hook,因为我要处理的只是发往其他主机的数据包。不知道我这种理解对不对?还有就是,我需要把不符合条件的包发回用户空间进行处理然后在转发,这样当我把包返回用户空间后,应该在hook处理函数的返回值传NF_QUEUE吗,担心效率太低
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地下室#
发布于:2008-01-24 20:42
转发包就在forward点。如果在应用层处理就用queue。你说的完全正确。

但是为什么一定要在应用层作呢?内核也是一样的,唯一区别就是权限不同而已。
走走看看开源好 Solaris vs Linux
pbxiaoliang
驱动牛犊
驱动牛犊
  • 注册日期2007-07-24
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望19点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
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);
pbxiaoliang
驱动牛犊
驱动牛犊
  • 注册日期2007-07-24
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望19点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
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);
游客

返回顶部