本版版主招募中

 
标题: (请高手指点)我写了一个数据包重定向的LKM,但是有一些问题??
goodness4960
LU新生
Rank: 1



UID 32358
精华 0
积分 2
帖子 4
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 10
注册 2005-6-2
 
发表于 2005-6-27 10:37  资料  个人空间  短消息  加为好友 
我想自己编写一个可加载内核模块(LKM)来实现对转发的数据包进行重定向到某一个固定目标,模块中定义的一个函数名为packetdirect的钩子函数被添加到netfilter中的NF_IP_PRE_ROUTING钩子点上。为了在netfilter的NF_IP_PRE_ROUTING上对数据包重定向,此模块程序修改从局域网内客户机发送过来的数据包的目的地址,但是我在作局域网服务器网关的机器上装载了该模块后,它的客户机不但不能被重定向到目的地址上,而且不能再通过网关上网了!但是如果把处理函数packetdirect() 中的以下几行代码去掉后:
__u32 newdaddr = in_aton("192.168.10.19”) ;
(*skb)->nh.iph->check=mynat_cheat_check(~(*skb)->nh.iph->daddr, newdaddr, (*skb)->nh.iph ->check);
(*skb)->nh.iph->daddr = newdaddr;
只留下return NF_ACCEPT;这一行代码,客户机就能通过网关上网!

我的源程序如下, 请问为什么不能实现重定向功能呢?是不是实现数据包重定向没有这么简单,或者还是需要其他的操作步骤?
(以下源程序编译已经通过:我的编译方法是:gcc -O2 -Wall -c -I/usr/src/linux-2.4/include functionname.c)?

#define __KERNEL__
#define MODULE

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/netdevice.h>
#include<linux/netfilter.h>
#include<linux/netfilter_ipv4.h>
#include<linux/inet.h >
#include<linux/in.h>
#include <linux/module.h>
#include <linux/skbuff.h>
#include <net/checksum.h>

static struct nf_hook_ops nfho; /*用于注册处理数据包函数的数据结构*/

/*ip校验和函数,该函数抄自/net/ipv4/netfilter/ip_nat_cheat_core.c:ip_cheat_check()*/
mynat_cheat_check(__u32 oldvalinv, __u32 newval, __u16 oldcheck)

{
__u32 diffs[] = { oldvalinv, newval };
return csum_fold(csum_partial((char *)diffs, sizeof(diffs),

oldcheck^0xFFFF));
}

static unsigned int /*我的数据包重定向的处理函数*/
packetdirect(unsigned int hooknum ,
struct sk_buff **skb ,
const struct net_device *in ,
const struct net_device *out,
int (*okfn)(struct sk_buff *))

{

__u32 newdaddr = in_aton("192.168.10.19”) ;/*为重定向新修改的目标地址*/
(*skb)->nh.iph->check=mynat_cheat_check(~(*skb)->nh.iph->daddr, newdaddr, (*skb)->nh.iph ->check); /* 校验和*/
(*skb)->nh.iph->daddr = newdaddr; /*赋值新目标地址*/
return NF_ACCEPT;
}


int init_module(void)
{
nfho.hook=packetdirect;
nfho.hooknum=NF_IP_PRE_ROUTING;
nfho.pf= PF_INET;
nfho.priority=NF_IP_PRI_FIRST;
return nf_register_hook(&nfho);
return 0;
}

void cleanup_module(void)
{
nf_unregister_hook(&nfho);

}

顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2005-6-27 12:05  资料  个人空间  主页 短消息  加为好友 
这直接使用iptables重定向不就可以了吗

如果一定要自己写

我觉得有两点需要考虑

1 是每个ip包内的ip地址
2 是每个包的mac地址 它指向下一跳 需要注意保持一致





不要问我结果 我只研究过程与思路
无双客栈
顶部
goodness4960
LU新生
Rank: 1



UID 32358
精华 0
积分 2
帖子 4
活跃指数 0
LU金币 2006 个
LU金条 0 个
阅读权限 10
注册 2005-6-2
 
发表于 2005-6-27 14:52  资料  个人空间  短消息  加为好友 
无双大侠,能否说的具体点啊:)拜托了!

顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2005-6-27 16:53  资料  个人空间  主页 短消息  加为好友 
我要说的已经说完了





不要问我结果 我只研究过程与思路
无双客栈
顶部
chengzhi330
LU新生
Rank: 1



UID 100835
精华 0
积分 1
帖子 2
活跃指数 1
LU金币 3 个
LU金条 0 个
阅读权限 10
注册 2007-12-26
 
发表于 2007-12-26 20:51  资料  个人空间  短消息  加为好友 
最近也在看楼主说的内容,也在实现重定向目标地址,但是也是没有结果。
不知道05年的楼主能够回复07年的问题?
楼主或者其他热心人看到了我的回复,能否告之我如何做?我是修改完目的地址,再重新计算校验和的,我觉得这样是正确的,但是同样没有实现楼主所说的结果。

顶部
 



当前时区 GMT+8, 现在时间是 2008-10-12 22:33
乐悠LoveUnix论坛-京ICP备05005823号

Thanks to Discuz!  © 2001-2007    Power by LoveUnix.net
Processed in 0.053959 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 乐悠LoveUnix - Archiver