下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

深入讲解NAT原理与NAT穿越

作者:课课家教育     来源: http://www.kokojia.com点击数:1600发布时间: 2017-06-11 08:00:57

标签: NAT服务器通信

  NAT穿越(NATtraversal)涉及TCP/IP网络中的一个常见问题,即在处于使用了NAT设备的私有TCP/IP网络中的主机之间建立连接的问题。

最近在看东西的时候发现很多网络程序中都需要NAT穿越,特意在此总结一下。

  先做一个约定:

  内网A中有:A1(192.168.0.8)、A2(192.168.0.9)两用户

  网关X1(一个NAT设备)有公网IP1.2.3.4

  内网B中有:B1(192.168.1.8)、B2(192.168.1.9)两用户,

  网关Y1(一个NAT设备)有公网IP1.2.3.5

  公网服务器:C(6.7.8.9)D(6.7.8.10)

  NAT原理

  网络地址转换(NAT,NetworkAddressTranslation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术。下面介绍两类不同方式实现的NAT:

  NAT(NetworkAddressTranslators):称为基本的NAT

深入讲解NAT原理与NAT穿越_NAT_服务器_通信_课课家教育

  在客户机时192.168.0.8:4000——6.7.8.9:8000

  在网关时1.2.3.4:4000——6.7.8.9:8000

  服务器C6.7.8.9:8000

  其核心是替换IP地址而不是端口,这会导致192.168.0.8使用4000端口后,192.168.0.9如何处理?具体参考RFC1631

  基本上这种类型的NAT设备已经很少了。或许根本我们就没机会见到。

  2.NAPT(NetworkAddress/PortTranslators):其实这种才是我们常说的NAT

  NAPT的特点是在网关时,会使用网关的IP,但端口会选择一个和临时会话对应的临时端口。如下图:

NAPT的特点是在网关时,会使用网关的IP,但端口会选择一个和临时会话对应的临时端口。如下图

  在客户机时192.168.0.8:4000——6.7.8.9:8000

  在网关时1.2.3.4:62000——6.7.8.9:8000

  服务器C6.7.8.9:8000

  网关上建立保持了一个1.2.3.4:62000的会话,用于192.168.0.8:4000与6.7.8.9:8000之间的通讯。

  对于NAPT,又分了两个大的类型,差别在于,当两个内网用户同时与8000端口通信的处理方式不同:

  2.1、SymmetricNAT型(对称型)

对于NAPT,又分了两个大的类型,差别在于,当两个内网用户同时与8000端口通信的处理方式不同:

  在客户机时192.168.0.8:4000——6.7.8.9:8000192.168.0.8:4000——6.7.8.10:8000

  在网关时,两个不同session但端口号不同1.2.3.4:62000——6.7.8.9:80001.2.3.4:62001——6.7.8.10:8000

  服务器C6.7.8.9:8000

  服务器D6.7.8.10:8000

  这种形式会让很多p2p软件失灵。

  2.2、ConeNAT型(圆锥型)

在客户机时192.168.0.8:4000——6.7.8.9:8000192.168.0.8:4000——6.7.8.10:8000

  在客户机时192.168.0.8:4000——6.7.8.9:8000192.168.0.8:4000——6.7.8.10:8000

  在网关时,两个不同session但端口号相同1.2.3.4:62000——6.7.8.9:80001.2.3.4:62000——6.7.8.10:8000

  服务器C6.7.8.9:8000

  服务器D6.7.8.10:8000

  目前绝大多数属于这种。ConeNAT又分了3种类型:

  a)FullConeNAT(完全圆锥型):从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000,192.168.0.8可以收到任意外部主机发到1.2.3.4:62000的数据报。

  b)AddressRestrictedConeNAT(地址限制圆锥型):从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000,只有当内部主机192.168.0.8先给服务器C6.7.8.9发送一个数据报后,192.168.0.8才能收到6.7.8.9发送到1.2.3.4:62000的数据报。

  c)PortRestrictedConeNAT(端口限制圆锥型):从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000,只有当内部主机192.168.0.8先向外部主机地址端口6.7.8.9:8000发送一个数据报后,192.168.0.8才能收到6.7.8.9:8000发送到1.2.3.4:62000的数据报。

  穿越NAT的意义:

  NAT是为了节省IP地址而设计的,但它隐藏了内网机器的地址,“意外”起到了安全的作用。对外不可见,不透明的内部网络也与互联网的“公平”应用,“相互共享”的思想所不容,尤其是P2P网络中“相互服务”的宗旨,所以穿越NAT,让众多内部网络的机器也参与到P2P网络中的大集体中来,一直是P2P开发者的所希望的。穿越NAT需要借助外部的支持,说白了就是“内外勾结”,骗过NAT。很多P2P网络成功地实现了这一目标,但还是有一些“遗憾”---并非所有的情况下都可以。由于客户端是主动登录P2P网络才可穿越,所以P2P的方式也没有违背企业的内部管理原则,毕竟“自由世界”的加入都是自觉自愿的。

  穿越NAT的实现

PortRestrictedConeNAT(端口限制圆锥型):从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000,只有当内部主机192.168.0.8先向外部主机地址端口6.7.8.9:8000发送一个数据报后,192.168.0.8才能收到6.7.8.9:8000发送到1.2.3.4:62000的数据报。

  A1在客户机时192.168.0.8:4000——6.7.8.9:8000

  X1在网关时1.2.3.4:62000——6.7.8.9:8000

  服务器C6.7.8.9:8000

  B1在客户机时192.168.1.8:4000——6.7.8.9:8000

  Y1在网关时1.2.3.5:31000——6.7.8.9:8000

  两内网用户要实现通过各自网关的直接呼叫,需要以下过程:

  1、客户机A1、B1顺利通过格子网关访问服务器C,均没有问题(类似于登录)

  2、服务器C保存了A1、B1各自在其网关的信息(1.2.3.4:62000、1.2.3.5:31000)没有问题。并可将该信息告知A1、B2。

  3、此时A1发送给B1网关的1.2.3.5:31000是否会被B1收到?答案是基本上不行(除非Y1设置为完全圆锥型,但这种设置非常少),因为Y1上检测到其存活的会话中没有一个的目的IP或端口于1.2.3.4:62000有关而将数据包全部丢弃!

  4、此时要实现A1、B1通过X1、Y1来互访,需要服务器C告诉它们各自在自己的网关上建立“UDP隧道”,即命令A1发送一个192.168.0.8:4000——1.2.3.5:31000的数据报,B1发送一个192.168.1.8:4000——1.2.3.4:62000的数据报,UDP形式,这样X1、Y1上均存在了IP端口相同的两个不同会话(很显然,这要求网关为ConeNAT型,否则,对称型SymmetricNAT设置网关将导致对不同会话开启了不同端口,而该端口无法为服务器和对方所知,也就没有意义)。

  5、此时A1发给Y1,或者B1发给X1的数据报将不会被丢弃且正确的被对方收到.

  综合P2P可实现的条件需要:

  1、中间服务器保存信息、并能发出建立UDP隧道的命令

  2、网关均要求为ConeNAT类型。SymmetricNAT不适合。

  3、完全圆锥型网关可以无需建立udp隧道,但这种情况非常少,要求双方均为这种类型网关的更少。

  4、假如X1网关为SymmetricNAT,Y1为AddressRestrictedConeNAT或FullConeNAT型网关,各自建立隧道后,A1可通过X1发送数据报给Y1到B1(因为Y1最多只进行IP级别的甄别),但B2发送给X1的将会被丢弃(因为发送来的数据报中端口与X1上存在会话的端口不一致,虽然IP地址一致),所以同样没有什么意义。

  5、假如双方均为SymmetricNAT的情形,新开了端口,对方可以在不知道的情况下尝试猜解,也可以达到目的,但这种情形成功率很低,且带来额外的系统开支,不是个好的解决办法。

  6、不同网关型设置的差异在于,对内会采用替换IP的方式、使用不同端口不同会话的方式,使用相同端口不同会话的方式;对外会采用什么都不限制、限制IP地址、限制IP地址及端口。

  7、这里还没有考虑同一内网不同用户同时访问同一服务器的情形,如果此时网关采用AddressRestrictedConeNAT或FullConeNAT型,有可能导致不同用户客户端可收到别人的数据包,这显然是不合适的。

  一些现在常用的技术:

  ALG(应用层网关):它可以是一个设备或插件,用于支持SIP协议,主要类似与在网关上专门开辟一个通道,用于建立内网与外网的连接,也就是说,这是一种定制的网关。更多只适用于使用他们的应用群体内部之间。

  UpnP:它是让网关设备在进行工作时寻找一个全球共享的可路由IP来作为通道,这样避免端口造成的影响。要求设备支持且开启upnp功能,但大部分时候,这些功能处于安全考虑,是被关闭的。即时开启,实际应用效果还没经过测试。

  STUN(SimpleTraversalofUDPThroughNetwork):这种方式即是类似于我们上面举例中服务器C的处理方式。也是目前普遍采用的方式。但具体实现要比我们描述的复杂许多,光是做网关Nat类型判断就由许多工作,RFC3489中详细描述了。

  TURN(TraveralUsingRelayNAT):该方式是将所有的数据交换都经由服务器来完成,这样NAT将没有障碍,但服务器的负载、丢包、延迟性就是很大的问题。目前很多游戏均采用该方式避开NAT的问题。这种方式不叫p2p。

  ICE(InteractiveConnectivityEstablishment):是对上述各种技术的综合,但明显带来了复杂性。

  ICE是目前在NAT穿透中最常用的方式。ICE(交互式连接建立)-InteractiveConnectivityEstablishment是一种综合性的NAT穿越的技术。交互式连接建立是由IETF的MMUSIC工作组开发出来的一种framework,可整合各种NAT穿透技术,如STUN、TURN(TraversalUsingRelayNAT)、RSIP(RealmSpecificIP,特定域IP)等。该framework可以让SIP的客户端利用各种NAT穿透方式打穿远程的防火墙。

  更多详细内容,尽在课课家教育,我们期待您的咨询!

赞(28)
踩(0)
分享到:
上一篇:深入了解VLAN
华为认证网络工程师 HCIE直播课视频教程