LoveUnix » 编程开发 & Rational » (请高手指点)我写了一个数据包重定向的LKM,但是有一些问题??
让LU留住您的每

一天 让LU博客留住您的每一天
2005-6-27 10:37 goodness4960
我想自己编写一个可加载内核模块(LKM)来实现对转发的数据包进行重定向到某一个固定目标,模块中定义的一个函数名为packetdirect的钩子函数被添加到netfilter中的NF_IP_PRE_ROUTING钩子点上。为了在netfilter的NF_IP_PRE_ROUTING上对数据包重定向,此模块程序修改从局域网内客户机发送过来的数据包的目的地址,但是我在作局域网服务器网关的机器上装载了该模块后,它的客户机不但不能被重定向到目的地址上,而且不能再通过网关上网了!但是如果把处理函数packetdirect() 中的以下几行代码去掉后:<br />__u32 newdaddr = in_aton(&quot;192.168.10.19”) ;<br />(*skb)-&gt;nh.iph-&gt;check=mynat_cheat_check(~(*skb)-&gt;nh.iph-&gt;daddr, newdaddr, (*skb)-&gt;nh.iph -&gt;check);  <br />(*skb)-&gt;nh.iph-&gt;daddr = newdaddr; <br />只留下return NF_ACCEPT;这一行代码,客户机就能通过网关上网!<br /><br />我的源程序如下, 请问为什么不能实现重定向功能呢?是不是实现数据包重定向没有这么简单,或者还是需要其他的操作步骤?<br />(以下源程序编译已经通过:我的编译方法是:gcc -O2 -Wall -c -I/usr/src/linux-2.4/include functionname.c)? <br /><br />#define __KERNEL__ <br />#define MODULE <br /><br />#include&lt;linux/kernel.h&gt; <br />#include&lt;linux/module.h&gt; <br />#include&lt;linux/netdevice.h&gt; <br />#include&lt;linux/netfilter.h&gt; <br />#include&lt;linux/netfilter_ipv4.h&gt; <br />#include&lt;linux/inet.h &gt; <br />#include&lt;linux/in.h&gt; <br />#include &lt;linux/module.h&gt; <br />#include &lt;linux/skbuff.h&gt; <br />#include &lt;net/checksum.h&gt; <br /><br />static struct nf_hook_ops nfho; /*用于注册处理数据包函数的数据结构*/<br /><br />/*ip校验和函数,该函数抄自/net/ipv4/netfilter/ip_nat_cheat_core.c:ip_cheat_check()*/<br />mynat_cheat_check(__u32 oldvalinv, __u32 newval, __u16 oldcheck) <br /><br />{ <br />__u32 diffs[] = { oldvalinv, newval }; <br />return csum_fold(csum_partial((char *)diffs, sizeof(diffs), <br /><br />oldcheck^0xFFFF)); <br />} <br /><br />static unsigned int /*我的数据包重定向的处理函数*/ <br />packetdirect(unsigned int hooknum , <br />struct sk_buff **skb , <br />const struct net_device *in , <br />const struct net_device *out, <br />int (*okfn)(struct sk_buff *)) <br /><br />{ <br /><br />__u32 newdaddr = in_aton(&quot;192.168.10.19”) ;/*为重定向新修改的目标地址*/<br />(*skb)-&gt;nh.iph-&gt;check=mynat_cheat_check(~(*skb)-&gt;nh.iph-&gt;daddr, newdaddr, (*skb)-&gt;nh.iph -&gt;check); /* 校验和*/ <br />(*skb)-&gt;nh.iph-&gt;daddr = newdaddr; /*赋值新目标地址*/<br />return NF_ACCEPT; <br />} <br /><br /><br />int init_module(void) <br />{ <br />nfho.hook=packetdirect; <br />nfho.hooknum=NF_IP_PRE_ROUTING; <br />nfho.pf= PF_INET; <br />nfho.priority=NF_IP_PRI_FIRST; <br />return nf_register_hook(&amp;nfho); <br />return 0; <br />} <br /><br />void cleanup_module(void) <br />{ <br />nf_unregister_hook(&amp;nfho); <br /><br />}

2005-6-27 12:05 无双
这直接使用iptables重定向不就可以了吗<br /><br />如果一定要自己写<br /><br />我觉得有两点需要考虑<br /><br />1 是每个ip包内的ip地址<br />2 是每个包的mac地址 它指向下一跳 需要注意保持一致

2005-6-27 14:52 goodness4960
无双大侠,能否说的具体点啊:)拜托了!

2005-6-27 16:53 无双
我要说的已经说完了

2007-12-26 20:51 chengzhi330
最近也在看楼主说的内容,也在实现重定向目标地址,但是也是没有结果。
不知道05年的楼主能够回复07年的问题?
楼主或者其他热心人看到了我的回复,能否告之我如何做?我是修改完目的地址,再重新计算校验和的,我觉得这样是正确的,但是同样没有实现楼主所说的结果。

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.