哈工大计算机网络课程网络层协议详解之:网络地址转换NAT
上一节中,我们在DHCP协议中介绍了主机如何配置自己的IP地址,可以通过手动静态配置的方式,或者是利用DHCP协议动态配置的方式。在本节中,我们继续深入探究另一个问题,即:IP地址从哪里来? DHCP协议中我们知道了主机如何配置自己的IP地址,但是这个DHCP服务器返回的IP地址从哪里来?
实际上,是从我们子网对应的ISP(Internet Service Provider)互联网服务提供商,也就是移动、联通、电信这些运营商中来的。
但是这些运营商的IP地址又从哪儿来呢?最终,层层向上追溯来看,IP地址会通过一个国际组织:ICANN(The Internet Corporation for Assigned Names and Numbers)来进行分配。
百度百科
ICANN(The Internet Corporation for Assigned Names and Numbers)互联网名称与数字地址分配机构是一个非营利性的国际组织,成立于1998年10月,是一个集合了全球网络界商业、技术及学术各领域专家的非营利性国际组织,负责在全球范围内对互联网唯一标识符系统及其安全稳定的运营进行协调,包括互联网协议(IP)地址的空间分配、协议标识符的指派、通用顶级域名(gTLD)以及国家和地区顶级域名(ccTLD)系统的管理、以及根服务器系统的管理。这些服务最初是在美国政府合同下由互联网号码分配当局(Internet Assigned Numbers Authority,IANA)以及其它一些组织提供。ICANN行使IANA的职能。
遗憾的是,随着近些年互联网的急速发展,对于IPv4的32位地址空间来说,可用于公共互联网的地址已经几乎分配殆尽了。此时,在我们实际的网络通信中,经常会有一些主机所使用的地址是私有地址,这些私有地址在通信过程中,是不能在公共互联网出现的。要保证这些私有地址能够在公共互联网中出现并被识别,就需要一些特殊的协议来支持,这里最典型的协议就是NAT(Network Address Translation)网络地址转换。
网络地址转换(NAT)
假设有下面一个网络结构,左侧是公共互联网Internet,右侧是一个本地网络,比如家庭网络,使用的是10.0.0/24,使用的是一个私有地址,这些主机要在公共互联网上通信的时候就必须要求路由器在将数据报转发到公共网络之前,进行地址转换。
作为这个路由器首先必须具备地址转换的功能,同时必须拥有至少一个公共IP地址(也就是俗称的合法IP地址),这样才能将私有地址进行转换成该公共IP地址。
有了地址转换功能后,此时所有离开本地网络的数据报的源IP地址都会替换成相同的NAT IP地址,也就是图中的路由器公共IP地址:138.76.29.7。
但是,如果所有的数据报都换成同一个源IP地址后,上层应用比如传输层,就无法区分这些请求究竟来源于具体哪一台主机。同时,数据报返回时,该路由器也无法识别应该返回给哪一台主机。此时就需要借助于TCP/IP协议传输时,携带的源端口号和目的端口号来区分。利用端口号记录每次转换时的对应关系,进而根据返回数据报的端口,还原出源主机地址信息。
NAT协议提供的动机:
-
只需/能从ISP申请一个IP地址。比如一个本地网络只需要分配一个公共IP地址,其余的私有地址可以内部进行分配,并支持网络内部的通信。此时一个公共IP可以对应若干个主机,而原先的方式一个公共IP只能对应一个主机。
因为IPv4地址逐渐耗尽,需要利用这种方法,减少公共IP地址的分配和浪费。
-
本地网络设备IP地址的变更,无需通告外界网络。
因为内部都是私有内置,对外只有一个公共IP地址,内部网络设备IP地址的变更,无需通告外界。
-
变更ISP时,无需修改内部网络设备IP地址。
比如原先本地网络的ISP是借助于联通接入,后来更换成移动。此时只需要变更ISP提供的公网地址,而不用修改本地网络设备的IP地址。
-
内部网络设备对外界网络不可见,即不可直接寻址(安全)。
NAT实现原理
目前NAT实现最典型的方式是一次替换,一次记录,再一次替换来完成的。
- 第一次替换:把要离开内部网络去到公共网路的数据报(源IP地址,源端口号),利用NAT地址转换替换成外出IP数据报(NAT IP地址,新端口号)。
- 记录:将每对(NAT IP地址,新端口号)与(源IP地址,源端口号)的替换信息存储到NAT转换表中。
- 第二次替换:根据上述记录的NAT转换表,利用(源IP地址,源端口号)替换每个进入内网IP数据报的(目的IP地址,目的端口号),即(NAT IP地址,新端口号)。实际上就是把替换成的公共IP地址和端口号,还原成本地网络中的IP地址和源端口,从而被内网的主机进行接收。
示例性过程如下图所示:
- 路由器的公共IP地址为138.76.29.7,并包含NAT转换表来记录私有地址—>公网地址的转换记录。
- 假设此时内网中的主机10.0.0.1,端口号为3345的应用进程,要与公网的主机128.119.40.186,端口号为80的应用进程通信,发送数据报。
- 数据报到达路由器后,会进行一次替换,将源IP地址,替换成路由器公网IP地址,因此出口IP变成:128.119.40.186,新的源端口号更新为5001。
- 记录本次NAT转换,WAN端地址为138.75.29.7,端口号5001。LAN端地址为10.0.0.1,端口号3345。
- 目的主机应用进程返回响应报文,到达路由器后,数据报的目的IP地址就是该路由器的公网IP地址:138.76.29.7,端口号5001
- 路由器检索NAT转换表,进行第二次替换,将该目的地址转换成内部网络的主机IP地址与端口号,即重新转换成:10.0.0.1,端口号334
- 最后,根据转换后的目的IP地址和端口号,向内网的目的主机上转发。
在NAT的地址转换中,需要根据端口号来区分私有网络中不同主机应用进程的请求,而端口号是16bit,表示的范围在0~65535之间。因此,一个公共IP地址可以对应区分的端口号为65536个,相当于可以同时支持60000多并行连接。
NAT主要争议:
- NAT目前主要嵌入到路由器中来实现,而路由器作为标准第三层设备,实现的应该是第三层的功能,而不应该把第三层中的IP数据段中的内容还拿出来进行修改,违背了网络层次关系。
- 违背了端到端通信原则。我们知道端口号是传输层持有的,传输层是端到端的通信。既然是端到端的通信,那么通信链路中的路由器等网络设备,都不应该对其进行修改。
- 地址匮乏问题不应该由NAT来解决,应该由下一代IP地址 IPv6来解决。
尽管NAT的引入带了了一些问题和争议,但不可否认的是,NAT技术的出现很好的解决了IPv4地址溃泛等问题,是一项值得肯定的技术。
NAT穿透问题
假设内部网络运行着一个服务器,IP地址为10.0.0.1,而外部网络希望访问这个服务器的话,该怎么做呢?
显然,外部网络的用户是无法直接通过私有IP地址10.0.0.1来访问的。对于外部用户,所能看到访问的,是NAT路由器的公共IPi地址:138.76.29.7。
此时,为了让外部用户能够访问私有网络的主机,就需要进行NAT穿透,相当于穿透NAT,访问NAT路由器后面连接的私有网络。
NAT穿透问题的解决方案
方案一:静态配置NAT,将特定端口的连接请求转发给服务器。
该方案利用NAT路由器的NAT转换表,配置特定的端口号,将该特定的端口号映射为私有网络服务器的IP地址。此时,外部网络客户端的请求携带上该特定目的端口,就可以利用NAT转换表,转换成访问私有网络服务器的请求,实现NAT穿透。
e.g. 配置特定端口号2500,记录转发表的映射关系:(138.76.29.7, 2500) -> (10.0.0.1, 25000)。
方案二:利用UPnP(Universal Plug and Play)互联网网关设备协议(IGD-Internet Gateway Device)自动配置:
这种方案是方案一中实现的目的是一样的,最终都是在NAT转换表中记录到私有网络主机IP地址的转换关系,只是实现的技术不同。
作为NAT路由器,要支持UPnP协议,这个协议使得内部的主机可以自动地获取到NAT公共IP地址,并且通过这个协议,可以实现在NAT转换表中添加/删除端口映射。
完成这样的转发表配置后,内部网络服务器提供的服务就可以借助公共IP地址和端口号,向外发布它所提供的服务,并注册在NAT转发表中。这样外部网络的请求就可以借助NAT地址转换,利用注册端口号转发到对应内部网络的主机中,实现NAT穿透。
方案三:中继(如Skype)
NAT内部的客户与中继服务器建立连接。
外部客户也与中继服务器建立连接。
由中继服务器实现外部客户请求的转发到内部客户。中继服务器桥接两个连接的分组。文章来源:https://www.toymoban.com/news/detail-500814.html
文章来源地址https://www.toymoban.com/news/detail-500814.html
到了这里,关于哈工大计算机网络课程网络层协议详解之:网络地址转换NAT的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!