因项目需求,在网上找了NAT的相关资料,现整理如下:
1. NAT定义
NAT是将私有地址转换为合法IP地址的技术。通俗的讲,就是将内网与内网通信时,怎么将内网私有IP地址转换为可在网络中传播的合法IP地址。NAT的出现,完美地解决了lP地址不足的问题;而且,还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
2. NAT分类
1. Full Cone NAT 完全锥形 NAT
2. Restricted Cone NAT 限制锥形 NAT(可以理解为 IP 限制)
3. Port Restricted Cone NAT 端口限制锥形 NAT(IP+Port 限制)
4. Symmetric NAT 对称 NAT
其中完全锥形的穿透性最好,而对称形的安全性最高。
2.1 锥形NAT和对称NAT的区别
“同一个外部地址和端口”与“无论目的地址是否相同”形成了一个类似锥形的网络结构,也是这一名称的由来。
反过来,不满足这一条件的即为对称NAT 。
2.2 举例说明
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 端口发出的包,经过地址转换后的源端口一定相同。
连接后,状态有可能(注意是可能,不是一定)如下:
A ( 1000 ) —— > NAT ( 5001 )—— > B ( 2000 )
A ( 1000 ) —— > NAT ( 5002 )—— > C ( 3000 )
两者的区别显而易见。
2.3 三种CONE NAT之间的区别
A ( 1000 ) —— > NAT ( 5001 )——— > B ( 2000 )
只有 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) Restricted Cone 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) Full Cone NAT
任意地址发往 NAT ( 5001 )的数据包都可以到达 A ( 1000 )
==========================================================
B ( 2000 ) —— > NAT ( 5001 ) ——— > A ( 1000 )
B ( 3000 ) —— > NAT ( 5001 ) ——— > A ( 1000 )
C ( 3000 ) —— > NAT ( 5001 ) ——— > A ( 1000 )
3. NAT检测
前提条件: 有一个公网的Server,并且绑定了两个公网IP(IP-1,IP-2)。这个Server做UDP监听(IP-1,Port-1),(IP-2,Port-2),并根据客户端的要求进行应答。
第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后?
1)客户端建立UDP socket。然后,用这个socket向服务器的(IP-1,Port-1)发送数据包,要求服务器返回客户端的IP和Port。
2)客户端发送请求后立即开始接受数据包。
如果无法接收到服务器的回应,则说明客户端无法进行UDP通信,可能是防火墙或NAT阻止UDP通信,这样的客户端也就不能P2P了(检测停止)。
如果能够接收到服务器的回应,需要把服务器返回的客户端(IP,Port)和这个客户端socket的 (LocalIP,LocalPort)比较。如果完全相同则客户端不在NAT后,这样的客户端具有公网IP可以直接监听UDP端口接收数据进行通信(检测停止);否则,客户端在NAT后要做进一步的NAT类型检测(继续)。
第二步:检测客户端NAT是否是Full Cone NAT?
1)客户端建立UDP socket。然后,用这个socket向服务器的(IP-1,Port-1)发送数据包,要求服务器用另一对(IP-2,Port-2)响应客户端的请求,并往回发一个数据包。
2)客户端发送请求后立即开始接受数据包。
如果无法接收到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续)。
如果能够接收到服务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信(检测停止)。
第三步:检测客户端NAT是否是Symmetric NAT?
1)客户端建立UDP socket。然后,用这个socket向服务器的(IP-1,Port-1)发送数据包,要求服务器返回客户端的IP和Port。
2)客户端发送请求后立即开始接受数据包,这个数据包一定能够收到,因为第一步保证了这个客户端可以进行UDP通信。用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包,要求服务器返回客户端的IP和Port。
比较上面两个过程从服务器返回的客户端(IP,Port)。如果,两个过程返回的(IP,Port)有一对不同,则说明客户端为Symmetric NAT,这样的客户端无法进行UDP-P2P通信(检测停止);否则,客户端为Restricted Cone NAT。是否为Port Restricted Cone NAT有待检测(继续)。
第四步:检测客户端NAT是否是Restricted Cone NAT还是Port Restricted Cone NAT?
1)客户端建立UDP socket,然后用这个socket向服务器的(IP-1,Port-1)发送数据包,要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP 数据包响应客户端。
2)客户端发送请求后立即开始接受数据包,
如果无法接收到服务器的回应,则说明客户端是一个Port Restricted Cone NAT。
如果能够接收到服务器的回应,则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。
注:
1)在客户端发送请求的过程中,要设定socket Timeout,防止无限堵塞;又因是UDP传输,最好重复发送若干次。
2)以上检测过程,只说明可否进行UDP-P2P的打洞通信。具体怎么通信,一般要借助于Rendezvous Server。
3)对于Symmetric NAT,不是说完全不能进行UDP-P2P打洞通信。你可以进行端口预测打洞,不过不能保证成功。
参考网址
http://michankong.blog.51cto.com/1464983/761270
http://www.cnblogs.com/my_life/articles/1908552.html
http://blog.csdn.net/ojhsky/article/details/6011232