li_freedom 发表于 2014-06-25 14:01

netfilter和网络数据传输问题

交代下背景:

   测试程序: 注册hook函数,在hook函数中修改应用层数据即:把skb_buff中data的数据中ip+tcp+app格式中的app的数据某些为数据修改:
   伪代码:
   testhook(skb_buf,.......)//注册的hook函数
   {
          struct tcphdr *tcph;
          struct iphdr   *iph;
         iph = (struct iphdr *)(skb_buf->data);
         tcph =(struct tcphdr *)(stk_buf->data+(iph->ihl)*4);   
          skb_buf->data[(iph->ihl)*4+(tcph->doff)*4 +10] = 'a';
          skb_buf->data[(iph->ihl)*4+(tcph->doff)*4 +11] = 'b';
          skb_buf->data[(iph->ihl)*4+(tcph->doff)*4 +12] = 'c';

   ........
   }
把应用层数据的第10,11,12字节修改成a,b,c。


我现在得到的结果是这样的:
   如果客户端向服务器发送的数据小于200(大概大小没有具体算),那么服务器得到的数据就是修改之后的数据,即数据的10 11 12字节被修改成a b c。
    但是,如果客户端向服务器发送的数据比较大,那么,服务器端接收到的数据就是客户端发送的原始数据,也就是说,数据的10 11 12字节并没有被修改。这里hook函数也是被执行过的。


谁知道这是什么原因啊?

从这里看好像是服务器最后接收到的数据并不是skb_buf这里面的数据,比较像是除了sbk_buff之外,还有另外的一个数据缓存,最后发给服务器的应该是另外的一份缓存数据。


这里小弟有点晕了。麻烦明白的大神们给小弟指点一下。
谢谢!




   

gonghuiyun 发表于 2015-06-02 17:19

你好 请问解决了吗

351624530 发表于 2015-06-23 10:21

发送的数据比较大时候, data 可能会以fragment 存储, 这样的话, 这样的话data 取数,    list= skb_shinfo(skb)->frag_list,list->data取应用层数据.

philarlala 发表于 2015-06-24 08:47

或者可以在服务器端接收到skb的时候,调用skb_linearize(skb),把skb线性化
页: [1]
查看完整版本: netfilter和网络数据传输问题