免费注册 查看新帖 |

Chinaunix

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

[内核模块] 熟悉nat和conntrack的高手进来指导下,谢谢! [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-20 15:47 |显示全部楼层 |倒序浏览
环境背景:
                                                     linux服务器
话机1   ------------------------
                                           |fm1-gb0 --- fm1-gb1| ----------------------dsp
话机2   ------------------------

使用服务器隔离dsp和外部网络,话机1和话机2都处在外部网络。
话机1:  10.0.1.60
话机2:  10.0.1.50

服务器:对外网口 10.0.1.10
             对内网口  192.100.1.1

dsp:   192.100.1.100

linux version: 2.6.38

现象(以话机2发送RTP为例说明):
   1) 如果在话机发送第一个RTP或RTCP之前,先配置NAT规则:
      iptables -t nat -A PREROUTING -d 10.0.1.10 -p udp --dport 10000 -j DNAT --to-destination 192.100.1.100:10000
      iptables -t nat -A POSTROUTING -s 10.0.1.50 -p udp --sport 11780 -j SNAT --to-source 192.100.1.1:10000
      则,话机2发送的RTP包可以通过NAT规则的转换,并将包发往DSP

    2)如果在话机发送第一个包之后才设置NAT规则,则话机2发送的RTP包无法通过NAT规则的转换,最终死在路由的结果上,返回icmp,code = 3, type =3 (目的端口不可达)

追踪内核源码,发现如下:
当收到第一个包时,新建了链接跟踪(nf_conntrack_in),然后进入NAT表在PREROUTING链路上的操作。
在nf_nat_fn中
nf_nat_fn()
{
      switch(ctinfo)
      {
              case  IP_CT_NEW:
              {
                      /* ct->staus 在进行了一次nat match匹配后,会调用target函数 ipt_snat_table或者ipt_dnat_table来设置
                       * ,并且将转换操作的规则信息nat_info转换成一个tuple,挂到ct上,后续的NAT转换就不用再查NAT规则了。
                       */
                     if(!nf_nat_initalized())   /* 第一包会进入 */
                     {
                            nf_nat_rule_find();
                     }
              }
      }

     nf_nat_packet(); /* 会调用manip_pkt()来修改ip和port */
}

nf_nat_rule_find()
{
      ret = ipt_do_table();
      if (NF_ACCEPT == ret)
              if(!nf_initialized())
                      ret = alloc_null_binding();
      
      return ret;
}

在ipt_do_table中,由于我们刚启动时,清空了nat规则表,所以查match时,是没有任何能匹配的,acpar.hotdrop == false。
这个查找应该返回NF_DROP(直接丢弃,后面的操作也不用了),并且,ct->status的SNAT和DNAT应该不会被设置啊。但是,从我在nf_nat_find中的打印来看,后续的包好像都没进入这个nf_nat_find函数,这个怎么解释呢???

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
2 [报告]
发表于 2013-11-22 21:54 |显示全部楼层
回复 2# 独孤九贱

第二个包为什么不去查?第一包到达时,由于此时还没有设置NAT规则,则nf_find_rule查找匹配失败,返回NF_ACCEPT;由于是查找失败的,所以没有机会调用对应的target函数---ipt_snat_target或ipt_dnat_target,也就没有机会设置ct->status为DNAT或者SNAT。既然没机会设置,那第二包到达时,它判断ct->status没有设置DNAT或SNAT,不是还会调用nf_find_rule去查找规则。

或许,是不是还有什么地方会设置这个ct->status???


   

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
3 [报告]
发表于 2013-11-24 16:32 |显示全部楼层
回复 4# 瀚海书香


    你是说,第一个包之后,CT就不是NEW状态了吗?我对CT这块没了解,指导下我,谢谢。

    如果按你说的,第一个包到达时,如果没有NAT规则,则CT中是没有nat信息的,然后路由之后,linux回复icmp也算是CT的另一个方向有数据包经过,CT就进入另一个状态???照这么解释的话,在nf_nat_fn进入的是default分支.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP