尹会明
YIN Hui-ming
(南京信息职业技术学院,南京 210046)
人们生活水平的提高和信息技术的飞速发展,数字化、智能化且远程可监控的嵌入式设备将饱受青睐。由于被控对象、测控装置等设备的地域分散性,以及监控任务的实时性要求,基于Intemet远程信息处理和控制是一个很好的解决方案。嵌入式系统(Embedded Systems)是根据应用的要求,将操作系统和功能软件集成于计算机硬件系统之中,从而实现软件与硬件一体化的计算机系统。
IPv4地址匿乏和中国IT起步较晚等历史原因,使我国的私网IP远多于公网IP。大部分主机的工作环境都是在局域网,NAT网络地址转换技术为局域网内的主机访问Intemet提供服务。NAT技术对于局域网内的主机是透明的,但当外网主机要主动连接局域网内的主机时就得设计穿透技术。远程监控嵌入式系统的绝大部分工作环境都是局域网,因此设计NAT穿透技术就成为必须的工作。
网络的快速发展极大地增加了对IP地址的需求。解决IP地址匿乏问题可以通过在下一阶段部署IPv6予以解决,而在当前IPv4的环境下,应着重考虑通过网络地址转换Network Address Translator,NAT)技术来解决。NAT支持私有地址在内部网络中的应用。由于内网用户众多,但大量的都是进行内部通信,因此可能使用只能在内部使用的私有地址。由于公网中的路由器无法识别此类地址,将视其为非法地址。当内网用户要和外界通信时,可以由网关为其动态分配一个合法的公网地址,网关负责该私有地址和公网地址的映射,这就是NAT的功能。因为内网之间不会通过私有地址直接通信,所以不同的内网之间可以重用两样的私有地址空间,这样就可以解决大量用户对IP地址的需求。按照地址转换方式,可以分为以下两类:
基础NAT将私有地址转换成公网地址,但并不将TCP用DP端口信息进行转换,它将公网地址与内部主机进行绑定,使得外部可以用公网IP地址访问内部主机。如果私有地址和公网地址为一一对应的映射关系,则称为静态绑定;如果公网地址是在主机访问外网时临时分配的,则称为动态绑定。动态绑定仅在一定时间内有效,需要定时刷新。该类NAT的主要目的并非地址扩展,而是配合防火墙隔离私有网络,并对内部主机访问外部实施控制。
这类方式比较普遍,网络地址/端口转换器检查、修改包的IP地址和TCP/UDP端口信息,这样,更多的内部主机就可以同时使用一个公网IP地址。该类NAT的主要目的是实现地址扩展。由于NAT,穿越的端口号将改变,它给许多应用带来影响。按照地址映射的实现方式,可以分为以下四类:
1)全锥形(Full Cone)NAT
当内部主机发起一个至外网的会话时,NAT为其建立一个私有
2)地址受限锥形(Address Restrieted Cone)NAT
和全锥形NAT相同,当内部主机发起一个至外网的会话时,NAT为其分配一个公有 的数据包才能与主机 3)端口受限锥形(Port Restricted Cone)NAT 和地址受限NAT类似,只是限制范围从IP地址扩展到 4)对称形(Synunetric)NAT 和锥形NAT不同,它的地址绑定只能用于指定的内网 嵌入式系统的工作性质决定了它与外网主机通信都是由对方发起连接,同时考虑到局域网大部分应用是锥形NAT,本研究局主要为域网外的主机穿透锥形NAT,和嵌入式设备通信的技术。 局域网外的主机分为两种:拥有公网IP或拥有私网IP。 拥有公网IP的主机因为无法知道嵌入式设备在NAT,上映射的公网IP地址和端口,它无法向嵌入式设备发送任何数据包,这得提供第三方的帮助才能让彼此建立连接。工作在局域网的嵌入式系统 针对地址或端口受限的锥形NAT,需要局域网内的嵌入式系统X打一个“洞”,这个“洞”的方向是 主要过程为:公网IP主机圭动连接局域网内嵌入式设备的过程,首先,主机C向服务器S获取嵌入式系统X的外网地址和端口,同时请求服务器S向嵌入式系统X发送打洞命令,当主机C收到嵌入式系统X的数据包时,NAT穿透成功,主机C和嵌入式系统X建立联系。 相比公网IP主机而言,私网IP主机连接局域网内的嵌入式系统就要复杂一些,因为都不知道对方的公网IP和端口,谁也无法主动发出连接请求。借助于第三服务器的帮助,首先嵌入式系统X通过NATA时分配公网IP和端口对并与服务器S建立连接,同样主机C通过NAT B时分配公网IP和端口对 这时嵌入式系统X和主机C都可以与服务器S进行通信,主机C不能通过服务器S获取X的公网地址和端口对而直接向x发送数据包,因为从X到 步骤1:主机C先从服务器S获取X的公网地址和端口对,同时请求服务器S向嵌入式系统x发送打“洞”命令;步骤2:服务器S向嵌入式系统X发送主机C的公网地址和端口对 局域网外的主机主动连接嵌入式系统考虑了两种情形:主机拥有公网IP或拥有私网IP。实现上述的通信,首先得找一台拥有公网IP地址的第三方充当服务器的角色,并且在服务器和客户机上得安装相应的NAT,穿透软件。如何让嵌入式系统完成NAT穿透技术中的工作?工作在局域网内的嵌入式系统需要处理的是三个任务:定时刷新与服务器通信的端口以保持会话;接收并解析服务器的命令;打一个方向为特定地址和端口的“洞”。 当嵌入式系统向拥有公网IP地址的服务器登录时,网关会在NAT转换时给其分配公网IP地址和端口,只要此UDP会话有效,服务器都可以通过此公网IP地址和端口和嵌入式系统通信。问题是,这个UDP会话能保持多久呢?这得依具体情况而定。因此,为了保持和服务器通信,嵌入式系统得定时刷新这个公网地址和端口。 本研究采取的办法是每隔一分钟向服务器发送一个保持激活的数据包,以维持这个公网IP地址和端口对的有效性。具体实施的方法是:复用了定时器2,它在UDP数据包的发送过程中己经被使用,复用可以提高效率节省硬件资源。在定时器2的中断服务程序中,定义一个记录分钟的变量,每当一分钟时间到就将发送保持激活数据包的信号量置1,然后退出中断服务程序。在程序的主循环中查询发送保持激活数据包的信号量是否为1,如果使能就向服务器发送保持激活数据包,否则继续执行其它的任务,这部分的逻辑处理如图1所示。 图1 Timer2中断服务程序和主循环处理 发送给服务器的保持激活数据包的格式措施为:封装好一个UDP包,其中填写服务器的端口号和IP地址,然后调用发送此UDP包的函数即可。 接收并解析服务器的命令是依赖于接收判别数据包的函数,系统接收到来自服务器的特定SOCKET的数据包,服务器的命令数据包会调用解析函数来处理,解析函数首先检查UDP有效负载中的前2个字节是否为命令字(自定义为:0xAA,0x55),如果是则继续从UDP中的有效负载中分离出想连接嵌入式系统的主机的公网IP地址和端口号;否则退出解析过程。 现在有了该主机的公网IP(它可能是该主机自己的IP,也可能是其网关在NAT时分配的IP)和端口信息,这个UDP数据包就很容易封装,跟发送保持激活数据包相似,最后调用发送数据包函数将包发送出去。这样嵌入式系统向想连接嵌入式系统的主机就可以发送打“洞”的UDP数据包。 考虑到嵌入式系统绝大部分工作是局域网且由外网主机主动发起连接,本研究关注了NAT穿透技术的实现。首先,对NAT的原理和分类进行了详细的阐述;然后,分析了针对分别拥有公网IP和私网IP的主机的NAT穿透技术;最后,讲述了本嵌入式系统具体实现方法。 在NAT穿透技术的实现当中,缺少对symmetric(对称形)NAT洞穿技术的研究,它在某些场合下也会有应用;安全性能不强,应用层协议的设计缺乏基于加密的握手协议,这给一些未经授权的主机非法操作本嵌入式系统提供了机会。 [1]田泽.嵌入式系统开发与应用教程[M].北京:北京航空航天大学出版社,2005,3.1-3. [2]李兵建.基于嵌入式Intemet的远程电网参数实时检测系统的设计[D].江苏:江苏大学,2008:23-39. [3]Deitel,GoldBerg.Intemet&Worrld Wide Web How to Program.3th Edition.Prentice Hall,2004.321-330. [4]杨恢先,等编著.单片机原理及应用[M].长沙:国防科技大学出版社,2003:253-259. [5]Simon,D.E,著,陈西群,等译.嵌入式系统软件教程.[M]北京:机械工业出版社,2005,09:120-128. [6]StuartRBallPE.嵌入式微处理器系统设计实例[M].北京:电子工业出版2004:136-144. [7]John Catsoulis.Designing Embedded Hardware[M].OReilly-Media Inc.2002:97-113. [8]沈红卫.单片机应用系统设计实例与分析[M].北京:北京航空航天大学出版社,2003:258-262.2 实用高效的NAT穿透技术的设计
2.1 公网主机与局域网嵌入式设备通讯方法
保持会话,当公网主机C想和嵌入式系统X连接时,它先从服务器S获取x的公网地址和端口对。此时主机C能否通过直接向嵌入式系统x发送数据包呢?如果是Full Cone是可以的,但Address/Port Restricted Cone会丢弃这种数据包。2.2 私网主机与局域网嵌入式设备通讯方法
3 嵌入式系统实现NAT穿透技术
3.1 保持和服务器通信技术
3.2 解析服务器技术
3.3 UDP数据包发送
4 结论及建议