免费注册 查看新帖 |

ChinaUnix.net

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

[内核模块] 数据包修改checksum错误 [复制链接]

论坛徽章:
0
发表于 2017-08-01 13:45 |显示全部楼层
各位大神,我在实现一个修改数据包ip功能的内核模块,使用nf_hook_ops钩子的方式,有两个钩子,一个是在NF_INET_PRE_ROUTING位置,另外一个是在NF_INET_POST_ROUTING位置,NF_INET_POST_ROUTING我搞定了。
但是NF_INET_PRE_ROUTING总是checksum错误。代码如下:

iph = ip_hdr(skb);
tcph = (void*) iph+ iph->ihl * 4;

tot_len = ntohs(iph->tot_len);

if(iph->protocol == IPPOTO_TCP)
{
   if( tcph->soource == htons(22210) && iph->saddr == htonl(svr_ip) )
   {
       iph_len       = ip_hdrlen(skb);
       iph->daddr = in_aton("10.1.52.220");

       tcph->check = 0;
       skb->csum = csum_partial((char*)(tcph,tot_len - iph_len,0);
       tcph->check = tcp_v4_check(tot_len-iph_len,iph->saddr,ip->daddr,skb->csum);

       iph->check = 0;
       ip_send_check(iph);

       return NF_ACCEPT;
    }
}

调试了好久,不知道是哪里的问题,建立连接和断开正常,就是接收数据和ack会失败,请大神们帮忙看看,十分感激!

论坛徽章:
0
发表于 2017-08-03 09:43 |显示全部楼层
终于解决了,使用csum_replace4()更新ip的csum,inet_proto_csum_replace4()更新tcp的csum,最后skb->csum=0;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP