老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部
随着互联网IP主机数量的迅猛增长,IPv4地址面临耗尽问题。NAT通过允许多个设备共享一个公网IP地址,减轻了对IPv4地址资源的压力,为过渡到IPv6提供了缓冲。
目前,NAT已经成为了实现IP地址共享、提高网络安全性以及网络流量负载均衡的常用方法。
今天结合数据包分析介绍NAT的基本工作原理及其常见应用。
今日文章阅读福利:《 NAT类型测试小工具NatTypeTester》/《Netframework2.0》
讲到NAT,分享一个好用的NAT类型测试小工具给你,发送暗号“Natt”即可获取。
由于这个工具需要基于NET Framework 2.0(或更高版本)使用,所以把NET Framework 2.0的资源也给到你。
私信我,发送暗号“Netf”,即可获取,各位朋友按需领取下载。
01 什么是网络地址转换(NAT)
最初,网络地址转换(NAT)是一种用于将内部网络的私网IP地址映射到公网IP地址的技术。
根据IANA提出的规范,公网路由器不为私有网络IP地址提供路由服务,以避免IP地址冲突导致的一系列问题。
引入NAT技术使得多台私网设备可以通过单一的公网IP地址访问公网,从而有效节省了IP地址资源。随着IT的发展,NAT技术逐渐被使用到提高网络安全性和网络流量负载均衡等方面的解决方案中。
图1
如图1所示,NAT设备将IP数据包中的私网IP地址修改为公网IP地址来实现私网主机接入互联网。
NAT设备:最早是路由器,现在的防火墙、上网行为管理、负载均衡等很多设备和系统都可以按需支持NAT能力。
02 NAT工作原理
01 NAT映射表机制
NAT映射表是存储NAT地址映射关系的数据结构。它记录了NAT转换前IP地址对应哪个NAT转换后IP地址。
简单的说,当数据包经过NAT设备,NAT设备会根据管理员定义的NAT策略转换数据包中的IP地址,形成转换映射关系到并记录到NAT映射表。
当接收反向数据包时,NAT设备会查找NAT映射表,将数据包中的IP地址转换回对应的IP地址。
NAT技术可以转换数据包中的源IP地址、目的IP地址,为更好的理解NAT,在这里我们将主机IP分为“内部”和“外部”。
“内部”通常指内网主机;“外部”通常指公网主机。根据NAT策略将NAT网络分为“本地”和“全局”。
“本地”通常指私网范围;“全局”通常指公网范围。具体情况以实际部署的NAT策略为准。
由此我们将理解如下四个术语的意义:
内部本地地址:指数据包在NAT网络本地时内网主机的IP地址;
内部全局地址:是指数据包在NAT网络全局时内网主机的IP地址;
外部本地地址:是指数据包在NAT网络本地时公网主机的IP地址;
外部全局地址:是指数据包在NAT网络全局时公网主机的IP地址。
切记不要从源或目的的角度来考虑NAT,因为IP数据包中的源和目的IP地址是会变化的。
尽量从“内部”和“外部”、“本地”和“全局”这样的角度出发。
图2
如图2所示,NAT设备上存在一个动态NAT映射表实例,内容包含四列,分别为内部本地地址、内部全局地址、外部本地地址、外部全局地址。
当内网主机10.3.58.101访问公网WEB服务器103.58.3.100时,内部本地地址为10.3.58.101,内部全局地址为50.84.8.1,外部本地地址为103.58.3.100,外部全局地址为103.58.3.100。
反之,如果我们现在描述从公网WEB服务器向内网主机10.3.58.101回包时的这四个地址,你会发现是一致的。
这是NAT服务一致性的基本体现。
03 NAT的类型及在网络中的应用
NAT在互联网连接共享、提高网络访问安全性、服务一致性等解决方案中发挥着重要作用。
01 NAT类型
根据业务需要,NAT技术可以转换数据包中的源IP地址、目的IP地址、传输层源端口、传输层目标端口,根据策略部署情况通常被称为:源NAT、目的NAT、源目NAT、端口NAT等。
根据NAT策略类型主要分为静态NAT和动态NAT。
静态NAT的转换策略对转换前后的IP地址和端口约束非常严格,一般是每条策略定义一个一对一转换。
动态NAT的转换策略对转换前后的IP地址和端口约束一般是范围式的,一般是多对多转换或多对一转换。
下面将结合NAT在网络中的应用来展示不同的NAT策略部署情况。
02 对公网提供服务
使用部署在企业内网的服务器对公网提供服务是最常见的一种业务服务模式,在最初大多是使用基础的静态源NAT策略。
静态NAT
将一个固定的内部地址映射到一个固定的公网地址,常用于需要始终保持可达性的服务器。将私网IP地址转换为公网IP地址,使得企业内部服务器可以对公网提供服务。
这种方式部署的NAT映射表内容是固定的,因此称为静态NAT。
图3
(图中NAT映射表未展示外部本地地址和外部全局地址)
如图3所示,部署在内网的业务服务器10.3.58.100使用公网地址50.84.8.1对公网提供服务,在NAT设备上部署了静态NAT策略。当互联网客户端103.58.3.100访问业务IP地址50.84.8.1的数据包经过NAT设备时,目标IP地址50.84.8.1被转换为10.3.58.100,并通过路由器转发至业务服务器。这样就实现了在企业内网部署业务服务器对公网提供服务。
在互联网客户端103.58.3.100上对50.84.8.1发起WEB访问并采集数据包。
分别观察当数据包位于NAT网络“内部”和“外部”时的IP地址。
图4
图4所示为当数据包位于NAT网络“外部”时的情况。
选择数据包分析视图“①”,选中数据包列表窗格中编号为1的数据包“②”,在下方的解码视图中展开互联网协议节点,可以看到数据包的目标地址为50.84.8.1“③”,即图3中业务服务器的“内部全局地址”。
图5
图5所示为当数据包位于NAT网络“内部”时的情况。可以看到数据包的目标地址为10.3.58.100“③”,即图3中业务服务器的“内部本地地址”。
03 互联网连接共享
动态NAT
动态NAT方式是目前最常见也是部署最多的。此方法允许多个内网设备使用同一个公网IP地址同时连接到互联网,并通过不同的端口号来区分。不仅节约公网IP地址,同时因为内网结构不直接暴露给外部网络,也增强了网络的安全性。
这种方式部署的NAT映射表内容是动态变化的,因此称为动态NAT。
图6
(图中NAT映射表未展示外部本地地址和外部全局地址)
如图6所示,多个内网主机在访问公网时源IP地址和源端口同时被转换,又称动态端口地址转换。
图7
(图中NAT映射表未展示外部本地地址和外部全局地址)
在大多数情况下,用于互联网连接共享的动态NAT是多对一的方式。但当内网同时上网的主机数量过大时,一个公网IP地址无法提供足够多的传输层源端口号,就可以采用图7所示的多对多动态NAT方式。多对多NAT使用了一个叫做NAT地址池的实例。
04 服务一致性
静态端口地址转换
在静态NAT的基础上,同时转换传输层端口号,可以实现多个内部服务使用同一个公网IP地址对外提供服务,如一个单位的门户网站、电子邮件系统、OA、CRM、即时通讯等,可以使用相同公网IP地址,用传输层端口号区分不同应用。
图8
(图中NAT映射表未展示外部本地地址和外部全局地址)
如图8所示,内网部署了两台服务器,分别为WEB服务器、邮件服务器,共同使用50.84.8.1这个公网地址对外提供服务。既节省了公网IP地址,又能够实现对外服务一致性,仅需注册一个域名并解析到50.84.8.1即可实现通过门户网站对用户提供统一服务的目的。
05 业务高可用性支持
在稍具规模的业务环境中,大多会部署负载均衡解决方案以提高业务性能,保障业务高可用性。在某些负载均衡解决方案中也会用到NAT技术,其中Nginx反向代理就是一个典型。
Nginx反向代理的基本作用是实现多服务器负载均衡,简单说就是为服务器提供代理。
图9
如图9所示,当Nginx反向代理使用NAT模式的负载均衡时,来自不同客户端的访问请求均发送至虚拟IP 50.84.8.1,Nginx再根据负载均衡算法将目标IP地址转换为某台后端服务器的IP地址,实现多台服务器向客户端提供服务,提高业务响应性能的同时也保障了业务的高可用性。
除此之外,当下主流业务环境中,SSL/TLS代理、客户端代理等已成为基本架构的重要组成部分,而使用这些技术将使得网络流量中的源IP地址发生变化。这对客户端IP地址识别、业务性能分析、故障排查等方面的工作造成了困难。尤其在业务性能分析和故障排查中,需要了解流量中的IP地址变化前后的对应关系,才能实现全路径追踪分析。
一般情况下,HTTP请求的流量经过代理设备后会在HTTP请求头部增加X-FORWARDED-FOR(简称XFF)字段标识NAT之前的客户端IP地址,了解了这个机制,我们就可以在流量分析的时候有的放矢了。
图10
如图10所示,TCP会话分析视图,选择HTTP会话,下方数据流解码窗格中的X-FORWARDED-FOR字段标识出了该客户端最初的IP地址是11xxxx86。
整理:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部