最近公司一个项目是要远程监控本公司卖出的设备,核心是用c#的Socket完成服务器跟远程设备的交互。开始就遇到一个问题就是卖出的设备可能没有外部的ip,是在局域网里的。要经过Internet访问局域网内部的机器,就必须内外的设备先给服务器发送ip数据报(服务器是公网的ip)。
具体,
Internet如何访问局域网内部ip?
我们的监视系统要和远程的设备芯片通信,当我们的设备所在的是一个局域网,ip是内部ip时,我们怎样能保证我们发送的数据能到达正确的设备?一般我们能得到的是局域网的外部ip和端口。
解决方法:透过NAT不需要考虑复杂,你只需要知道从NAT过来的IP和PORT然后原封不动的按照这个地址发回去就可以了。其余的由NAT来完成。因为无论是路由还是局域网主机都会维护一个内部的ip跟端口(可能还有mac地址的表)所以当ip数据报先当先从内外发出数据报会把内部地址跟端口(或者是mac)信息携带在报头里(mac可能要自己放在信息里面)。
局域网内部ip分配原理——网络地址转换(NAT,Network Address Translation)
NAT实现方式
NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和 端口多路复用OverLoad。
静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址对是不确定的,而是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
端口多路复用是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
TCP/UDP端口NAT映射(端口多路复用的一种方案)
如果ISP只提供4个IP地址,其中2个作为网络号和广播地址而不可使用,1个IP地址要用于路由器定义为默认网关, 那么将只剩下1个IP地址可用。当然我们也可以利用这个仅存的一个IP地址采用端口复用地址转换技术,从而实现整个局域网的Internet接入。但是由于服务器也采用动态端口,因此,Internet中的计算机将无法访问到网络内部的服务器。有没有好的解决问题的方案呢?这就是TCP/UDP端口NAT映射。
我们知道,不同应用程序使用的TCP/UDP的端口是不同的,比如,Web服务使用50,FTP服务使用21,SMTP服务使用25,POP3服务使用110,等等。因此,可以将不同的TCP端口绑定至不同的内部IP地址,从而只使用一个合法的IP地址,即可在允许内部所有服务器被Internet访问的同时,实现内部所有主机对Internet访问。
地址转换
snat是源地址转换,其作用是将ip数据包的源地址转换成另外一个地址,可能有人觉得奇怪,好好的为什么要进行ip地址转换啊,为了弄懂这个问题,我们要看一下局域网用户上公网的原理,假设内网主机A(192.168.2.8)要和外网主机B(61.132.62.131)通信,A向B发出IP数据包,如果没有SNAT对A主机进行源地址转换,A与B主机的通讯会不正常中断,因为当路由器将内网的数据包发到公网IP后,公网IP会给你的私网IP回数据包,这时,公网IP根本就无法知道你的私网IP应该如何走了。所以问它上一级路由器,当然这是肯定的,因为从公网上根本就无法看到私网IP,因些你无法给他通信。为了实现数据包的正确发送及返回,网关必须将A的址转换为一个合法的公网地址,同时为了以后B主机能将数据包发送给A,这个合法的公网地址必须是网关的外网地址,如果是其它公网地址的话,B会把数据包发送到其它网关,而不是A主机所在的网关,A将收不到B发过来的数据包,所以内网主机要上公网就必须要有合法的公网地址,而得到这个地址的方法就是让网关进行SNAT(源地址转换),将内网地址转换成公网址(一般是网关的外部地址),所以为了让内网用户上公网,我们必须在routeros的firewall中设置snat,俗称IP地址欺骗或伪装(masquerade)
这些东东有点乱,还有些细节不明白
参考:
http://baike.baidu.com/view/16102.htm
http://topic.csdn.net/t/20021012/13/1090361.html#
http://baike.baidu.com/view/824493.htm
还有一篇有价值的参考
P2P之UDP穿透NAT的原理与实现
http://www.pconline.com.cn/pcedu/soft/lan/kdwjr/0508/691532.html