NAT(Network Address Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用。NAT分为两大类,基本 的NAT和NAPT(NetworkAddress/Port Translator)。
基本的NAT会改变IP包中的原IP地址,但是不会改变IP包中的端口,关于基本的NAT可以参看RFC1631
另外一种NAT叫做NAPT,从名称上我们也可以看得出,NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。
由于NAPT 比较常见,这里只介绍NAPT
NATP原理:
NAPT(Network Address Port Translation)即网络端口地址转换,就是将多个内部地址映射为一个合法公网地址,但以不同的协议端口号与不同的内部地址相对应。也就是<内部地址+内部端口>与<外部地址+外部端口>之间的转换,内部端口与外部端口不一定相同,由端口映射规则决定。NAPT普遍用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。
NAPT使得一组主机可以共享唯一的外部地址,当位于内部网络中的主机通过NAT设备向外部主机发起会话请求时,NAT设备就会查询NAT表,看是否有相关会话记录,如果有相关记录,就会将内部IP地址及端口同时进行转换,再转发出去;如果没有相关记录,进行IP地址和端口转换的同时,还会在NAT表增加一条该会话的记录。外部主机接收到数据包后,用接受到的合法公网地址及端口作为目的IP地址及端口来响应,NAT设备接收到外部回来的数据包,再根据NAT表中的记录把目的地址及端口转换成对应的内网IP地址及端口,转发给该内部主机。
端口映射规则:
内网的一台电脑要上因特网,就需要端口映射,端口映射分为动态与静态。
动态端口映射:
内网中的一台电脑要访问新浪网,会向NAPT网关发送数据包,包头中包括对方(新浪网)IP,端口和本机IP,端口,NAPT网关会把本机IP,端口替换成自己的公网一个未使用的端口,并且会记下这个映射关系,为以后转发数据包使用。然后再把数据发判断给新浪网,新浪网收到数据后做出反应,发送数据到NAPT网关的那个未使用的端口,然后NAPT网关将数据转发给内网中的那台电脑,实现内网和公网的通讯,当连接关闭时,NAPT网关会释放分配给这条连接的端口,以便以后的连接可以继续使用。NAPT网关的工作方式,由网关自动添加NAPT记录,一个映射关系。
静态端口映射:
就是在NAPT网关上开放一个固定的端口,然后设定此端口收到的数据要转发给内网的哪个IP和端口,不管有没有连接,这个映射关系都会一直存在。就可以让公网主动访问内网的一个主机,可以通过设置路由器获得
原理图如下:
以下将进入NAPT的穿越方法说明,共三种方法。
第一种方法,(前提你的路由器是直接连接广域网)修改路由器转发规则中虚拟服务选项,设置固定的端口段给与局域网中一台主机,则这台主机利用所固定的端口段内的端口建立连接时,路由器只会改变局域网的IP地址,换成外网IP地址,端口号不变,这样就有对应的端口,所以外网其他路由器下的局域网主机就可以通过你设定的端口号和你的所在局域网的外网IP发送消息,路由器看到是这个固定端口的,就会直接传送到你的主机,而不会传到其他的主机。或者设置DMZ主机,将自己暴露在广域网,也可以实现端口号不变。再将其他局域网下的主机同样设置,即可以端到端的双向通信。
第二种方法,基于UDP的多对一规则,(前提你的路由器是直接连接广域网)修改路由器转发规则中虚拟服务选项,设置固定的端口段给与局域网中一台主机,则这台主机利用所固定的端口段内的端口建立连接时,路由器只会改变局域网的IP地址,换成外网IP地址,端口号不变,这样就有对应的端口,所以外网其他路由器下的局域网主机就可以通过你设定的端口号和你的所在局域网的外网IP发送消息,路由器看到是这个固定端口的,就会直接传送到你的主机,而不会传到其他的主机。或者设置DMZ主机,将自己暴露在广域网,也可以实现端口号不变。让你的主机选择固定的端口监听广域网下的直接局域网下的主机主动发出的请求,通过你的主机获得消息,即可获得消息的来源,即消息的发送者的外网IP和路由器基于NTAP映射规则分给他的端口,则你的主机就可以通过这个IP和端口和他实现双向通信。
各种路由器修改方法可以参考:http://wenku.baidu.com/view/f29c8fc69ec3d5bbfd0a749c.html
第三种,利用服务器,(参考http://blog.csdn.net/feiren127/article/details/5571636)现在ClientA要向ClientB发送数据(比如文件),首先ClientA和B分别通过他们的NATA和B在ServerS上登记,ServerS记录他们NAT的IP和端口号(因为是NAT和ServerS通信的,所以ServerS能也只能得到NAT的地址和端口号)。现在ClientA通过NATA告诉ServerS说要传文件给Client,ServerS就把ClientA的NATA的IP和端口号发送给NATB(因为B的NAT端口已经在ServerS上有记录了),ClientB收到后发送连接数据给NATA,这个时候NATA是不会接受ClientB发过来的包的,因为ClientA没有连接过B,NATA就不会接受B的数据了。虽然B连接A不成功,但是B已经连接过A了,NATB记住了,这时B告诉ServerS叫A过来连,A收到命令后连接B就成功了,于是建立连接,后面的传输就成功了!
整个过程如下:
ClientA-->NATA-->ServerS(A在S登记NAip:NAport)
ClientB-->NATB-->ServerS (B在S登记NBip:NBport)
ClientA-->NATA-->ServerS(A告诉S,要发数据给B)
ServerS-->NATB-->ClinetB(S把NAip:NAport发给B,并告诉B,A要发数据给你了)
ClientB-->NATB-->NATA(NAip:NAport)-->Dropped-->ClientA(B发的包别NATA丢掉了,A是收不到了)
ClientB-->NATB-->ServerS(B等不到A的回应,就告诉S,叫A过来连我吧)
ServerS-->NATA-->ClinetA(S把NBip:NBport发给A,并告诉A,B连不到你,你连B吧)
ClientA-->NATA-->NATB(NBip:NBport)-->ClinetB(B收到A的连接请求,要发送应答给A)
ClientB-->NATB-->NATA-->ClientA(A收到B的应答,后面可以发送数据给NBip:NBport了)
ClientA-->NATA-->NATB-->ClientB(现在开始就从这条路发数据了)
注意:
须知道,除专线外的IP地址都是动态的,可以用动态域名和绑定动态IP,既可以虚拟的获得静态IP,花生壳软件可以做到。
1、通过路由器的转发规则的虚拟服务器设置分配固定的端口段给局域网中的主机,这样局域网中的主机中的进程就可以在给定的端口段中选择端口给自己用,这样就可以直接映射成进程的所设置的端口,即此端口号在外网也是一样,即只是映射了局域网IP地址,端口号不变,即局域网中的主机获得了部分服务器的功能,实现了部分端到端的传输。
2、通过路由器的转发规则的DMZ选项,直接利用局域网中主机的IP地址,设置局域网中主机为DMZ主机,即可完全获得服务器的功能,即使局域网中的主机充当了服务器,实现了端到端的传输,但是有些端口会被其他局域网中的主机占用,导致不能使用。
如果主机未设定固定的局域网IP,则可能会在重启后改变本机的局域网IP,这得重新设置路由器