准备工作

设备连接

首先按照如下拓扑图连接设备:

拓扑图

有一点需要注意的地方:一开始有些路由器默认是没有串口的,如果要使用串口,还需要在路由器的物理界面进行安装,如下图。

安装串口模块

基本配置

按照拓扑图中的标注,先给路由器端口配置上ip地址,并且开启。可以使用如下的图形界面配置,也可以在命令行配置。需要注意的一点是,使用串口一定要配上时钟频率,而且同一条串口线相连的两个路由器端口应该配置相同的时钟频率。

以太网口的图形界面配置:

以太网口配置

串口图形界面配置:

串口配置

或者也可以在命令行配置,步骤都是一样的。


然后给Router0和Router1每个配置一条默认路由。

在Router0的终端配置模式中输入ip route 192.168.2.0 255.255.255.0 s0/0/0,在Router1的终端配置模式中输入ip route 192.168.1.0 255.255.255.0 s0/0/0 就完成了。之后可以在特权模式下输入show ip route 来查看路由表确认。


最后,给每一台pc按照拓扑图配置上IP地址、子网掩码和默认网关,准备工作就完成了。

接下来会将Router0作为NAT设备来继续试验验证。

静态NAT验证

静态NAT配置

进入Router0的配置模式,然后输入下面的指令:

Router0(config)#ip nat inside source static 192.168.1.2 200.1.1.254 
Router0(config)#interface fa0/0
Router0(config-if)#ip nat inside
Router0(config-if)#exit
Router0(config)#interface s0/0/0
Router0(config-if)#ip nat outside
Router0(config-if)#end
Router0#debug ip nat

这些指令的意思是:开启nat模式将192.168.1.2静态映射为200.1.1.254,并将fa0/0接口设置为面向内网的接口,将s0/0/0设置为面向外网的接口。最后打开debug模式。这样一来,内网的192.168.1.2这个内部本地地址就可以被成功地转化为200.1.1.254这个内部全局地址,并且以新的身份和外部通信了。

测试

使用ip为192.168.1.2的PC去ping 192.168.2.2,发现能够ping通。这时回到Router0上,可以看到终端打印出了nat地址转换的记录。如果输入show ip nat translations还可以看到nat转换表中有这样的记录:

Pro  Inside global     Inside local       Outside local      Outside global
---  200.1.1.254       192.168.1.2        ---                ---

说明转换成功了。

动态NAT验证

动态NAT配置

不同于静态的NAT,动态的NAT通常是多数内网设备使用少量的内部全局地址,因此,需要配置一个list记录需要转换的内部本地地址,然后配置一个ip pool放入可以使用的内部全局地址,让路由器动态分配转换。

先删除掉上面配置的静态NAT,然后重新配置动态NAT:

Router0(config)#no ip nat inside source static 192.168.1.2 200.1.1.254
Router0(config)#access-list 1 permit 192.168.1.0 0.0.0.255
Router0(config)#ip nat pool nju 200.1.1.253 200.1.1.254 netmask 255.255.255.0
Router0(config)#ip nat inside source list 1 pool nju

简单说明一下:access-list一句创建了一个名为1的list表示需要进行转换的内网本地地址范围,然后ip nat pool设置了一个从200.1.1.253到200.1.1.254这个范围(即就俩ip地址)的名为nju的ip池,后面的0.0.0.255是wildcard mask,即子网掩码按位取反的结果。最后把list和pool绑定起来,就完成配置了。

测试

这次用ip为192.168.1.2的PC和192.168.1.3的PC去ping 192.168.2.2,发现都可以ping通,并且在Router0上面可以看到地址转换的记录。这个时候抓紧时间马上用192.168.1.4的PC去ping 200.1.1.2发现ping不通,原因是NAT的路由器已经吧IP池里面的两个可用的内部全局地址分配完了,不能再给这个新设备分配,这个设备也就没办法与外界沟通了。

但是等待一段时间后,Router0就会把没在用的内部全局地址释放回ip池,这样再用192.168.1.4的PC去ping又可以ping通了。也可以手动输入clear ip nat translation *来清空Router0上的nat转换表,释放所有内部全局地址回ip池。

PAT(过载NAT)验证

过载NAT配置

先删除掉之前的动态NAT配置的list和pool的绑定关系,然后再删除掉pool,这次用只有一个ip地址的pool来做过载NAT。

Router0(config)#no ip inside source list 1 pool nju
Router0(config)#no ip nat pool nju 200.1.1.253 200.1.1.254 netmask 255.255.255.0
Router0(config)#ip nat pool nju 200.1.1.253 200.1.1.253 netmask 255.255.255.0
Router0(config)#ip nat inside list 1 pool nju overload

测试

这次分别使用用192.168.1.2,192.168.1.3,192.168.1.4这三台PC同时ping 192.168.2.2都可以ping通。查看Router0的NAT转换表有类似如下的记录:

Router#show ip nat translations 
Pro  Inside global     Inside local       Outside local      Outside global
icmp 200.1.1.253:5     192.168.1.2:5      192.168.2.2:5      192.168.2.2:5
icmp 200.1.1.253:6     192.168.1.2:6      192.168.2.2:6      192.168.2.2:6
icmp 200.1.1.253:7     192.168.1.2:7      192.168.2.2:7      192.168.2.2:7
icmp 200.1.1.253:8     192.168.1.2:8      192.168.2.2:8      192.168.2.2:8
icmp 200.1.1.253:1024  192.168.1.3:1      192.168.2.2:1      192.168.2.2:1024
icmp 200.1.1.253:1025  192.168.1.3:2      192.168.2.2:2      192.168.2.2:1025
icmp 200.1.1.253:1026  192.168.1.3:3      192.168.2.2:3      192.168.2.2:1026
icmp 200.1.1.253:1027  192.168.1.3:4      192.168.2.2:4      192.168.2.2:1027
icmp 200.1.1.253:1028  192.168.1.4:1      192.168.2.2:1      192.168.2.2:1028
icmp 200.1.1.253:1029  192.168.1.4:2      192.168.2.2:2      192.168.2.2:1029
icmp 200.1.1.253:1030  192.168.1.4:3      192.168.2.2:3      192.168.2.2:1030
icmp 200.1.1.253:1031  192.168.1.4:4      192.168.2.2:4      192.168.2.2:1031

可以看到,每次通讯NAT设备都给内部的ip地址在200.1.1.253这个地址上又分配了一个端口来转化ip地址。虽然IP池中只有一个地址,却能够对应多台内网设备的内部本地地址,这就是PAT或者过载NAT技术。

关于PAT处理ICMP报文的补充说明

ICMP是第三层协议,ICMP报文由一个IP报文首部和ICMP报文连接而成,而ICMP报文又包含自己的首部和数据部分。但是无论是在哪个部分,都没有关于端口号的说明。内网的主机去ping外网时,ICMP请求报文还好,但是当应答报文回来的时候,PAT如果根据端口号来区分一个ICMP的应答究竟是发给哪一个内网主机的呢(ICMP应答中的目的IP地址都是相同的)?

经过观察,我发现ICMP报文中的Sequence Number起到了模拟端口号的作用。如下图所示,我们看到在PAT网关处,ICMP报文内容发生了一点微妙的变化:

in

上图是内网主机发给PAT网关的ICMP报文内容

out

上图是PAT网关路由器转换后的ICMP报文内容。可见,ICMP请求的序列号发生了变化。而对方产生这个ICMP报文的应答报文时,也会使用同样的序列号,这样一来,路由器就知道这个序列号对应的是给谁的应答了。

通过查看NAT转换表也能看出这一点:

nat translation

发现ICMP中SEQ NUMBER 的变化恰好对应了这里端口号的变化。因此,有理由相信这里ICMP报文的序列号充当了区分端口的作用,使得PAT机制能够正常运转。

PS:如果沟通中使用的是第四层以上的协议,本来就有端口号的定义,那么网关路由器会正常地按照端口号处理地址映射(通常保持端口号不变,如果两个内网主机使用同一端口号时可能造成混淆,这个时候才会采用新的端口号来映射)。

参考资料

How to Configure Dynamic NAT in Cisco Router

How to Configure Static NAT in Cisco Router

Configure PAT in Cisco Router with Examples