免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2341 | 回复: 1
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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
2 [报告]
发表于 2017-08-03 09:43 |只看该作者
终于解决了,使用csum_replace4()更新ip的csum,inet_proto_csum_replace4()更新tcp的csum,最后skb->csum=0;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP