NAT 的实现分为四大类:

1. Full ConeNAT                        完全锥形 NAT

2.   Restricted ConeNAT            限制锥形 NAT (可以理解为 IP 限制)

3. Port RestrictedCone NAT    端口限制锥形 NAT  IP+Port 限制)

4.   SymmetricNAT                    对称 NAT,每个内部主机地址端口对和外部主机地址端口对完全相同的报文看作一个连接

其中完全锥形的穿透性最好,而对称形的安全性最高

NAT穿越_第1张图片


假设:

  1. NAT 内的主机  IP 记为 ,使用端口 1000

  2. NAT 网关        IP 记为 NAT ,用于 NAT 的端口池假设为( 5001-5999 

  3. 公网上的主机  IP 记为B ,开放端口 2000

  4. 公网上的主机    IP 记为C ,开放端口 3000

假设主机 先后访问主机  C

)如果是锥形 NAT 

那么成功连接后,状态必然如下:

 1000  —— >  NAT  5001 )—— >  B  2000 

 1000  —— >  NAT  5001 )—— >  C  3000 

也就是说,只要是从 主机的 1000 端口发出的包,经过地址转换后的源端口一定相同。

)如果是对称形 NAT 

连接后,状态有可能(注意是可能,不是一定)如下:

 1000  —— >  NAT  5001 )—— >  B  2000 

 1000  —— >  NAT  5002 )—— >  C  3000 

两者的区别显而易见。

三种CONENAT之间的区别

仍然以上面的网络环境为例, 假设 先与 建立了连接:

 1000  —— >  NAT  5001 )——— >  B  2000 

1 PortRestricted Cone NAT:

只有 B  2000 )发往 NAT  5001 )的数据包可以到达 A  1000 

===========================================================

 2000  —— >  NAT  5001  ——— >   A  1000 

 3000  —— >  NAT  5001    >   A  1000 

 2000  —— >  NAT  5001    >   A  1000 

2 RestrictedCone NAT

只要是从 B 主机发往 NAT  5001 )的数据包都可以到达 A  1000 

==========================================================

 2000  —— >  NAT  5001  ——— >   A  1000 

 3000  —— >  NAT  5001  ——— >   A  1000 

 2000  —— >  NAT  5001    >   A  1000 

3 FullCone NAT

任意地址发往 NAT  5001 )的数据包都可以到达 A  1000 

==========================================================

 2000  —— >  NAT  5001  ——— >   A  1000 

 3000  —— >  NAT  5001  ——— >   A  1000 

 3000  —— >  NAT  5001  ——— >   A  1000 


多层NAT穿透原理

NAT穿越_第2张图片

在客户端A向服务器发送的登陆消息中,包含有客户端A的内网地址二元组信息,即10.0.0.1:4321;服务器会记录下客户端A的内网地址二元组信息,同时会把自己观察到的客户端A的外网地址二元组信息记录下来,即155.99.25.11:62000。同理,服务器也会记录下客户端B的内网地址二元组信息为10.1.1.3:4321和由服务器观察到的客户端B的外网地址二元组信息,155.99.25.11:62005。无论AB二者中的任何一方向服务器发送P2P连接请求,服务器都会将其记录下来的上述的外网和内网地址二元组发送给AB。由公网服务器观察到的AB的公网地址二元组进行打洞操作,用于打洞的数据包将由NAT C进行转发。

当客户端A向客户端B的公网地址二元组{155.99.25.11:62005}发送UDP数据包的时候,NAT A首先把数据包的源地址二元组由A的内网地址二元组{10.0.0.1:4321}转换为公网地址二元组{10.0.1.1:45000},现在数据包到了NAT CNAT C应该可以识别出来该数据包是要发往自身转换过的公网地址二元组,如果NAT C可以给出合理响应的话,NAT C将把该数据包的源地址二元组改为{155.99.25.11:62000},目的地址二元组改为{10.0.1.2:55000},即NAT B公网地址二元组,NAT B最后会将收到的数据包发往客户端B。同样,由B发往A的数据包也会经过类似的过程。

 

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

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

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

3 full cone nat网关可以无需建立udp隧道,但这种情况不安全,而且要双方均为这种类型的网关。

4假如x1A网关为Symmetric NAT y1,y2的网关BAddre***estricted Cone NAT Full Cone NAT型网关,各自建立隧道后,x1可通过A发送数据报给By1(因为B最多只进行IP级别的甄别),但y2发送给A的将会被丢弃(因为发送来的数据报中端口与A上存在会话的端口不一致,虽然IP地址一致),所以这样没有什么意义。

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

6、考虑到同一内网不同用户同时访问同一服务器的情形,如果此时网关采用Addre***estricted Cone NATFull Cone NAT型,有可能导致不同用户客户端可收到别人的数据包,这显然会出现问题。


P2P连通性条件检测: NAT检查工具:http://cc.rtmfp.net/

NAT穿越_第3张图片


Restricted Cone

Port Restricted Cone

symmetric single IP

symmetric multiple IP

Restricted Cone

Yes收发可能混乱

Yes

Yes但不建议

No

Port Restricted Cone

Yes

Yes最佳

No

No

symmetric single IP

Yes

No

No

No

symmetric multiple IP

No

No

No

No