NAT 的实现分为四大类:
1. Full ConeNAT 完全锥形 NAT
2. Restricted ConeNAT 限制锥形 NAT (可以理解为 IP 限制)
3. Port RestrictedCone NAT 端口限制锥形 NAT ( IP+Port 限制)
4. SymmetricNAT 对称 NAT,把每个内部主机“地址端口对”和外部主机“地址端口对”完全相同的报文看作一个连接
其中完全锥形的穿透性最好,而对称形的安全性最高
假设:
NAT 内的主机 A : IP 记为 A ,使用端口 1000
NAT 网关 : IP 记为 NAT ,用于 NAT 的端口池假设为( 5001-5999 )
公网上的主机 B : IP 记为B ,开放端口 2000
公网上的主机 C : IP 记为C ,开放端口 3000
假设主机 A 先后访问主机 B 和 C
1 )如果是锥形 NAT :
那么成功连接后,状态必然如下:
A ( 1000 ) —— > NAT ( 5001 )—— > B ( 2000 )
A ( 1000 ) —— > NAT ( 5001 )—— > C ( 3000 )
也就是说,只要是从 A 主机的 1000 端口发出的包,经过地址转换后的源端口一定相同。
2 )如果是对称形 NAT :
连接后,状态有可能(注意是可能,不是一定)如下:
A ( 1000 ) —— > NAT ( 5001 )—— > B ( 2000 )
A ( 1000 ) —— > NAT ( 5002 )—— > C ( 3000 )
两者的区别显而易见。
三种CONENAT之间的区别
仍然以上面的网络环境为例, 假设 A 先与 B 建立了连接:
A ( 1000 ) —— > NAT ( 5001 )——— > B ( 2000 )
1) PortRestricted Cone NAT:
只有 B ( 2000 )发往 NAT ( 5001 )的数据包可以到达 A ( 1000 )
===========================================================
B ( 2000 ) —— > NAT ( 5001 ) ——— > A ( 1000 )
B ( 3000 ) —— > NAT ( 5001 ) — X — > A ( 1000 )
C ( 2000 ) —— > NAT ( 5001 ) — X — > A ( 1000 )
2) RestrictedCone NAT
只要是从 B 主机发往 NAT ( 5001 )的数据包都可以到达 A ( 1000 )
==========================================================
B ( 2000 ) —— > NAT ( 5001 ) ——— > A ( 1000 )
B ( 3000 ) —— > NAT ( 5001 ) ——— > A ( 1000 )
C ( 2000 ) —— > NAT ( 5001 ) — X — > A ( 1000 )
3) FullCone NAT
任意地址发往 NAT ( 5001 )的数据包都可以到达 A ( 1000 )
==========================================================
B ( 2000 ) —— > NAT ( 5001 ) ——— > A ( 1000 )
B ( 3000 ) —— > NAT ( 5001 ) ——— > A ( 1000 )
C ( 3000 ) —— > NAT ( 5001 ) ——— > A ( 1000 )
多层NAT穿透原理
在客户端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。无论A与B二者中的任何一方向服务器发送P2P连接请求,服务器都会将其记录下来的上述的外网和内网地址二元组发送给A或B。由公网服务器观察到的A,B的公网地址二元组进行“打洞”操作,用于“打洞”的数据包将由NAT C进行转发。
当客户端A向客户端B的公网地址二元组{155.99.25.11:62005}发送UDP数据包的时候,NAT A首先把数据包的源地址二元组由A的内网地址二元组{10.0.0.1:4321}转换为“伪”公网地址二元组{10.0.1.1:45000},现在数据包到了NAT C,NAT 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、假如x1的A网关为Symmetric NAT, y1,y2的网关B为Addre***estricted Cone NAT 或Full Cone NAT型网关,各自建立隧道后,x1可通过A发送数据报给B到y1(因为B最多只进行IP级别的甄别),但y2发送给A的将会被丢弃(因为发送来的数据报中端口与A上存在会话的端口不一致,虽然IP地址一致),所以这样没有什么意义。
5、假如双方均为Symmetric NAT的情形,新开了端口,对方可以在不知道的情况下尝试猜解,也可以达到目的,但这种情形成功率很低,且带来额外的系统开支,不是个好的解决办法。
6、考虑到同一内网不同用户同时访问同一服务器的情形,如果此时网关采用Addre***estricted Cone NAT或Full Cone NAT型,有可能导致不同用户客户端可收到别人的数据包,这显然会出现问题。
P2P连通性条件检测: NAT检查工具:http://cc.rtmfp.net/
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 |