路由器已配置成PAT方式。图1是一个最简单的NAT组网图,内网使 用192.168.1.0/24的私网地址,外网是202.101.0.0/24的公网地址,而在设备连接外网的接口上我们启用了NAT。
我们从内网的PC1去PING外网的SERVER是可以成功的,而我们在设备AR2上看到了这样的一个表项,如图2所示(截取一个数据包为例)。
当PC1的ICMP数据包到达AR2的出口接口时,源IP被替换成了接口IP,而且它将ICMP数据包中的icmpId项的值(14783十进制)也换成了新的icmpId值(10270十进制),通过会话表它就可以实现ICMP无端口转换了。所以华为的设备是通过ICMP的ID值来映射内网IP到外网IP的关系。
图1 NAT组网图
图2 设备AR2表项
图3 内网ICMP报文
图4 外网ICMP报文
通过抓包软件分别获取内网与外网的ICMP数据包如图3、图4所示。
图3是从PC1发 出的ICMP数据包,id值 为0xbf39(十六进制),转换为十进制即14783。
图4是在SERVER上接收到的ICMP数据包,id值为0x1e28(十六进制),转换为十进制即10270。
路由器已配置成PAT方式。图5是一个最简单的NAT组网图,内网使用192.168.1.0/24的私网地址,外网是63.19.6.0/24的公网地址,而在设备连接外网的接口上我们启用了NAT。
我们从内网的PC1去PING外网的SERVER0是可以成功的,而我们在设备Router0上看到了这样的一个表项,如图6所示。
思科的网络设备是随机产生端口号来映射内网IP与外网IP的关系,如果有多个IP需要映射,这是先在自己的映射表查找没有被占用的端口号,而且该映射在会话完成后会自动消除更新,这样就可以保证有充足的端口资源来映射内网IP的需求了。
实验环境:Cisco Packet Tracer (思科模拟器)
NAT对ICMP的处理取决于NAT地址转换表和NAT路由器收到ICMP fragment的顺序。我们来看一个案例,在该案例中我将发送1个大小为1473 Byte的ICMP数据 包,ping从192.168.1.3到 63.19.6.2,如图5所示。
数据包大小:因为设备默认MTU是1500字节,去掉20字节的IP头部和8字节的ICMP头部,实质上传送最大数据为1472字节,这样发送1473字节的数据包刚好超过就会产生分片数据包。
图5 NAT组网图
图6 NAT组网图
注意:在PT模拟器中默认PING命令是发送固定大小的数据包,但在交换机设备上可配置PING参数。也可以只输入PING命令回车,然后在后面的参数中来进行大小等参数的调整。
在这个案例中,NAT创建了一个扩展的NAT转换条目。这样在NAT中将没有任何可用的地址。NAT在收到第一个包的第一个分段(fragment)之前将丢弃所有分段。
开始的时候,我们在地址池中只设置一个IP地址来运行overloading,NAT转换表是空的。NAT的配置如下:
当数据包到达NAT路由器的时候会发生什么?
首先,第一个包的片段0到达路由器,NAT创建扩展的地址转换条目。然后NAT转换并转发了第一个包的片段0。地址转换表如表1所示。
注意:这个24320这个数字,这个是包含在ICMP头部中的ICMP 唯一标识值。只有片段0中包含这个ICMP头部。为了判断这个片段是许多片段中的一个,NAT需要跟踪IP ident value。如果好多片段拥有相同的IP ident value,那么交换机认为这属于同一个IP packet。NAT将使用同一条NAT转换条目来转换这些segment。
其次,第一个packet 的片段1到达路由器。根据它的IP ident value可以判断这个片段来自同一个packet。NAT用上面的那条NAT条目来转换和转发该片段。目的主机收到了所有的片段后发送回包。
表1 地址转换表
分析:如果分片数据数据不是按照顺序到达,比如是片段1先到达路由设备,它并没有包含ICMP信息,NAT是如何建立映射表进行转发,因为没有遇到这种情况,也未抓到相应数据包,希望以后有机会如愿再进行交流。
虽然NAT可以解决IP地址空间不足,也可以很好地隐藏内部网络的拓扑结构,使网络更安全。但是它毕竟修改了报文的内容,随着应用场景的不断增多,相信还有很多需要NAT进行特殊处理的地方,这些地方有待于我们继续挖掘、探讨,使得NAT技术更加完善。