免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dreamice
打印 上一主题 下一主题

请教:有关Netfilter的问题 [复制链接]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
71 [报告]
发表于 2009-03-11 15:35 |只看该作者
原帖由 platinum 于 2009-3-11 15:28 发表

这里先分支讨论一下性能问题
如果 defrag 之前 clone,之后两个包都要 defrag,这样负载会比较高,为什么不先过了 defrag 再 clone 呢?
IP 重组是根据 sip、dip、ipid、proto 四元组来计算 hash 的,如果在 ...


白金兄,你这个说得有道理,但实际上,在重组之前之后是要考虑的一方面,其实我更想先搞清楚这个新包如何能继续走

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
72 [报告]
发表于 2009-03-11 16:12 |只看该作者
通过讨论,学到了好多东西。

论坛徽章:
0
73 [报告]
发表于 2009-03-11 16:48 |只看该作者
dreamice 兄,如果有了新的 idea,也与我们一起分享一下

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
74 [报告]
发表于 2009-03-11 17:10 |只看该作者
原帖由 platinum 于 2009-3-11 16:48 发表
dreamice 兄,如果有了新的 idea,也与我们一起分享一下


没问题,呵呵,希望能尽快找到解决途径。

论坛徽章:
0
75 [报告]
发表于 2009-03-11 23:47 |只看该作者
原帖由 ShadowStar 于 2009-3-11 12:32 发表
So easy.

这个处理,没有任何问题。

不过要注意,后续的处理可能有问题。
例如需要记录报文内容的话,需要考虑数据包重组的问题;如果做了NAT的话,TCP的三次握手应该会失败的。


刚刚遇到类似的需 ...


请问一下,为什么TCP的三次握手会失败?谢谢!

论坛徽章:
0
76 [报告]
发表于 2009-03-12 01:05 |只看该作者
原帖由 new_learner 于 2009-3-11 23:47 发表


请问一下,为什么TCP的三次握手会失败?谢谢!


因为本地的server回返回SYN_ACK,并封装为本地源IP给原始的客户端,但是客户端并没有给本机IP发送报文,所以会丢弃掉。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
77 [报告]
发表于 2009-03-12 08:58 |只看该作者
原帖由 ShadowStar 于 2009-3-12 01:05 发表


因为本地的server回返回SYN_ACK,并封装为本地源IP给原始的客户端,但是客户端并没有给本机IP发送报文,所以会丢弃掉。


如果是真正的拦截,在2.6.28的内核里面,是没有问题的

论坛徽章:
0
78 [报告]
发表于 2009-03-15 15:11 |只看该作者
是否可以这样:

  1. /*
  2. *         Main IP Receive routine.
  3. */
  4. int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt)
  5. {
  6.         .........

  7.         {
  8.                 nskb = skb_clone(skb);
  9.                 修改nskb的dest ip为localhost;
  10.                 ip_rcv_finish(nskb);
  11.                
  12.         }

  13.         return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL,
  14.                        ip_rcv_finish);
  15. }
复制代码

这样nskb就绕过了netfilter,因为你修改了nskb的dest ip,在route时会选择local
deliver,在ip_local_deliver()处kernel会帮助你的nskb做重组:

  1. /*
  2. *         Deliver IP Packets to the higher protocol layers.
  3. */
  4. int ip_local_deliver(struct sk_buff *skb)
  5. {
  6.         /*
  7.          *        Reassemble IP fragments.
  8.          */

  9.         if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
  10.                 skb = ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER);
  11.                 if (!skb)
  12.                         return 0;
  13.         }

  14.         return NF_HOOK(PF_INET, NF_IP_LOCAL_IN, skb, skb->dev, NULL,
  15.                        ip_local_deliver_finish);
  16. }
复制代码

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
79 [报告]
发表于 2009-03-15 15:52 |只看该作者
这个问题虽然搞定了,但是遇到了新的问题:
多路出来的是TCP包,这样基于TCP的连接,源包到达真正的目的地;被clone的包到达另一个目的地,他们需要建立连接,包括tcp握手,tcp传送的ACK,而新clone的包仍旧需要这些东西,于是有两个返回就成问题了,而这两个返回,内容肯定是不相同的。这样,就只有一个能真正建立连接,另一个连接建立不上,便不再收包了。这个已经衍生到IP上层的问题了,比较麻烦。

论坛徽章:
0
80 [报告]
发表于 2009-03-15 23:13 |只看该作者
原帖由 dreamice 于 2009-3-15 15:52 发表
这个问题虽然搞定了,但是遇到了新的问题:
多路出来的是TCP包,这样基于TCP的连接,源包到达真正的目的地;被clone的包到达另一个目的地,他们需要建立连接,包括tcp握手,tcp传送的ACK,而新clone的包仍旧需 ...


能分享一下这个问题是怎么搞定的吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP