您的位置:首页 > 其它

NAT分类介绍及其打洞的思考

2010-10-31 22:22 176 查看
UDP"打洞"原理

1. NAT分类

根据Stun协议(RFC3489),NAT大致分为下面四类

1) Full Cone

这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A.不管是不是C发过来的.

例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88

A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)

任何发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)

2) Restricted Cone

这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用任何端口和A通信.其他的外网机器不行.

例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88

A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)

任何从C发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)

3) Port Restricted Cone

这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用原来的端口和A通信.其他的外网机器不行.

例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88

A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)

C(202.88.88.88:2000)发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)

以上三种NAT通称Cone NAT.我们“只能用这种NAT进行UDP打洞”.

4) Symmetic

对于这种NAT.连接不同的外部目标.原来NAT打开的端口会变化.而Cone NAT不会.虽然可以用端口猜测.但是成功的概率很小.因此放弃这种NAT的UDP打洞.

2. UDP hole punching

对于Cone NAT.要采用UDP打洞.需要一个公网机器C来充当”介绍人”.内网的A,B先分别和C通信.打开各自的NAT端口.C这个时候知道A,B的公网IP:Port. 现在A和B想直接连接.比如A给B发.除非B是Full Cone.否则不能通信.反之亦然.但是我们可以这样.

A要连接B.A给B发一个UDP包.同时.A让那个介绍人给B发一个命令,让B同时给A发一个UDP包.这样双方的NAT都会记录对方的IP,然后就会允许互相通信.

3. 同一个NAT后面的情况

如果A,B在同一个NAT后面.如果用上面的技术来进行互连.那么如果NAT支持loopback(就是本地到本地的转换),A,B可以连接,但是比较浪费带宽和NAT.有一种办法是,A,B和介绍人通信的时候,同时把自己的local IP也告诉服务器.A,B通信的时候,同时发local ip和公网IP.谁先到就用哪个IP.但是local ip就有可能不知道发到什么地方去了.比如A,B在不同的NAT后面但是他们各自的local ip段一样.A给B的local IP发的UDP就可能发给自己内部网里面的某某某了.

说明1:关于NAT的四种类型,我想这四种类型的区分取决与NAT服务器内部保存什么信息。

首先,对于Cone NAT,它都保存着(private ip, private port)-->(public ip, private port)的映射绑定,从(private ip,privaet port)出发所有的session都使用这个映射。从这个意义上看,基本的NAT(没有改变端口的)和firewall都是一种“退化的cone nat”,它们只保存(private ip)--> (public ip),没有改变端口。

        但是,三种Cone NAT又都保存着一些其他信息,分为一下三类.Cone NAT is further classified according to how liberally the NAT accepts incoming traffic directed to an already-established (public IP, public port) pair. This classification generally applies only to UDP traffic, since NATs and firewalls reject incoming TCP connection attempts unconditionally unless specifically configured to do otherwise.

         1)Full Cone NAT

         After establishing a public/private port binding for a new outgoing session,a full cone NAT will subsequently accept incoming traffic to the corresponding public port from ANY external endpoint on the public network.

         2) Restricted Cone NAT

        A restricted cone NAT only forwards an incoming packet directed to a public port if its external (source) IP address matches the address of a node to which the internal host has previously sent one or more outgoing packets. A restricted cone NAT effectively refines the firewall principle of rejecting unsolicited incoming traffic, by restricting incoming traffic to a set of "known" external IP addresses.

       要完成上面的功能,Restricted Cone NAT应该保存从每个映射出去的session的目的hosts的ip。

       3)Port-Restricted Cone NAT

      A port-restricted cone NAT provides internal nodes the same level of protection against unsolicited incoming traffic that a symmetric NAT does, while maintaining a private port's identity across translation.

       显然,Port-Restricted Cone NAT要保存从每个映射出的session的目的host的ip和port。

其次,对于Symmetric NAT,A symmetric NAT, in contrast, does not maintain a consistent port binding between (private IP, private port)-->(public ip, public port). Instead, it assigns a new public port to each new session.

说明2:我认为,之所以要分为这几种NAT,特别是Cone NAT的那三种类型,可能一个原因是出于“安全性的考虑”,比如Port-Restricted Cone NAT就要比Full Cone NAT安全,因为Port-Restricted只接受的“内部主机曾经向其发送包的那些目的主机的incoming packet”;而Full NAT是,只要内部主机向外initiate一个新session,建立了(private ip, private port)-->(public ip, public port),以后就“对any external host's incoming packet来者不拒”了。

               从网关或路由器的网络防火墙模块的角度看,Cone NAT实际上是向Internet的主机不同程度的开放自己的端口,则这个端口映射为内网的某个主机的某个应用程序。

http://wezly.javaeye.com/blog/611563
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息