有关netfilter 收到的数据包check不变的问题

codewar
有关netfilter 收到的数据包check不变的问题

写了个小程序,在pre_routing  local_out挂了两个函数
local 那里,判断目的ip为指定hook掉的,就修改目的ip,port
pre那里,判断源ip为修改的,就改回hook前的

在pre那里ip包校验出现了问题,tcpdump每次都是bad_hlen,
检查之后,发现不管是在pre那里还是在local_in那里,同一
个站点的ip包的tcp->check都是一个固定值...

实在是不解...求达人指教

环境:虚拟机:redhat 9.0 2.4.20

platinum
贴代码

codewar
这是在pre那里的hook函数
if(iph->protocol == IPPROTO_TCP)
    {
     if (iph->saddr == in_aton(app_ip)){
       iph->saddr == in_aton(hook_ip);
       ip_send_check(iph);
       size = ntohs(iph->tot_len) - (iph->ihl * 4);
      doff = th->doff << 2;
     psk->csum = 0;
      csum = csum_partial( psk->h.raw + doff, size - doff, 0 );
      psk->csum = csum;
      
       printk("---1@@@@@the incomme is %x/n",ntohs(th->check));//不知道为什么总是7f00或是ca08
       th->check = 0;
        th->check = csum_tcpudp_magic(psk->nh.iph->saddr,psk->nh.iph->daddr,size,IPPROTO_TCP,
              csum_partial((char*)th,size,0));


测试中,是将指向192.168.2.1重定向到192.168.1.1的web服务器上,回来时在重定向ip,但是主机抓包发现回包虚拟机没收到,丢帧。

[[i] 本帖最后由 codewar 于 2008-6-8 13:14 编辑 [/i]]

platinum
1、关于 if 后的 == 问题已经给你回复站内短信了
2、最好不用虚拟机做实验,因为我发现虚拟机的协议栈和真实系统不同,具体可以参考我写的这篇文章
[url]http://blog.chinaunix.net/u/311/showart_373876.html[/url]

waikontheroad
受教了,又有经验可以学习了!