免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 请问一下关于netfilter的问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-30 17:22 |只看该作者 |倒序浏览
我现在有两台PC进行tcp通信,中间由于某些设备的原因将client的源IP地址和源端口号进行了转换,但是server上的某些应用需要知道真实的clientIP地址;现在的想法就是在server端增加一个模块,client会在发送数据的时候将自己的真实IP地址放在tcp的数据段,在内核收到client的包的时候将真实IP地址取出来,然后进行源IP地址的转换,然后再将tcp包发给上层,现在我所知道的netfilter里面的snat是对出去的包做源地址转换,但是我需要的是对进来的包做源地址转换,请问一下这个怎么实现?有啥思路?

论坛徽章:
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
2 [报告]
发表于 2012-10-31 12:12 |只看该作者
回复 1# g_programming
现在我所知道的netfilter里面的snat是对出去的包做源地址转换,但是我需要的是对进来的包做源地址转换

这个与你的问题关系不是很大。
方法1:
         应用层在构造数据包的时候,把自己的IP地址封装进去。
方法2:
        netfilter写一个module,在PREROUTING之前,把源地址放到数据包内容中,然后重新走netfilter。

   

论坛徽章:
0
3 [报告]
发表于 2012-10-31 13:53 |只看该作者
回复 2# 瀚海书香


    client会在进行三次连接的时候的最后一个ACK将自己的真实IP地址放在tcp的数据段,在server内核收到client的包的时候将真实IP地址取出来,然后进行源IP地址的转换,然后再将tcp包发给上层
(1)因为上面的原因,所以不能用应用层去改
(2)netfilter写一个module,在PREROUTING之前,把源地址放到数据包内容中,然后重新走netfilter
如果在PREROUTING之前修改的话,那么只能自己去维持一张nat的转换表了,而且由于TCP是面向连接的,还必须判断多久TCP连接断了,然后删除nat的内容??

谢谢

论坛徽章:
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
4 [报告]
发表于 2012-10-31 14:53 |只看该作者
回复 3# g_programming
呵呵,两个你都理解错了。
我说的两种方法都是把IP地址放到数据包的data部分,也就是tcp头的后面,不是修改协议栈部分。

   

论坛徽章:
0
5 [报告]
发表于 2012-10-31 16:44 |只看该作者
回复 4# 瀚海书香


    方法1:
         应用层在构造数据包的时候,把自己的IP地址封装进去。
         我知道你的意思是在自己的IP地址封装到tcp的数据段,但是这样的话应用程序就需要特别处理这个报文,因为数据段多了一个真实的IP地址,我这边的需求是不让应用程序特别是处理,直接连接返回的就是真实的IP地址了,但是你的这个方法应该需要特殊处理吧??
方法2:
        netfilter写一个module,在PREROUTING之前,把源地址放到数据包内容中,然后重新走netfilter。
        这个你说的直接IP地址放到数据包的data部分,也就是tcp头的后面,这个我没太能够理解,跟netfilter有啥关系??

再一个就是我跟你先前的方法:http://bbs.chinaunix.net/forum.p ... st%3D1%26digest%3D1

我自己以最低的优先级去注册一个hook,然后去调用ip_nat_setup_info去修改源地址,这里我假设我已经知道源地址了,但是总是执行到ip_nat_setup_info的时候就死机了,这里需要先启动iptable -t nat -L一下,初始化nat相关的东西。
  1. static unsigned int
  2. ttm_in(unsigned int hooknum, struct sk_buff **skb,
  3.          const struct net_device *in, const struct net_device *out,
  4.          int (*okfn)(struct sk_buff *))
  5. {
  6.         struct ip_conntrack *ct;
  7.         enum ip_conntrack_info ctinfo;
  8.         struct ip_nat_range newrange;
  9.         const struct iphdr *iph = (*skb)->nh.iph;
  10.         __be32 newsrc = 0;
  11.         if(iph->protocol != IPPROTO_ICMP){
  12.                 return NF_ACCEPT;
  13.         }
  14.         IP_NF_ASSERT(hooknum == NF_IP_LOCAL_IN);

  15.         /*取得数据包的连接*/
  16.         ct = ip_conntrack_get(*skb, &ctinfo);

  17.         if (ct == NULL)
  18.                 return NF_ACCEPT;
  19.         /* Connection must be valid and new. */
  20.         IP_NF_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_ESTABLISHED
  21.                             || ctinfo == IP_CT_ESTABLISHED + IP_CT_IS_REPLY));
  22.        // if (ctinfo != IP_CT_ESTABLISHED)
  23.         //    return NF_ACCEPT;

  24.         memset(&newrange, 0, sizeof(newrange));
  25.         newrange.flags |= IP_NAT_RANGE_MAP_IPS;
  26.         newrange.min_ip = newrange.max_ip = newsrc;
  27.         UINPTTM_INFO("test\n");
  28.         return ip_nat_setup_info(ct, &newrange, hooknum);
  29. }
复制代码
非常感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP