免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2993 | 回复: 6

[网络子系统] 关于tcpdump抓包的问题 [复制链接]

论坛徽章:
0
发表于 2012-08-29 14:35 |显示全部楼层
本帖最后由 cuiyilong21 于 2012-08-29 16:38 编辑

问题:tcpdump抓包:
我的流程是,进入我的设备之前加密,在我的设备里解密
按照常规应该是抓到的是经过加密的报文
但实际查看抓包都是做过解密之后的报文,
而自己做解密的流程在udp协议栈处理之后
但tcpdump抓包应该是在netif_skb_rcv这里获取的报文
这里不解了   tcpdump抓包 是怎么复制报文的啊?   

想来想去,有种可能 还是发送socket时使用的是原有skb的数据段,skb向libcap发送的时候内容已经是被改变之后的报文了
还有其他什么可能?
求指导

看了packet_rcv    发现skb-clone的操作,skb_clone只是拷贝skb结构,对于报文的数据区可能使用的还是原有报文的数据区,是不是因为这个?

看代码看的比较吃力,求高人验证   

论坛徽章:
0
发表于 2012-08-29 19:42 |显示全部楼层
已验证,符合以上现象

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-08-30 09:04 |显示全部楼层
回复 1# cuiyilong21
skb_clone的数据包,原则上不应该修改数据区。如果非要修改数据区,应该重新分配空间。
但是我看2.6.32.7代码,packet_rcv使用的是shared模式,也就是atomic_add(skb->users),并没有使用skb_clone.

   

论坛徽章:
0
发表于 2012-08-30 14:11 |显示全部楼层
回复 3# 瀚海书香
是使用的share模式啊,
我的是2.6.18.8  
packet_rcv里
有以下面一段代码,对于shared的skb ,还是做了skb_clone啊

    if (skb_shared(skb)) {
                struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC);
                if (nskb == NULL)
                        goto drop_n_acct;

                if (skb_head != skb->data) {
                        skb->data = skb_head;
                        skb->len = skb_len;
                }
                kfree_skb(skb);
                skb = nskb;
        }


现在有个问题是向用户空间发送报文的时间,跟我原先报文处理(做报文解密,在udp协议栈里处理)的时间,这里如何确定先后?现象是udp先处理好了

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-08-31 08:50 |显示全部楼层
回复 4# cuiyilong21
跟我原先报文处理(做报文解密,在udp协议栈里处理)的时间,这里如何确定先后?现象是udp先处理好了

这个感觉与你的解密流程有关吧。你的解密流程有没有解密完后重新走协议栈啊?

还有,如果没有重新走协议栈,而是直接修改skb的话,由于packe_rcv是clone的,当调用到copy_to_user的时候,有可能skb->data数据已经被udp解密了。

   

论坛徽章:
0
发表于 2012-08-31 11:55 |显示全部楼层
回复 5# 瀚海书香


    是的,解密的流程就是在udp解密了,而没有重走协议栈,应该是copy_to_user的时候已经解密了,我做了个实验,在解密之前做了一下skb_copy ,tcpdump抓到的包便是未解密的包了,应该可以验证上面的想法

   现在就是有个疑问:copy_to_user的时机与做解密的时机,先后是怎么判定的啊,应该是报文处理优先级较高吧?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-08-31 14:54 |显示全部楼层
回复 6# cuiyilong21
udp数据包的解密是在软中断中完成的,copy_to_user调用的时候,已经进入了raw socket的接收队列,属于系统调用。软中断的优先级应该要高一些。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP