[转]NAT穿透的详细讲解及分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[转]NAT穿透的详细讲解及分析相关的知识,希望对你有一定的参考价值。

参考技术A 原文链接:http://bbs.pediy.com/thread-131961.htm

一、什么是NAT?为什么要使用NAT?

NAT是将私有地址转换为合法IP地址的技术,通俗的讲就是将内网与内网通信时怎么将内网私有IP地址转换为可在网络中传播的合法IP地址。NAT的出现完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。

二、NAT的分类

STUN标准中,根据内部终端的地址(LocalIP:LocalPort)到NAT出口的公网地址(PublicIP:PublicPort)的影射方式,把NAT分为四种类型:

1、Full Cone NAT: 内网主机建立一个socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,任何外部主机只要知道这个(PublicIP:PublicPort)就可以发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包。

2、Restricted Cone NAT: 内网主机建立一个socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,如果任何外部主机想要发送数据给这个内网主机,只要知道这个(PublicIP:PublicPort)并且内网主机之前用这个socket曾向这个外部主机IP发送过数据。只要满足这两个条件,这个外部主机就可以用自己的(IP,任何端口)发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包。

3、Port Restricted Cone NAT: 内网主机建立一个socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,如果任何外部主机想要发送数据给这个内网主机,只要知道这个(PublicIP:PublicPort)并且内网主机之前用这个socket曾向这个外部主机(IP,Port)发送过数据。只要满足这两个条件,这个外部主机就可以用自己的(IP,Port)发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包。

4、Symmetric NAT: 内网主机建立一个socket(LocalIP,LocalPort),当用这个socket第一次发数据给外部主机1时,NAT为其映射一个(PublicIP-1,Port-1),以后内网主机发送给外部主机1的所有数据都是用这个(PublicIP-1,Port-1),如果内网主机同时用这个socket给外部主机2发送数据,NAT会为其分配一个(PublicIP-2,Port-2), 以后内网主机发送给外部主机2的所有数据都是用这个(PublicIP-2,Port-2).如果NAT有多于一个公网IP,则PublicIP-1和PublicIP-2可能不同,如果NAT只有一个公网IP,则Port-1和Port-2肯定不同,也就是说一定不能是PublicIP-1等于 PublicIP-2且Port-1等于Port-2。此外,如果任何外部主机想要发送数据给这个内网主机,那么它首先应该收到内网主机发给他的数据,然后才能往回发送,否则即使他知道内网主机的一个(PublicIP,Port)也不能发送数据给内网主机,这种NAT无法实现P2P通信,但是如果另一方是Full Cone NAT,还是可以实现穿透的,下面我会详细分析各种类型NAT穿透的情况。

NAT 功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。所以我们大家很少会知道NAT,上面NAT类型的概念描述是比较通俗的,但为了更便于理解,我再举例阐述一下NAT的原理。

现有通信的双方A和B,当A和B都是在公网的时候,通信是不用NAT的。假设A在内网,内网IP是192.168.1.3,端口号是5000,A经过NAT后的IP是221.221.221.100,端口号是8000,B的IP是202.105.124.100,端口是8500。如果B要去主动连接A,即使B知道A经过NAT后的IP和端口也是无法连接成功的,因为A没有向B(202.105.124.100:8500)发送过数据,所以B的数据包会被A的NAT丢弃,于是连接失败。但是A如果去主动连接B,由于B是在公网,所以会连接成功,通信也就会建立。这也就是反弹连接木马“反弹”二字的精髓。

当客户端A和B都是处在内网的时候,双方由于都不知道对方的公网IP和端口,就会无从下手,所以要在客户端A和B之间架设一台服务器S来为它们牵线,而且S是处在公网,以保证A和B都能连接到S。客户端A和B登录时都首先连接S,S就会知道A和B经过NAT后的IP和端口,当A想要连接B时,就像S发出请求,S会把B经过NAT后的IP和端口告诉A,同时S向B发送A经过NAT后的IP和端口,并要求B发送数据给A,B发送数据到达A时会被A的NAT抛弃,但是B的NAT会有B发送数据到A的记录,这是A再向B发送数据时就会被B的NAT放行,因为B曾经向A的外网IP和端口发送过数据。可能有点乱,下面以故事的形式叙述一下这个情景。

人物:A(男) NAT_A(A家接线员)  B(女) NAT_B  (B家接线员) S

场景介绍:A想认识B,但是不知道B的电话,S跟A、B都是朋友,并且知道A和B的电话。接线员的职责:对往外转接的电话不做询问,对往内转接的电话则要过滤以免有骚扰电话。过滤规则:在一定时间内没有拨打过的号码就过滤。

首先A给S打电话:

A说:我想认识你朋友B,你把她电话给我呗。

S说:行,她的电话是PublicIP_B,我让她先给你打个电话,要不她家接线员不帮你转接。

A说:好。

S跟B打电话:

S说:我有一个朋友A,人挺好的,他想认识你,你给他打个电话,他的电话号码是PublicIP_A。

B说:行,打完告诉你。

S说:好的。

B打电话到A家,B家接线员NET_B看到女主人想往PublicIP_A打电话就转接到A家了,同时把号码PublicIP_A记录下来,A家接线员NAT_A一看号码是个近期没打过的号,就给挂断了。

B给S打电话:

B说:我打完电话了

S说:好,等着吧,一会他就给你打进来了。

S给A打电话:

S说:他给你打完电话了,你快点给她打。

A打电话到B家, A家接线员NET_A看到男主人想往PublicIP_B打电话就转接到B家了,B家接线员NET_B看到是刚刚拨过的PublicIP_A号码打过来的,就转接给B了,A和B的电话也就打通了。

A和B通话:

A说:电话终于打通了,想认识你挺困难的。

B说:是啊。





以上虽然和实际不太一样,但穿透的整体过程基本就是这样。A往B发送数据的唯一阻碍就是NET_B,所以想要成功发送数据,必须把NET_B穿一个洞,A是无法完成这项工作的,所以就得让B完成这个打洞操作,也就是让B往A发送数据,这样NET_B就会误以为A发送的数据是上次会话的一部分从而不予阻拦。

但是,由于NAT的类型没有一个统一的标准,所以NAT穿透使用的技术有很多种,穿透的成功率也不一样。还有些NAT类型的内网之间几乎无法穿透。下面我们用实例详细分析一下各种NAT类型穿透的可行性。

A机器在私网(192.168.0.3)

A侧NAT服务器(221.221.221.100)

B机器在另一个私网(192.168.0.5)

B侧NAT服务器(210.30.224.70)

C机器在公网(210.202.14.36)作为A和B之间的中介

A机器连接C机器,假使是A(192.168.0.3:5000)-> A侧NAT(转换后221.221.221.100:8000)-> C(210.202.14.36:2000)

B机器也连接C机器,假使是B(192.168.0.5:5000)-> B侧NAT(转换后210.30.224.70:8000)-> C(210.202.14.36:2000)

A机器连接过C机器后,A向C报告了自己的内部地址(192.168.0.3:5000),此时C不仅知道了A的外部地址(C通过自己看到的221.221.221.100:8000)也知道了A的内部地址。同理C也知道了B的外部地址(210.30.224.70:8000)和  内部地址(192.168.0.5:5000)。之后,C作为中介,把A的两个地址告诉了B,同时也把B的两个地址告诉了A。

假设A先知道了B的两个地址,则A从192.168.0.3:5000处同时向B的两个地址192.168.0.5:5000和210.30.224.70:8000发包,由于A和B在两个不同的NAT后面,故从A(192.168.0.3:5000)到B(192.168.0.5:5000)的包肯定不通,现在看A(192.168.0.3:5000)到B(210.30.224.70:8000)的包,分如下两种情况:

1、B侧NAT属于Full  Cone  NAT

则无论A侧NAT属于Cone  NAT还是Symmetric  NAT,包都能顺利到达B。如果程序设计得好,使得B主动到A的包也能借用A主动发起建立的通道的话,则即使A侧NAT属于Symmetric  NAT,B发出的包也能顺利到达A。

结论1:只要单侧NAT属于Full  Cone  NAT,即可实现双向通信。

2、B侧NAT属于Restricted  Cone或Port  Restricted  Cone

则包不能到达B。再细分两种情况

(1)、A侧NAT属于Restricted  Cone或Port  Restricted  Cone

虽然先前那个初始包不曾到达B,但该发包过程已经在A侧NAT上留下了足够的记录:A(192.168.0.3:5000)->(221.221.221.100:8000)->B(210.30.224.70:8000)。如果在这个记录没有超时之前,B也重复和A一样的动作,即向A(221.221.221.100:8000)发包,虽然A侧NAT属于Restricted  Cone或Port Restricted Cone,但先前A侧NAT已经认为A已经向B(210.30.224.70:8000)发过包,故B向A(221.221.221.100:8000)发包能够顺利到达A。同理,此后A到B的包,也能顺利到达。

结论2:只要两侧NAT都不属于Symmetric  NAT,也可双向通信。换种说法,只要两侧NAT都属于Cone  NAT,即可双向通信。

(2)、A侧NAT属于Symmetric  NAT

因为A侧NAT属于Symmetric  NAT,且最初A到C发包的过程在A侧NAT留下了如下记录:A(192.168.0.3:5000)->(221.221.221.100:8000)-> C(210.202.14.36:2000),故A到B发包过程在A侧NAT上留下的记录为:

A(192.168.0.3:5000)->(221.221.221.100:8001)->B(210.30.224.70:8000)(注意,转换后端口产生了变化)。而B向A的发包,只能根据C给他的关于A的信息,发往A(221.221.221.100:8000),因为A端口受限,故此路不通。再来看B侧NAT,由于B也向A发过了包,且B侧NAT属于Restricted  Cone或Port  Restricted  Cone,故在B侧NAT上留下的记录为:B(192.168.0.5:5000)->(210.30.224.70:8000)->A(221.221.221.100:8000),此后,如果A还继续向B发包的话(因为同一目标,故仍然使用前面的映射),如果B侧NAT属于Restricted  Cone,则从A(221.221.221.100:8001)来的包能够顺利到达B;如果B侧NAT属于Port  Restricted  Cone,则包永远无法到达B。

结论3:一侧NAT属于Symmetric  NAT,另一侧NAT属于Restricted  Cone,也可双向通信。

反过来想,则可以得出另一个结论:两个都是Symmetric NAT或者一个是Symmetric  NAT、另一个是Port Restricted Cone,则不能双向通信,因为NAT无法穿透。

上面的例子虽然只是分析了最初发包是从A到B的情况,但是,由于两者的对称性,前面得出的几条结论没有方向性,双向都适用。

我们上面得出了四条结论,natcheck网站则把他归结为一条:只要两侧NAT都属于Cone  NAT(含Full  Cone、Restricted  Cone和Port  Restricted  Cone三者),即可双向通信。没有把我们的结论3包括进去。

一般情况下,只有比较注重安全的大公司会使用Symmetric NAT,禁止使用P2P类型的通信,很多地方使用的都是Cone  NAT,因此穿透技术还是有发展前景的。

三、使用UDP、TCP穿透NAT

上面讲的情况可以直接应用于UDP穿透技术中,使用TCP 协议穿透NAT 的方式和使用UDP 协议穿透NAT 的方式几乎一样,没有什么本质上的区别,只是将无连接的UDP 变成了面向连接的TCP 。值得注意是:

1、 B在向A打洞时,发送的SYN 数据包,而且同样会被NAT_A 丢弃。同时,B需要在原来的socket 上监听,由于重用socket ,所以需要将socket 属性设置为SO_REUSEADDR 。

A向B发送连接请求。同样,由于B到A方向的孔已经打好,所以连接会成功,经过3 次握手后,A到B之间的连接就建立起来了。具体过程如下:

1、 S启动两个网络侦听,一个叫【主连接】侦听,一个叫【协助打洞】的侦听。

2、 A和B分别与S的【主连接】保持联系。

3、 当A需要和B建立直接的TCP连接时,首先连接S的【协助打洞】端口,并发送协助连接申请。同时在该端口号上启动侦听。注意由于要在相同的网络终端上绑定到不同的套接字上,所以必须为这些套接字设置 SO_REUSEADDR 属性(即允许重用),否则侦听会失败。

4、 S的【协助打洞】连接收到A的申请后通过【主连接】通知B,并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B。

5、 B收到S的连接通知后首先与S的【协助打洞】端口连接,随便发送一些数据后立即断开,这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。

6、 B尝试与A的经过NAT-A转换后的公网IP地址和端口进行connect,大多数路由器对于不请自到的SYN请求包直接丢弃而导致connect失败,但NAT-B会纪录此次连接的源地址和端口号,为接下来真正的连 接做好了准备,这就是所谓的打洞,即B向A打了一个洞,下次A就能直接连接到B刚才使用的端口号了。

7、 客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通过与S的【主连接】回复消息“我已经准备好”,S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A。

8、 A收到S回复的B的公网IP和端口号等信息以后,开始连接到B公网IP和端口号,由于在步骤6中B曾经尝试连接过A的公网IP地址和端口,NAT-B纪录了此次连接的信息,所以当A主动连接B时,NAT-B会认为是合法的SYN数据,并允许通过,从而直接的TCP连接建立起来了。

参考网址:

http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt

http://www.vckbase.com/document/viewdoc/?id=1773

NAT穿透技术穿透原理和方法详解

1、NAT分类

推荐视频

P2P技术—NAT原理,NAT类型,网络穿透原理

从50道腾讯面试题,分析腾讯c++后端工程的技能树

学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

1.1 基础型NAT

仅将内网主机的私有IP地址转换成公网的IP地址,并不将TCP/UDP端口信息进行转换,分为静态NAT和动态NAT。

1.2 NAPT

NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。

1.2.1锥型NAT

  • 完全锥型(Full Cone NAT):在不同内网的主机A和B各自连接到服务器C,服务器收到A和B的连接后知道了他们的公网地址和NAT分配给他们的端口号,然后把这些NAT地址和端口号交叉告诉B和A。A和B给服务器所打开的“孔”可以给任何主机使用。如一私网主机地址是192.168.1.100:30000发至公网的所有请求都映射成一个公网地址172.1.20.100:20000,192.168.1.100:30000可以接收任何主机发给172.1.20.100:20000的数据报文。
  • 受限制锥型(Restricted cone):主机A和B同样需要各自连接服务器C,同时把A和B的地址告诉B和A,但一般情况下它们只能与服务器通信。要想直接通信需要发送消息给服务器C,如主机A发送一个UDP消息到主机B的公网地址上,与此同时,A又通过服务器C中转发送一个邀请信息给主机B,请求主机B也给主机A发送一个UDP消息到主机A的公网地址上。这时主机A向主机B的公网IP发送的信息导致NAT A打开一个处于主机A的和主机B之间的会话,与此同时,NAT B也打开了一个处于主机B和主机A的会话。一旦这个新的UDP会话各自向对方打开了,主机A和主机B之间才可以直接通信。
  • 端口受限锥型(Port-restricted):与受限制锥型类似,与之不同的是还要指定端口号。

1.2.2对称NAT(Symmetric)

对不同的外网IP地址都会分配不同的端口号。

1.2.3 两者区别

对称NAT是一个请求对应一个端口,非对称NAT是多个请求对应一个端口(象锥形,所以叫Cone NAT)。

1.3 安全系数

对称型 > 端口受限锥型 > 受限锥型 > 全锥型

2、网络打洞

2.1 打洞条件

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

网关均要求为Cone NAT类型。Symmetric NAT不适合。

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

  1. 假如X1网关为Symmetric NAT, Y1为Address Restricted Cone NAT 或Full Cone NAT型网关,各自建立隧道后,A1可通过X1发送数据报给Y1到B1(因为Y1最多只进行IP级别的甄别),但B2发送给X1的将会被丢弃(因为发送来的数据报中端口与X1上存在会话的端口不一致,虽然IP地址一致),所以同样没有什么意义。
  2. 假如双方均为Symmetric NAT的情形,新开了端口,对方可以在不知道的情况下尝试猜解,也可以达到目的,但这种情形成功率很低,且带来额外的系统开支,不是个好的解决办法。pwnat工具据说可以实现。
  3. 不同网关型设置的差异在于,对内会采用替换IP的方式、使用不同端口不同会话的方式,使用相同端口不同会话的方式;对外会采用什么都不限制、限制IP地址、限制IP地址及端口。
  4. 这里还没有考虑同一内网不同用户同时访问同一服务器的情形,如果此时网关采用AddressRestricted Cone NAT 或Full Cone NAT型,有可能导致不同用户客户端可收到别人的数据包,这显然是不合适的。

2.2 打洞流程

不同的网络拓扑NAT打洞的方法和流程有所区别。

2.2.1 同一个NAT设备下

  1. clinet A与Server S建立UDP连接,公共NAT(155.99.25.11)给client A分配一个公网端口62000;
  2. client B与Server S建立UDP连接,公共NAT(155.99.25.11)给client A分配一个公网端口62005;
  3. client A通过Server S发送一个消息要求连接client B,S给A回应B的公网和私网地址,并转发A的公网和私网地址给B;
  4. A和B根据获取的地址试图直接发送UDP数据报文;是否成功取决于NAT设备是否支持hairpin translation(端口回流)。——打开端口回流相当于与client A的数据经过NAT设备转发后才到达client B,即从外网NAT接口绕了一圈再访问到同一个子网里的client B。(优点是可以防止内部攻击)

2.2.2 不同NAT设备下

1、A使用4321端口与S连接,NAT给回话在NAT分配外网62000端口(155.99.25.11:62000)与S连接;同理B以相同的方式与S连接,分配的外网地址端口是138.76.29.7:31000。

2、A往S注册消息包里包含里A的私有地址10.0.0.1:4321,此时S保存了A的地址;S给A临时分配了一个用于公网的地址(155.99.25.11:62000),同时用于观察外网数据包。

3、同理B往S注册的消息包里也包含里B的地址,NAT同样给B临时分类了一个外网地址(138.76.29.7:31000)。

4、Client A根据以上已知信息通过打洞的方式与B连接UDP通信:

  1. Client A发送请求消息,寻求连接B;
  2. S给A回应B的外网和内网地址,通给给B发送A的外网和内网地址;
  3. A和B开始利用这些地址尝试直接发送UDP报文给彼此,不幸的是,此时A和B都无法接收对应的消息。因为A和B都是在不同的私有网络中,A和B之前都是与S通信回话,并没有与对方建立回话;即A没有为B打开一个洞,B也没有为A打开一个洞。这个过程的第一个报文需要会被拒绝同时打开对应的“洞”,随后才可以直接通信,具体如下:
  • A给B公网地址(10.0.0.1:4321 to 138.76.29.7:31000)发送的第一个报文,实际上是在A的NAT私有网络上“打洞”来为新识别的地址(10.0.0.1:4321 138.76.29.7:31000) 建立UDP会话,并经主网地址(155.99.25.11:62000 138.76.29.7:31000)来传送。
  • 如果A发送到B的公网地址的消息在B发送到A的第一个消息越过B自己的NAT之前到达B的NAT,那么B的NAT可能会将A的入站消息解释为非请求的传入通信量并丢弃它。
  • 同理,B给A公网地址方法的第一个消息也会在B的NAT上“打洞”来为地址(10.1.1.3:4321, 155.99.25.11:62000)建立回话。
  • 随后可以正常P2P通信。

2.2.3 多层NAT下

说明:NAT C 是一个大型的工业NAT设备,由ISP(Internet Service Provider,互联网服务提供商)部署,用于将许多客户多路复用到几个公共IP地址上。

Client A和client B无法通道NAT A和NAT A进行P2P通信,因为它们属于NAT C的局域网地址,因此client A和client B只能通道NAT C的hairpin translation进行P2P通信,如果NAT C不支持hairpin translation,则它们很难进行P2P通信。

每个客户机像前面方式一样启动到服务器S的连接,引起NAT A和B各自创建一个单独的公共/私有转化——session A-S(18.181.0.31:1234 10.0.0.1:4321)和session B-S(18.181.0.31:1234 10.1.1.3:4321),并引起NAT C为每个会话建立一个公共/私有翻译——session A-S(18.181.0.31:1234 10.0.1.1:45000)和session B-S(18.181.0.31:1234 10.0.1.2:5500)。

  1. 首先client A给client B的公网地址(155.99.25.11:62005)发送消息;
  2. NAT A翻译原数据报文从10.0.0.1:4321带10.0.0.1:45000;
  3. 数据报现在到达NAT C,它识别出数据报的目标地址是NAT C自己翻译的公共地址之一;
  4. 如果NAT C是好的,那么其能翻译出数据报文的源地址和目标地址(155.99.25.11:62000和10.0.1.2:55000),同时通过“回环”返回数据包到私有网络;
  5. NAT B 翻译数据报文得到NAT B私网地址,最终到达client B。
  6. Client B给client A发送数据报文与上述步骤类似。

2.3 打洞组合

不同的NAT组合打洞的方式也有所不同,有点可以打洞,有的则不能打洞,如两个都是对称型设备则无法实现打洞。不同组合打洞结果如下:

3、关联技术

  1. ALG:即应用程序级网关技术:传统的NAT技术只对IP层和传输层头部进行转换处理,但是一些应用层协议,在协议数据报文中包含了地址信息。为了使得这些应用也能透明地完成NAT转换,NAT使用一种称作ALG的技术,它能对这些应用程序在通信时所包含的地址信息也进行相应的NAT转换。主要类似与在网关上专门开辟一个通道,用于建立内网与外网的连接,也就是说,这是一种定制的网关。更多只适用于使用他们的应用群体内部之间。
  2. UpnP:它是让网关设备在进行工作时寻找一个全球共享的可路由IP来作为通道,这样避免端口造成的影响。要求设备支持且开启upnp功能,但大部分时候,这些功能处于安全考虑,是被关闭的。即时开启,实际应用效果还没经过测试。
  3. STUN(Simple Traversalof UDP Through Network):这种方式即是类似于我们上面举例中服务器C的处理方式。也是目前普遍采用的方式。但具体实现要比我们描述的复杂许多,光是做网关Nat类型判断就由许多工作,RFC3489中详细描述了。
  4. TURN(Traveral Using Relay NAT):该方式是将所有的数据交换都经由服务器来完成,这样NAT将没有障碍,但服务器的负载、丢包、延迟性就是很大的问题。目前很多游戏均采用该方式避开NAT的问题。这种方式不叫p2p。
  5. ICE(Interactive Connectivity Establishment):是对上述各种技术的综合,但明显带来了复杂性。

4、其他

4.1 对称NAT设备常用场景

1)使用第三方宽带公司提供的宽带,这类宽带给用户分配的是局域网IP,连接公网的NAT是运营商的,这类运营商一般采用对称NAT。

2)移动互联网,如3G、4G终端设备;

3)大公司路由器一般采用对称NAT;

4.2影响“打洞”的因素

  1. 许多对称nat以一种相当可预测的方式为连续的会话分配端口号,而有时分配到的端口刚好被别的应用使用了。
  2. Client有可能分到多个公网地址,例如:在NAT将公网地址155.99.25.11:62000分配给client A与S的会话之后,NAT可能会将另一个公网地址(如155.99.25.11:62001)分配给A试图发起与B的P2P会话。在这种情况下,依据提供的连接打洞过程将失败,因为后续来自B的传入消息到达NAT A的错误端口号
  3. 其他

以上是关于[转]NAT穿透的详细讲解及分析的主要内容,如果未能解决你的问题,请参考以下文章

GB28181的NAT穿透

GB28181的NAT穿透

GB28181的NAT穿透

NAT 穿透原理

P2P穿透NAT的原理

详解P2P技术中的NAT穿透原理(转载)