阅读:2102回复:9
请问怎么把数据包的包头去掉?
client把所有外出的数据包加上了一个固定的包头,在网关需要把固定的包头给去掉,然后转发,有什么好办法吗?
|
|
沙发#
发布于:2005-06-25 22:18
这个需要要看你的情况,如果你的固定报头需要在路由前就被搞掉,那么你就在ip_rcv里面把这个报头去掉,如果你这个固定包头需要在路由后被搞掉,那么你就在ip_forward里面去搞掉就好了。
在Linux里面干这样的事情还是比较简单的,如果能够修改内核源码的话。 |
|
|
板凳#
发布于:2005-06-26 14:18
我想问一下,用memcpy,或者是memmove等方法,直接将内存的内容覆盖过去的话,会不会影响sk_buf的指针。还有就是sk_buf中的数据的存储是连续的么?它的ip头和udp头和数据在存储空间上是否连续?sk_buf中的其他指针的存储位置是什么样的?
能否不修改内核源码,直接在路由前写个加个内核模块,利用netfilter的钩子函数完成去包头的功能? |
|
地板#
发布于:2005-06-26 14:19
高手能留个msn吗?我想向您单独请教
|
|
地下室#
发布于:2005-06-26 14:19
我的msn: fl_dlmu@hotmail.com
qq:9708864 |
|
5楼#
发布于:2005-06-28 23:29
高手不敢当,只是看过一些Linux的协议栈代码而已。
你的问题实质是SKB_BUFF的问题,在Linux里面网络数据包放到SKB_BUFF里面的,这个东西是由两块内存组成的,一个是SKB_BUFF的自身信息,好象共240个字节,另一块就是实际的网络数据。你说的那些memcpy什么的实际就是操作第二块内存,但是在第一块内存里面,也就是那240个字节里面有一些指针,比如说以太头的地址、IP头的地址,所以如果你要修改第二块内存并且修改到这些地址,那么你就要改第一块内存了。 使用netfilter的钩子函数是可以完成的,因为在这些钩子函数里面你可能拿到SKB_BUFF的地址,这个时候你可以把第二块内存整个都换掉,所以是可以的。 给你的一点建议,搞清楚SKB_BUFF这个东西的作用和使用方法,这些问题对来说就不再是问题了。 我的MSN:monkeycsdn@hotmail.com 希望有机会和你讨论一些Linux协议栈和内核的问题,呵呵! |
|
|
6楼#
发布于:2005-06-29 21:25
谢谢高手,现在可以对用户端的部分包进行解包
|
|
7楼#
发布于:2005-06-29 21:28
client把所有的数据包都加上一个ip包头&udp包头,我在服务器端的netfilter的NF_IP_PRE_ROUTING钩子点上加了个处理函数,感觉好像是正确了,可是连不上外面的ftp,测试的结果是 到了ftp的pwd命令之前停了,在ftp服务器端显示的结果是该用户已经认证通过,正等待下一个命令,不知道是怎么回事?
|
|
8楼#
发布于:2005-07-02 14:45
那估计你的感觉有问题,呵呵。从你问题看,估计是服务器的应答包出现问题,没有正确收到。
给你一点建议。这个时候你应该使用sniffer等抓包工具,详细分析连接过的每个包,看是否存在问题,只有这样才能很快的找出问题所在,祝好运! |
|
|
9楼#
发布于:2005-07-10 13:25
重启机器就好用了
|
|