320 likes | 583 Views
UDP 下 NAT 穿越 技术的介绍. 段志鸣. 一、 NAT 介绍 NAT 技术又称地址代理,提供内部私有地址和公有地址之间的转换,支持内部网络和公网之间的通信,如下图所示。. 私有地址是指内部网络的主机 IP 地址,而公有地址是指内部网以外的可路由的公共地址 ( 在 Internet 上全球唯一的 IP 地址 ) Internet 地址分配组织规定三组网络地址作为保留的内部私有地址,使用这些地址的数据包在公网上不可路由,即这些网络地址不会在 Internet 上进行分配,但可以在企业网、校园网、专用网内部使用。.
E N D
UDP下NAT穿越 技术的介绍 段志鸣
一、NAT介绍 NAT技术又称地址代理,提供内部私有地址和公有地址之间的转换,支持内部网络和公网之间的通信,如下图所示。 私有地址是指内部网络的主机IP地址,而公有地址是指内部网以外的可路由的公共地址(在Internet上全球唯一的IP地址) Internet地址分配组织规定三组网络地址作为保留的内部私有地址,使用这些地址的数据包在公网上不可路由,即这些网络地址不会在Internet上进行分配,但可以在企业网、校园网、专用网内部使用。
根据RFC1918,私有IP地址包括如下3个大小不同的地址空间,可供不同规模的企业网或专用网使用。根据RFC1918,私有IP地址包括如下3个大小不同的地址空间,可供不同规模的企业网或专用网使用。 10.0.0.0-10.255.255.255,1个A类地址,包含256个B类地址或65536个C类地址。共约1677万个IP地址。 172.16.0.0-172.31.255.255,16个B类地址,包含4096个C类地址。共约104万个IP地址。 192.168.0.0-191.168.255.255,1个B类地址,包含256个C类地址。共约65536个IP地址。
当内部主机访问Internet或者与外部网络主机进行通信的时候将涉及地址转换的问题。NAT设备通过把内部网络主机的IP地址和端口号转换为外部公有IP地址和端口号,达到内部网络访问Internet和外部网络主机的目的。同理通过配置内部网络的应用服务器,外部网络主机也可以访问并获得内部服务器提供的服务。当内部主机访问Internet或者与外部网络主机进行通信的时候将涉及地址转换的问题。NAT设备通过把内部网络主机的IP地址和端口号转换为外部公有IP地址和端口号,达到内部网络访问Internet和外部网络主机的目的。同理通过配置内部网络的应用服务器,外部网络主机也可以访问并获得内部服务器提供的服务。
NAT的实现方式有三种,即静态转换、动态转换和端口多路复用。NAT的实现方式有三种,即静态转换、动态转换和端口多路复用。 静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。 动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址对是不确定的,而是随机的,所有被授权访问Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。
端口多路复用是指改变外出数据包的源端口并进行端口转换,即端口地址转换(Port Address Translation,PAT)。采用端口多路复用方式,内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,避免来自Internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。NAT设备通过维护NAT映射表的方式实现双向的地址转换并得以在两个方向上隐藏地址,可以最大限度的保护网络内部计算机不受外部入侵,其功能通常被集成到路由器,防火墙等硬件设备中。
二、NAT分类 NAT可以按照功能和实现进行分类,下面分别进行讨论。 2.1 NAT功能分类 按照地址转换的方式,可以将NAT分为以下两类。 1.基本NAT 数据报穿越内部网络边界时仅变换地址,传送层端口号保持不变。内部网络需要申请一组外部公有地址,供内部主机访问外网时使用。如果私有地址和公有地址为一一对应的关系,并且内部网络中的每个主机在一次完整的网络操作中被永久映射成外部网络中的某个合法的地址,则称为静态绑(StaticNAT)。
如果公有地址是在主机访问外网时按需临时分 配,则称为动态绑定(PooledNAT),主要用于拨号和频繁的远程联接。动态绑定仅在一定时间内有效,需定时刷新。该类NAT的主要目的并非地址扩展,而是配合防火墙安全隔离私网,并对内部主机访问外部网络实施控制。
2.网络地址端口转换NAPT 数据包穿越内部网络边界时不但要变换IP地址,而且要变换传送层端口号。内部网络只需要申请一个或几个公有地址,通过分配不同的端口号就可以支持大量内部主机同时访问外网。这种NAT称为网络地址端口转换NAPT(Port-Level NAT),NAPT在将私有地址映射为公有地址时不但改变了内部主机的IP地址,还改变了它的端口号。该类 NAT的主要目的是实现地址扩展,是企业网和校园网常用的NAT类型。
2.2 NAT实现分类 STUN协议(后面详细介绍)把NAT分为如下几种类型。 1.完全锥形NAT(Full Cone) 对于全锥形NAT的情形,当内部主机发起一个至外网的会话时,NAT为其建立一个私有<IP:端口>地址和公有<IP:端口>地址之间的绑定,然后该主机地址至外网的任意会话将重用这个公有<IP:端口>地址,同样,外部任意应用都可通过该公有<IP:端口>地址到达该内部主机地址。只要有一个连接会话存在,这个绑定就始终保持激活状态。可用图1来表示完全锥型NAT的性质。
2.受限制锥形(Restricted Cone) 受限制锥形NAT建立映射的规则与完全锥形相同。但是,只有当内部主机曾经向某个外部主机发送过数据包时,这个外部主机才可以通过映射的外部地址向内部主机发送数据。当然这个外部主机可以用其他的端口,但源IP地址必须与内部主机发送数据包的目的地址相同。可以理解为受限制锥形是对外部主机的IP地址进行限制。具体原理见图3。
3.端口受限制锥形(Port Restricted Cone) 端口受限制锥形类似于受限制锥形,但限制更加严格。只有当内部主机曾经向外部主机地址上的某个特定端口发送过数据包,这个外部主机才可以用该特定端口向内部主机发送 数据。可以理解为对外部主机的IP地址和端口同时进行了限制。图3表示了端口受限制锥型的概念。
4.对称类型(Symmetric) 该类型的限制最为严格。对称类型NAT会为内部主机向外部主机的每一个会话(Session)建立全新的端口映射,即源地址和端口加上目的地址端口其中任意一个有变化,则映射关系也会不同,如图4。
三、STUN协议 STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一 个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT 路由器之后的主机之间建立UDP通信。该协议由RFC 3489定义。
一旦客户端得知了Internet端的UDP端口,通信就可以开始了。如果NAT是完全圆锥型的,那么双方中的任何一方都可以发起通信。如果NAT是受限圆锥型或端口受限圆锥型,双方必须一起开始传输。 需要注意的是,要使用STUN RFC中描述的技术并不一定需要使用STUN协议——还可以另外设计一个协议并把相同的功能集成到运行该协议的服务器上。 SIP之类的协议是使用UDP分组在Internet上传输音频和/或视频数据的。不幸的是,由于通信的两个末端往往位于NAT之后,因此用传统的方法是无法建立连接的。这也就是STUN发挥作用的地方。
STUN是一个客户机-服务器协议。一个VoIP电话或软件包可能会包括一个STUN客户端。这个客户端会向STUN服务器发送请求,之后,服务器就会向STUN客户端报告NAT路由器的公网IP地址以及NAT为允许传入流量传回内网而开通的端口。 以 上的响应同时还使得STUN客户端能够确定正在使用的NAT类型——因为不同的NAT类型处理传入的UDP分组的方式是不同的。四种主要类型中有三种是可 以使用的:完全圆锥型NAT、受限圆锥型NAT和端口受限圆锥型NAT——但大型公司网络中经常采用的对称型NAT(又称为双向NAT)则不能使用。
UDP下NAT类型的判断 在STUN协议中规定了六种网络状况: (1) 公网; (2) 阻止UDP的防火墙; (3) 对称型UDP防火墙; (4) 完全锥形; (5) 对称锥型; (6) 限制锥形或者端口限制锥型。 如图5所示的流程为NAT类型判断图。
则STUN Server用另外一个地址和端口为客户端发送响应回复 服务器用收到请求的地址和端口发送回复。 STUN Client只设置了“改变端口”标志。 图5 NAT类型判断图
该流程中使用了3个测试。 在测试I中,STUN Client发送STUN绑定请求给STUN Server,没有设置CHANGE-REQUEST和RESPONSE-ADDRESS属性,这引起服务器用收到请求的地址和端口发送回复。 在测试II中,STUN Client设置了CHANGE-REQUEST属性中的“改变IP”和“改变端口”标志。则STUN Server用另外一个地址和端口为客户端发送响应回复。 在测试III中,STUN Client只设置了“改变端口”标志。
STUN Client首先从测试I开始,如果该测试没有响应,则为阻止UDP模式。如果测试收到响应,则检查自己的映射地址是否与本地地址相同,如果相同,则没有处在NAT后,然后执行测试II,如果收到响应,则客户端为公网模式,如果没有收到响应,则客户为对称UDP防火墙模式。在本地地址与收到服务器回复的映射地址不同的时候,客户端需要执行测试II。如果收到响应,则客户端处于完全锥型NAT后面,如果没有响应,客户端再次执行测试I,但这次需要修改CHANGED-ADDRESS属性中的地址和端口,即向服务器另外一个地址发送请求。如果收到服务器回复的MAPPED-ADDRESS与第一次测试I中的不同,则客户端处于Symmetric NAT后。如果端口和地址相同,则客户端处于限制NAT或者端口限制NAT后。这时需要继续进行测试III。如果收到响应,则为限制NAT模式,否则为端口限制NAT模式。
四、UDP Hole Punching技术 UDP Hole Punching是UDP穿越NAT的主要技术,由于现在多采用NAPT(端口映射)技术,所以穿越NAT的关键是NAT上的端口映射。UDPHole Punching的主要思想是:利用STUN服务器上事先维护的客户端UDP映射地址,当双方需要通信时,可以通过服务器的配合获取对方的地址和端 口,建立P2P直连,如图6所示。
下面是UDP Hole Punching技术步骤。 1.客户端A向STUN服务器发出请求,要求与客户端B建立连接。 2.服务器向客户端A,B发送对方的NAT映射地址,即外部地址。这个地址是服务器根据两个客户端发送的UDP数据报负载中获得。 3.客户端B接收到A的外部地址后,将A的外部地址作为目的地址发送Hole Punching UDP数据报,该数据报使得B端网络的NAT设备允许后续的以A端地址为源地址的UDP数据报进入其内部网络。可以形象的称该过程为“打洞”过程,即B向A打了一个“洞”作为通道。
4.客户端A接收到B的外部地址后,以B的外部地址为目的地址发送探测UDP数据报,同样该数据报也在A端网络的NAT设备上建立对应映射。4.客户端A接收到B的外部地址后,以B的外部地址为目的地址发送探测UDP数据报,同样该数据报也在A端网络的NAT设备上建立对应映射。 5.B端收到A端的探测数据报后,向A端发送确认数据报。至此,双方建立互通的UDP连接。采用UDP Hole Punching技术,STUN可以穿越非Symmetric NAT却无法穿越存在Symmetric NAT的网络环境,它没有对Symmetric NAT存在的情况进行细分,当通信双方有一方是Symmetric NAT的情况也是可以建立连接的。
只要没有部署Symmetric NAT的一方首先给对方“打洞”,然后就可以在部署了Symmetric NAT一方的尝试连接数据包的负载中得到对方NAT分配的新地址和端口,以此地址和端口为目的来建立P2P直连就可以。当双方均部署了Symmetric NAT,UDP Hole Punching技术则无法成功穿越NAT。原因就是Symmetric NAT会为每一个不同的目的地址的Session建立不同的映射,所以,当一方向对端映射地址“打洞”的时候,自己的NAT已经建立了不同于STUN服务器所获得的映射端口,而另一方在“打洞”的时候,仍然发送数据包到原来的映射。
因此数据包根本无法通过第一方的NAT,这样就无法建立直接连接。一方是Symmetric NAT,一方是端口受限NAT也是同样道理。我们无法知道Symmetric NAT上为其新会话建立的新映射地址和端口,而由这个新地址和端口发出的“打洞”消息又因为对方是端口受限而无法穿越对称NAT,所以无论哪一方来“打洞”数据包都会因为目的端的NAT映射不匹配而不能通过,连接建立失败。