1.单一网络环境
如上图,手机APP和IP话机通过SIP注册消息,向服务器提供自身的IP地址,服务器将注册地址保存起来,两个终端互相通话没有什么问题。
2. 服务器处于公网环境

NAT设备会将IP数据包头的地址和端口,换成外网的地址和端口,但是服务器正常情况下采用的SIP注册消息中携带的地址作为终端地址,此时两个终端连注册都无法成功,服务器在SIP注册消息中获取的是局域网IP地址,发出的200 OK无法抵达终端设备。
这里涉及三个角色,有各自的办法可解决NAT穿透问题:
1)终端设备侧
采用STUN服务,STUN的原理是:在公网上部署一个STUN服务器,位于NAT后面的客户端设备向它发送一系列的UDP包先在NAT设备上“打洞”,STUN服务器取到UDP包的来源地址后,回送相关的消息告诉该客户端它被映射的外网地址。使用STUN后,SIP消息的contact头域中就可以直接填入外网地址。

注意,STUN技术在对称型NAT设备中是无能为力的,因为学习到的外网IP地址会失效,此时需要和TURN中继服务配合使用。
2)NAT设备侧
应用层网关(ALG)是解决NAT对应用层协议无感知的一个最常用方法,已经被NAT设备厂商广泛采用,通过感知应用层协议,对报文深层的内容进行检查,当发现任何形式表达的IP地址和端口时,将会把这些信息同步转换,并且为这个新连接创建一个附加的转换表项。

注意,NAT设备的ALG无法解决私有协议或加密协议的穿越问题。
3)服务器侧
融合通信服务器通过开启NAT检测功能,内含nat.auto是一个ACL,包含了RFC1918规定的私网地址,并去掉了本地网络的地址。当SIP终端注册时,通过比较contact地址是否包含在此ACL中来判定该终端是否处于NAT背后,如果是那么它就把contact地址自动替换为SIP包的来源地址,信令就可以正常抵达。

3. 服务器处于内网NAT环境
当服务器处于内网环境时,服务器的解决办法有:STUN、直接配置外网地址,同时服务器还支持Upnp协议,需要NAT设备支持该协议并开启,该协议允许应用程序向NAT设备申请并管理内外网地址、端口映射。

之所以要配置端口转发,是因为NAT设备的特性决定了只能内网主机接触过的外网主机才能向内发数据,而融合通信系统首先发起注册的是终端设备。
4.服务器和客户顿都处于NAT环境
测试环境中很多都是这个网络环境,但是实际部署的环境通常却比较简单。

这样的结构,将解决NAT穿透的问题主要交给了服务器侧,因为终端设备的种类多,无法让所有终端都自行解决穿透问题。