众所周知,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能更为具体的来进行地址对的匹配。那么是不是他们的区别就仅限于此呢。我们先来看一个例子。
本例中,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,比如在VPN的情况下。
该贴已经同步到 songjiaqi的微博 |