当内部网络中的一台主机想传输数据到外部网络时,它先将数据包传输到NAT路由器上,路由器检查数据包的报头,获取该数据包的源IP信息,并从它的NAT映射表中找出与该IP匹配的转换条目,用所选的内部全局地址(全局唯一IP地址)来替换内部局部地址,并转发数据包。
当外部网络对内部主机进行应答时,数据包被送到NAT路由器上,路由器接收到目的地址为内部全局地址(外网IP)的数据包,它将用内部全局地址通过NAT映射表查找内部局部地址,然后将数据包的目的地址替换成内部局部地址(内网私有IP),并将数据包转发到内部主机。
优点:
对于家庭或小型商业机构,使用NAT可以更便宜,更有效的接入Internet。
使用NAT可以缓解目前全球IP地址不足的问题。
NAT能够隐藏内部网络的拓扑结构,保护内部主机,同时还起到防火墙的作用。
缺点:
NAT会增加延迟,因为要转换的每个数据包包头的IP地址,增加了延迟。
导致无法进行端到端IP跟踪。
NAT会使某些使用内嵌地址的应用不能正常工作。
静态转换:(static Nat):是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址,借助静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
缺点:一个内网IP对应网关的一个公网IP.如果想让内网中的其它pc也能访问外网,那么网关就必须有多个公网IP,并对每台系想访问外网的pc进行静态配置。
动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址对并不是一一对应的,而是随机的。
缺点:网关有多少个公网IP.就只能满足多少个内网IP上网。
通过使用端口多路复用,可以达到一个公网地址对应多个私有地址的一对多转换。在这种工作方式下,内部网络的所有主机均可共享一个合法外部IP地 址实现对Internet的访问,来自不同内部主机的流量用不同的随机端口进行标示,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有 主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
client通过Nat访问服务器A
Nat会将内网IP和端口号发送过来的请求都会被映射成一个外网IP和端口号
当服务器或者其他客户端向这个外网IP+端口发送任何数据
Nat都会将数据转发给client
client通过Nat访问服务器A
Nat会将内网IP和端口号发送过来的请求都会被映射成一个外网IP和端口号
当服务器或者其他客户端向这个外网IP+端口发送数据
Nat都会将数据直接丢弃
Nat只接受来自于服务器A的任何数据
client通过Nat访问服务器A
Nat会将内网IP和端口号发送过来的请求都会被映射成一个外网IP和端口号
当服务器或者其他客户端向这个外网IP+端口发送数据
Nat都会将数据直接丢弃
关于来自服务器A的数据
Nat只接受来自于服务器A的特定数据
对称型NAT把从同一内网地址和端口到相同目的地址和端口的所有请求,都映射到同一个公网地址和端口。如果同一个内网主机,用相同的内网地址和端口向另外一个目的地址发送报文,则会用不同的映射。这和端口限制型NAT不同,端口限制型NAT是所有请求映射到相同的公网IP地址和端口,而对称型NAT是不同的请求有不同的映射。(即五元组一致)
STUN的全称是Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)。
即穿越NAT的简单UDP传输。(只讨论过程,详解参考RFC3489)
简单来说STUN就是用来找出自己对应的外网的ip和端口,并且可以知道自己所处的网络NAT之下。
stun是一个CS结构,下面具体讲解下NAT类型的发现过程。
NAT类型测试工具:NatTypeTester.exe(网上自行下载,可以判断当前处于哪个类型nat下)
使用udp穿越nat,通常情况下使用udp和外部主机通信会产生一条session,保留时间不一定几秒,几分,几小时。。。
假设NAT-A下的client-A想和NAT-B下的client-B进行通信,一种办法是server作为中间人,负责转发A-B
直接的数据,这样服务器会很累,另一种办法是让client-A和client-B建立端到端的连接,也就是P2P。
当client-A直接发送udp到client-B,肯定会被NAT-B丢弃
1.client-A(202.103.142.29:5000)发送给数据包server请求和client-B(221.10.145.84:6000)通信。
2.server将client-A的地址和端口发送给client-B,告诉client-B,client-A想要和你通讯。
3.client-B向client-A的地址(202.103.142.29:5000)发送udp数据包,这个数据包到NAT-A肯定丢弃,发送这个udp目的是让NAT-B记住这次通讯的目的地址和端口,当下次这个地址和端口数据到NAT-B的时候就不会被丢弃,这样NAT-B上打了一个从client-B到client—A的孔。
4.为了让client-A知道什么时候才可以向client-B发送数据,所以client-B要向server发送一个消息告诉server他已经准备好了
5.server会向client-A发送一个包client-B已经准备好了,你可以向client-B发送数据了。
6.client-A向client-B发送udp数据包,这个数据包是不会被NAT-B丢弃,之后client-B向client-A发送的数据也不会被NAT-A所丢弃,至此client-A和client-B就可以通讯。
对称NAT并不会像锥(Cone,全锥,限制性锥,端口限制性锥)NAT那样分配同一个端口。而是会新建立一个Session,重新分配一个端口。上面穿透限制性锥NAT的过程,在步骤3时:Client-B(221.10.145.84:?)向Client-A打孔的时候,对称NAT将给client-B重新分配一个端口号,而这个端口号对于Server、client-B、client-A来说都是未知的。同样, client-A根本不会收到这个消息,同时在步骤4,client-B发送给Server的通知消息中,client-B的socket依旧是(221.10.145.84:6000)。而且,在步骤6时:client-A向它所知道的client-B发送数据包时,NAT-A也会重新给client-A分配端口号。所以,穿透对称NAT的机会很小。
解决办法:
穿透NAT的步骤2,当client-B收到Server发送给它的消息后,client-B即打开3个socket。socket-0向STUN Server发送请求,收到回复后,假设得知它被转换后的地址:端口(221.10.145.84:6005),socket-1向client-A发送一个UDP包,socket-2再次向另一个STUNServer发送请求,假设得到它被转换后的地址:端口(221.10.145.84:6020)。通常,对称NAT分配端口有两种策略,一种是按顺序增加,一种是随机分配。如果这里对称NAT使用顺序增加策略,那么,client-B将两次收到的地址:端口发送给Server后,Server就可以通知client-A在这个端口范围内猜测刚才client-B发送给它的socket-1中被NAT映射