准备工作
设备连接
首先按照如下拓扑图连接设备:
有一点需要注意的地方:一开始有些路由器默认是没有串口的,如果要使用串口,还需要在路由器的物理界面进行安装,如下图。
基本配置
按照拓扑图中的标注,先给路由器端口配置上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报文内容发生了一点微妙的变化:
上图是内网主机发给PAT网关的ICMP报文内容
上图是PAT网关路由器转换后的ICMP报文内容。可见,ICMP请求的序列号发生了变化。而对方产生这个ICMP报文的应答报文时,也会使用同样的序列号,这样一来,路由器就知道这个序列号对应的是给谁的应答了。
通过查看NAT转换表也能看出这一点:
发现ICMP中SEQ NUMBER 的变化恰好对应了这里端口号的变化。因此,有理由相信这里ICMP报文的序列号充当了区分端口的作用,使得PAT机制能够正常运转。
PS:如果沟通中使用的是第四层以上的协议,本来就有端口号的定义,那么网关路由器会正常地按照端口号处理地址映射(通常保持端口号不变,如果两个内网主机使用同一端口号时可能造成混淆,这个时候才会采用新的端口号来映射)。
参考资料
How to Configure Dynamic NAT in Cisco Router