众所周知,NAT可以使用ACL和Route-map来进行所需翻译源地址和目的地址的选定。

R1(config)#ip nat inside source ?

 list        Specify access list describing local addresses
 route-map Specify route-map
 static      Specify static local->global mapping
我们可以看到NAT可以使用静态,ACL,Route-map来进行选定需要翻译的地址。其中ACL和Route-map都是可以选定复杂地址对的。因为Route-map中可以引用ACL,同时还可以match很多其他的信息。那么可以说Route-map比ACL能更为具体的来进行地址对的匹配。那么是不是他们的区别就仅限于此呢。我们先来看一个例子。
 

深入了解NAT中ACL和Route-map的区别_第1张图片

本例中,PC1的IP地址为192.168.12.2。他需要在访问到PC2时,被R1 NAT为地址192.168.3.1。在访问PC3时,被R1 NAT为IP地址192.168.5.1。
情况一 使用list匹配ACL
在配置R1的时候,使用如下ACL来进行匹配
access-list 100 permit ip 192.168.12.0 0.0.0.255 192.168.34.0 0.0.0.255
access-list 101 permit ip 192.168.12.0 0.0.0.255 192.168.56.0 0.0.0.255
 
开辟地址池,将ACL用list来进行匹配响应的策略
ip nat pool pool_3 192.168.3.1 192.168.3.254 netmask 255.255.255.0
ip nat pool pool_5 192.168.5.1 192.168.5.254 prefix-length 24
ip nat inside source list 100 pool pool_3
ip nat inside source list 101 pool pool_5
 
在接口上开启NAT之后,开始运行NAT。从ACL上看,没有任何问题。去往34网段的变为3,去往56网段的变成5。但是实际上会正常运行吗,我们来看下。
 
首先ping 192.168.34.4,没有问题,观察R1的NAT表,我们可以看到如下条目
PC1#ping 192.168.34.4
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.34.4, timeout is 2 seconds:
!!!!!
 
R1#sh ip nat translations
Pro Inside global       Inside local       Outside local      Outside global
icmp 192.168.3.3:14     192.168.12.2:14    192.168.34.4:14    192.168.34.4:14
--- 192.168.3.3         192.168.12.2       ---                ---
 
然后再用PC1来ping 192.168.56.6,按道理来说应该一样会成功,同时NAT表会出现新的条目,但是结果是这样吗
PC1#ping 192.168.56.6
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.56.6, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
 
结果我们发现PC1ping 不通56.6这个地址。再来看R1的NAT表,同时打开R5的debug ip packet,看看有什么发现。
 
R1#sh ip nat translations
Pro Inside global       Inside local       Outside local      Outside global
--- 192.168.3.3         192.168.12.2       ---                ---
 
R5(config)#
*Jan 2 08:28:46.726: IP: s=192.168.56.6 (Ethernet0/0), d=192.168.3.3, len 56, input feature, MCI Check(64), rtype 0, forus FALSE, sendself FALSE, mtu 0
*Jan 2 08:28:46.726: IP: s=192.168.56.6 (Ethernet0/0), d=192.168.3.3, len 56, unroutable
 
可见R1并没有像我们想象的那样,顺利的将192.168.12.1翻译到192.168.5.x。而是沿用了192.168.3.x。原因就是因为list匹配的ACL在翻译的时候,仅在NAT表中留下inside global和inside local表项,并没有记录outside那边的情况。所以当目的地址改变的时候,由于NAT表里面已经有表项了,所以R1直接沿用原来的表项,将192.168.12.1翻译成192.168.3.x。
 
情况二 使用route-map匹配
ACL沿用前面的100和101,route-map和NAT配置如下
route-map nat_5 permit 10
 match ip address 101
route-map nat_3 permit 10
 match ip address 100
ip nat inside source route-map nat_3 pool pool_3
ip nat inside source route-map nat_5 pool pool_5
 
那么这次配置完毕之后,效果又是什么样的呢,还是先ping下192.168.34.4
PC1#ping 192.168.34.4
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.34.4, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms
 
R1(config)#do sh ip nat t
Pro Inside global       Inside local       Outside local      Outside global
icmp 192.168.3.3:16     192.168.12.2:16    192.168.34.4:16    192.168.34.4:16
 
可以ping通,且NAT表中我们可以发现源和目的地址都有信息
再ping 192.168.56.6,我们可以发现也能成功,同时NAT表项中增加新的条目
PC1#ping 192.168.56.6
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.56.6, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms
 
R1(config)#do sh ip nat t
Pro Inside global       Inside local       Outside local      Outside global
icmp 192.168.3.3:18    192.168.12.2:18    192.168.34.4:18    192.168.34.4:18
icmp 192.168.5.1:17     192.168.12.2:17    192.168.56.6:17    192.168.56.6:17
 
总结以上几点我们可以看出,在执行NAT的时候,使用list匹配ACL和使用route-map在处理上是有区别的。在这里要申明下,如果想使用list匹配ACL,同时要达到route-map的效果,也就是匹配具体的源和目的对的话,必须使用PAT。但是在有些情况下,我们不想使用PAT,比如在×××的情况下。