您当前的位置是:  首页 > 新闻 > 国内 >
 首页 > 新闻 > 国内 >

SIP系列讲座-SIP-防火墙-NAT-Hole Punching探讨

2017-11-13 14:51:23   作者: james.zhu   来源:CTI论坛   评论:0  点击:


  在前面的讲座中,我们讨论了基于SIP的安全机制和一些解决方式。在接下来的讲座中,我们要针对性地讨论关于SIP互联互通中存在的一个核心问题-NAT问题。
  VOIP的运行需要对接很多公网资源,例如,对接运营商的SIP中继,对接第三方的其他支持服务器,对接分公司业务等等数据。但是,无论怎么对接,用户都需要一个标准的网络架构来实现内网分机和外网的互联互通。因为,网络地址资源的限制,所以,内网和外网的互联互通就需要一个内网地址转换的机制,通过一个外网转换到多个内网的地址。这里,就涉及到了路由器防火墙和应用业务的端口管理问题,其中有一些应用可能还不是问题,但是对SIP的语音通信来讲,这是一个非常具有挑战性的难题。为了帮助读者尽快了解这些相关的技术细节,我们尽可能在有限的篇幅中对NAT提供多角度,多维度的讨论,帮助用户尽快了解这些必要的技术。
  今天,我们将重点讨论以下几个方面的内容,它们包括:防火墙,关于NAT的相关基础概念,UDP 打洞介绍,NAT的类型。
  1、请读者注意,这里我们讨论所有的相关细节时不会介绍太多和本话题不相关的技术内容,所以,笔者建议用户首先了解一般的网络环境和知识点,以免引起造成困扰。在讨论NAT之前,我们首先解释一下关于为什么防火墙的对NAT处理有影响。以下图例解释了一个简单的防火墙的工作拓扑图:
  这里,防火墙置于企业网络边界的地方,防火墙的工作就是保护公司内网的安全。关于防火墙的具体功能和配置,我们这里不再介绍。但是,为了配合SIP的相关话题,我们这里再次强调一下关于防火墙的使用环境的问题,一般意义上,防火墙的应该是:
  • 防火墙对网络数据进行策略管理,数据流量管理。
  • 防火墙对某些设备进行权限的设置管理。
  • 防火墙一般允许内网用户访问外网,同时允许内网访问外网时返回的数据进入到内网。
  • 防火墙通常允许HTTP,SMTP这些一般的工作应用业务进行数据传输。
  • 防火墙通常对SIP不太友好,可能过滤SIP端口,RTP 端口。

  • 防火墙只能对外网进行保护,但是不能对内网软件病毒或者其他内网设备发起的攻击进行保护。所以,进来避免在内部电脑安装其他的未授权的第三方软件。
  2、大家知道,如果我们给公司公网申请一个固定IP地址的话是需要付费的,IP地址是一个紧缺资源,IPv4的地址资源已经非常紧缺。通常情况下,一个可以上网的网络环境至少需要一个公网的地址,这个公网地址对应内部网络地址(Class A, Class B 和Class C)进行转换。RFC 6314 和RFC 4787对NAT做了规范。
  为了实现一个公网地址对应多个内网地址来实现正常的网络访问,我们必须使用一个NAT的机制,我们简单称之为网络地址转换(1:N),通过NAT可以实现公网地址转换为内网地址的作用。关于更多的NAT介绍,读者可以参考网络上的学习资料学习,这里不做过多讨论。根据德国研究人员Florian Wohlfart对一般小型企业和家庭用户对NAT的测试,根据网络的不同,NAT过滤的比例也完全不同,所以NAT确实影响了数据的正常互通。
  以下是一个内网终端访问外网的IP状态,读者通过以下图例可以看到,内网地址在通过防火墙到公网,然后到达另外一个公网地址时,自己的内网IP地址已经给替换成了公网的IP地址。在公网出局之前,内网地址会被过滤。
  对端网络响应的消息将会返回到防火墙,然后通过路由器策略返回到请求的终端IP地址。
  上面,我们看到的是终端和服务器端的互通,现在我们看看两个带NAT的终端直接互通的实现方式。在以下的示例中,两个带NAT的终端都需要注册到公网以外的服务器,然后实现正常的通信流程。
  如果两个终端需要直接互通的话,可以对服务器发出请求,然后服务器对其注册策略进行调整,让两个终端可以自己直接协商,两个终端设备打洞以后实现双方的直接互通。下面,我们介绍几个不同NAT的流程处理方式:
  同一NAT Hole Punching的一个具体流程:
  不同NAT环境下 Hole Punching的处理流程:
  多层NAT处理流程和一层NAT的处理机制基本上相同,但是多了一层协商的机制。网络环境也变得更加复杂。
  我们一直讨论再不停解释协商的概念,大家知道,UDP是一种不可靠的传输方式,需要端口一直处于存活状态。如果打开的洞好久时间没有数据交换,可能这个洞就会关闭。所以在UDP的打洞时也使用了定时器的开关来保证一定时间内这个洞是开放的状态。但是,不幸的是,很多NAT设备的设置和定时器的设置可能都不完全相同,一些设备的NAT的定时器设置一般为20秒,如果为了保证会话一直存活的话,可能需要调整定时器的时间长度,在网络中不停发送keep-live的数据包,可能在很短早期需要再次重新发送这些数据包,让打开的这个洞一直参与存活状态。但是,更为不幸的是,这样的做法同样生成很多的无效数据,耗费了很多网络资源。
  上面我们讨论了关于UDP 打洞的几个方式和UDP打洞的定时器设置问题。既然有关于UDP的打洞的方式就会有基于TCP的打洞方式。关于TCP的方式,因为篇幅的关系,而且在我们的SIP案例中的使用量不多,所以,我们这里不再继续展开讨论。读者可以参考Bryan Ford 发表的文章做进一步的研究,他的文章也讨论了关于基于UDP打洞和TCP打洞的测试方式和测试流程。
  根据Bryan发表的完整,在实际生产环境中,用户对各种路由器的使用比例做了一个统计,以下是统计结果:
  在使用点对点处理打洞的方法上,业内有很多公司也使用了UDP Hole Punching 来保证用户的连接效果。Tribler的测试结果可以作为一个参考,根据它们官方数据,成功率都在85%以上。Tribler使用的具体测试方法和工具,请读者查阅参考资料链接。
  下面,我们结合一些我们经常使用的场景来形象化地解释一下打洞的实现方式。这些场景可能是:点对点的通信,或者服务器端的的Bypass功能。以下图例是经过双方协商以后,实现双方互通的流程。
  如果终端都在同一NAT的内网环境中,系统也可以实现互通连接。这里,我们拿一个目前最为典型的云托管的FreePBX举例。如果两个终端都在同一内网,而且带NAT环境。首先,两个终端都需要实现SIP信令的连接,确保连接成功。
  在这种情况下,IPPBX可以支持内网之间的互通,两个同一内网的终端就可以实现语音或视频的通话。这样相对节省了很多网络的资源。但是,也存在很多缺点,例如,影响计费功能,影响系统录音功能。关于IPPBX终端直接互通的功能的设置和影响,我们在以前的Asterisk功能设置的讲座中已经提及,这里不再继续讨论。
  但是,在现实的网络环境中,我们的网络架构也远远不是我们介绍的那样简单。很多网络已经涉及了多个NAT的环境,多个网络地址,而且不同的防火墙对SIP的过滤也有所不同。
  在实际运行环境中,比较典型的实例就是关联了SIP内网地址,如果内网的终端SIP消息在出局时,防火墙经过了NAT以后,相关的内网SIP 头消息都会被丢弃或者修改(Via,Contact,SDP中的c),发送出去的只有公网IP地址的消息。如果外网终端返回响应的消息时,路由器就可能丢弃这些无效的消息,或者无法做出路由策略的判断,返回的消息也不知道如何路由到内网相应的终端。
  3、刚才,我们介绍了NAT对SIP的影响,现在,我们介绍一下NAT的四种类型和各自的不同。完整的NAT类型的定义可以参考维基百科的定义。
  根据以下图例我们可以看到,不同的NAT类型,对IP地址和端口的定义是完全不一样的,通过不同的IP地址和端口的组合限制来确定NAT的类别。
  以上图例来自思科网络资料
  简单来说,以上四种类型的定义为:
  • Full Cone来自网络所有的请求都转发到一个内网地址,IP地址,端口都不受到限制。
  • Restricted Cone则限定某些外网的IP可以可以转发到相应的一个内网地址,端口可以变动。
  • Port Restricted Cone则要求具体的IP地址和端口都限定。
  • Symmetric Cone则可以同时支持多个IP地址/端口的版本,端口和IP地址必须是一组的限定。
  从几个类型的定义看,NAT类型对网络的要求是完全不同的,Full Cone是最为宽松的,而Symmetric是最为严格的。我们这里根据不同的颜色和字体表示对NAT转换的宽松程度。当然,越来越宽松势必带来很多的网络安全隐患问题和其他的问题。
  运营商或者网络本身也有对NAT的很多方面的限制。几年前,德国研究人员在德国和美国针对中小型企业和家庭网络调查得出的各种NAT的比例:
 Tribler 公司对用户做的NAT环境的调查结果,几种NAT对用户网络的影响:
  • 基于全球的NAT分布状态:
  • 因为NAT连接超时的频率:

  • 尽管NAT问题非常复杂,很多商业公司提供了NAT测试的工具,用户可以下载测试。Nattest 公司提供关于NAT检测的一些解决方案,这家公司也提供检测NAT的工具检测超时,端口存活等状态数据。
  • 客户端对服务器端发送请求,服务器端返回响应消息。这样的交互大约要互相发送100多次,才能获取到真实的数据。
  以下是检测关闭的测试流程。
  4、在上一个部分我们介绍了NAT的几种类型,现在我们主要针对SIP终端结合NAT做一个简单的介绍。以下图例简单解释了SIP失败的原因,用户可以查阅RFC6314对NAT做更多了解。
  以下图例表示了UA呼叫外网的NAT类型,full cone 对所有外网开发。
  以下图例限定仅对IP地址开发,即使用户使用不同的端口。
  以下图例限定了用户使用的端口和IP地址。
  以下图例说明用户同时限定了在同一会话时IP地址和端口的匹配。
  总结,在本章节中我们介绍了关于防火墙的基本概念,另外,我们也讨论了NAT的形成和一些关于NAT的打洞的技术讨论,以及市场上各种NAT所在比例,我们还通过各种图例结合SIP场景介绍了NAT的几种类型。通过以上对NAT的完整介绍,笔者希望用户对NAT有一个完整的概念。在接下来的章节中,我们将介绍如何通过各种解决方案来解决NAT的问题。
  参考资料:
  https://tools.ietf.org/html/rfc6314
  https://tools.ietf.org/html/rfc4787
  http://www.brynosaurus.com/pub/net/p2pnat.pdf
  http://conferences.sigcomm.org/co-next/2013/workshops/HotMiddlebox/program/p43.pdf
  https://www.tribler.org/NATMeasurements/
  http://www.ds.ewi.tudelft.nl/reports/2010/PDS-2010-007.pdf
  更多开源VOIP行业知识,请关注我们的微信号:asterisk-cn, 访问技术论坛:www.issabel.cn/forum 获得开源融合通信软件。
【免责声明】本文仅代表作者本人观点,与CTI论坛无关。CTI论坛对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

专题