忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12
最近访问板块 发新帖
楼主: flash78910

[内核模块] netfilter修改TCP数据包遇到的问题,请各位不吝赐教! [复制链接]

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2017-11-22 22:52 |显示全部楼层
netfilter看到的skb,是tcp xmit buffer中skb的clone,所以修改skb->len仅仅影响这个临时的skb。
重传的时候,新的skb从xmit buffer的head产生新的clone,所以长度仍然是原来的内容。

但是,由于skb clone只是复制skb本身,data部分在clone之间共享,
所以对data的修改,在重传的时候是可见的。

论坛徽章:
0
发表于 2017-11-23 20:47 |显示全部楼层
在应用层的时候给数据包留出足够的空间来插入数据,然后根据有效数据长度在数据末尾添加数据,这样才能保证成功的插入数据。 skb_put()移动的tail指针,skb->len长度变了,但是iph->len长度没变。楼上的大神解释了原因。

论坛徽章:
0
发表于 2017-12-15 11:43 |显示全部楼层
借楼同问,小弟也有一个类似的需求,A,B两台虚拟机在同一网段,A机器上挂载模块给数据包添加额外数据然后发送,B机器上挂在模块额外数据去掉,还原原来数据,并返回ack,AB一直这样通信。但是在实现的时候出现了问题。我是使用内核模块将数据包queue到用户空间,然后在用户空间编程修改数据包,A挂载点是LOCAL_OUT,B是LOCAL_IN,A修改数据包成功,也发送出去了,但是B对应的应用程序收不到。奇怪的是B机器的LOCAL_IN点是收到这个数据了,也确实还原了,但是应用程序收不到。

ps:我是用的nc建立的client server,求指教。
我估计是要修改seq和ack的,但是现在的问题是B的LOCAL_IN点收到了数据,但是应用程序(nc)收不到。。

论坛徽章:
0
发表于 2017-12-15 15:41 |显示全部楼层
回复 13# justuit

请问你做好了吗?我也要做一个这种类似的怎么在ip头和tcp头添加额外的头部啊

论坛徽章:
0
发表于 2017-12-15 18:31 |显示全部楼层
回复 14# 是chi不是ci

没有,还在查资料

论坛徽章:
0
发表于 2017-12-16 01:10 |显示全部楼层
本帖最后由 justuit 于 2017-12-18 10:03 编辑

大哥们我又来问问题了。。

还是和之前的一样,内核模块返回NF_QUEUE,将数据包拷贝到用户空间。在用户空间我用libnetfilter_queue处理数据包,改变了数据包的长度,然后重新计算校验和(IP和TCP都计算了)。我申请了新的内存空间存放修改后的数据,然后在用户空间调用nfq_set_verdict(qh, id, NF_ACCEPT, new_data_len, new_data)。然后我发现,对方能接收到这个数据,但是我发出去的数据包会重传。并且使用netstat查看时,send_q的值不为0,正好是旧数据的长度。这个问题该怎么解决呢?缓冲区中的数据没法处理掉吗?
----------
啊基本解决掉了,就是修改seq和ack_seq的问题

论坛徽章:
0
发表于 2017-12-19 14:33 |显示全部楼层
没必要修改TCP包吧,不如加一个隧道
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP