什么是NAT
NAT(Network Address Translation)是一种地址转换技术,它可以将IP数据报文头中的IP地址转换为另一个IP地址,并通过转换端口号达到地址重用的目的。NAT作为一种缓解IPv4公网地址枯竭的过渡技术,由于实现简单,得到了广泛应用。
NAT解决了什么问题
随着网络应用的增多,IPv4地址枯竭的问题越来越严重。尽管IPv6可以从根本上解决IPv4地址空间不足问题,但目前众多网络设备和网络应用大多是基于IPv4的,因此在IPv6广泛应用之前,使用一些过渡技术(如CIDR、私网地址等)是解决这个问题的主要方式,NAT就是这众多过渡技术中的一种。
当私网用户访问公网的报文到达网关设备后,如果网关设备上部署了NAT功能,设备会将收到的IP数据报文头中的IP地址转换为另一个IP地址,端口号转换为另一个端口号之后转发给公网。在这个过程中,设备可以用同一个公网地址来转换多个私网用户发过来的报文,并通过端口号来区分不同的私网用户,从而达到地址复用的目的。
早期的NAT是指Basic NAT,Basic NAT在技术上实现比较简单,只支持地址转换,不支持端口转换。因此,Basic NAT只能解决私网主机访问公网问题,无法解决IPv4地址短缺问题。后期的NAT主要是指网络地址端口转换NAPT(Network Address Port Translation),NAPT既支持地址转换也支持端口转换,允许多台私网主机共享一个公网IP地址访问公网,因此NAPT才可以真正改善IP地址短缺问题。
NAT的类型
根据NAT转换是对报文中的源地址进行转换还是对目的地址进行转换,NAT可以分为源NAT、目的NAT和双向NAT,下面我们分别介绍这三种NAT类型。
源NAT
源NAT在NAT转换时,仅对报文中的源地址进行转换,主要应用于私网用户访问公网的场景。当私网用户主机访问Internet时,私网用户主机发送的报文到达NAT设备后,设备通过源NAT技术将报文中的私网IPv4地址转换成公网IPv4地址,从而使私网用户可以正常访问Internet。
根据转换时是否同时转换源端口号,源NAT可以细分为如下几种类型,详见下图。

目的NAT
目的NAT在NAT转换时,仅对报文中的目的地址和目的端口号进行转换,主要应用于公网用户访问私网服务的场景。当公网用户主机发送的报文到达NAT设备后,设备通过目的NAT技术将报文中的公网IPv4地址转换成私网IPv4地址,从而使公网用户可以使用公网地址访问私网服务。
根据转换前后的地址是否存在一种固定的映射关系,目的NAT可以细分为如下几种类型,详见下图。

双向NAT
双向NAT指的是在转换过程中同时转换报文的源信息和目的信息。双向NAT不是一个单独的功能,而是源NAT和目的NAT的组合。双向NAT是针对同一条流,在其经过设备时同时转换报文的源地址和目的地址。双向NAT主要应用在同时有外网用户访问内部服务器和私网用户访问内部服务器的场景。
NAT是如何工作的
根据前面的分类,我们分别从源NAT和目的NAT中各选一种NAT为代表,介绍其工作原理。其他类型的NAT虽然在转换时,转换的内容有细微差别,但是工作原理都相似,不再重复介绍。此外,双向NAT是源NAT和目的NAT的组合,双向NAT的工作原理也不再重复介绍。
NAPT工作原理
NAPT在进行地址转换的同时还进行端口转换,可以实现多个私网用户共同使用一个公网IP地址上网。NAPT根据端口来区分不同用户,真正做到了地址复用。

当Host访问Web Server时,设备的处理过程如下:
- 设备收到Host发送的报文后查找NAT策略,发现需要对报文进行地址转换。
- 设备根据源IP Hash算法从NAT地址池中选择一个公网IP地址,替换报文的源IP地址,同时使用新的端口号替换报文的源端口号,并建立会话表,然后将报文发送至Internet。
- 设备收到Web Server响应Host的报文后,通过查找会话表匹配到步骤2中建立的表项,将报文的目的地址替换为Host的IP地址,将报文的目的端口号替换为原始的端口号,然后将报文发送至Intranet。
NAT Server工作原理
使用NAT Server时,需要先在设备上配置公网地址和私网地址的固定映射关系。配置完成后,设备将会生成Server-Map表项,存放公网地址和私网地址的映射关系。该表项将一直存在除非NAT Server的配置被删除。

内部Server的私网IPv4地址为192.168.1.2/24,对外的公网IPv4地址为1.1.1.10,端口号都为80,它们之间的映射关系在设备上已提前配置好。当Host访问Server时,设备的处理过程如下:
- 设备收到Internet上用户访问1.1.1.10的报文的首包后,查找并匹配到Server-Map表项,将报文的目的IP地址转换为192.168.1.2。
- 设备建立会话表,然后将报文发送至Intranet。
- 设备收到Server响应Host的报文后,通过查找会话表匹配到步骤2中建立的表项,将报文的源地址替换为1.1.1.10,然后将报文发送至Internet。
- 后续Host继续发送给Server的报文,设备都会直接根据会话表项的记录对其进行转换,而不会再去查找Server-map表项。
实验
还是老样子先奉上完整拓扑(已配置好)戳我🌹
拓扑图

概述
- 人事部所在网络使用NAT No-PAT 地址池:10.1.1.50—10.1.1.100
- 财务部所在网络使用NAPT 地址池:10.1.1.110—10.1.1.160
- 研发部所在网络使用Easy IP 共用出口地址即AR3的g0/0/1口
配置命令
AR1上:
// 创建nat地址池
nat address-group 1 10.1.1.50 10.1.1.100
// 创建高级ACL(用低级ACL也可以)
acl 3000
rule permit ip source 192.168.10.0 0.0.0.255
// 在出接口上使用
int g0/0/1
nat outbound 3000 address-group 1 no-pat // 配置NAT No-PAT
不清楚什么是ACL的可以看我这篇文章 戳我🌹
AR2上:
// 创建nat地址池
nat address-group 1 10.1.1.110 10.1.1.160
// 创建高级ACL(用低级ACL也可以)
acl 3000
rule permit ip source 192.168.20.0 0.0.0.255
// 在出接口上使用
int g0/0/2
nat outbound 3000 address-group 1 // 配置NPAT
AR3上:
// 创建高级ACL(用低级的也可以)
acl 3000
rule permit ip source 192.168.30.0 0.0.0.255
// 在出接口上使用
int g0/0/1
nat outbound 3000 // Easy IP
测试
首先使用 display nat outbound 查看各路由器NAT模式是否正确
AR1

AR2

AR3

下面使用pc机 ping AR5 并使用 display nat session all 查看地址转换情况(或者使用抓包工具)
pc1 ping AR5

地址转换情况

可以看到转换后的地址是我们地址池中的地址,并且每ping一次就会换一个地址(我ping了2次)
pc3 ping AR5

地址转换情况

这里我ping了两次,可以看到转换后是一个地址,但是IcmpId不一样
pc5 ping AR5

地址转换情况

可以看到将地址转换为出口地址即AR3的g0/0/1口(10.1.1.3)
本文完
敬爱与明天🌹