NAT技术的出现源于对私有网络安全性的要求以及IPv4地址不够用的现状。Cisco IOS所支持的常用NAT技术有以下几种。今天发现公司同事对Cisco NAT的实现理解的不好,导致配置出问题。这里就简单讲解一下Cisco NAT的实现原理。
1. static NAT,内部ip地址和外部ip地址的一一对应。
2. dynamic NAT,内部ip地址和外部ip地址的一对一关系,和static NAT不同的是,内部ip地址是对应的外部ip地址池,每次转换的时候会使用外部ip 地址池中的未用地址做翻译。
3. overloading NAT,也就是常用的端口地址翻译,PAT。多个内部ip地址可以通过这种技术映射到一个外部ip地址,因为一个连接是由源地址,源端口,目的地址,目的端口和协议这五元组构成的。
当然,还有其他一些NAT的实现技术,不过上面三种是最常用的。这些都是基本的NAT规则,具体大家可以参考下面这篇文档。
这里重点想要讲解的是NAT和路由表,NAT和ACL以及IPSec报文穿越情况下,报文的执行顺序和动作。下面这张表在理解NAT以及配置NAT的时候是要牢记的。
通常情况下,NAT路由器可以对源地址,目的地址,做翻译。上图左侧是ip nat inside,右侧是ip nat outside。当然NAT也可以工作在IP层之上的传输层甚至应用层,这些以后有机会在讲述。
ip nat inside source 和 ip nat outside source 是常用的配置命令,下面就通过一个例子来分析NAT的工作原理。
以下的工作原则也是必须要牢记的。
当流量的方向是从outside到inside的时候,首先会查找并匹配NAT规则并作地址转换,然后再根据目标地址查询路由转发表。当流量方向是从inside到outside的时候,首先会根据目标地址查询路由转发表(如果没有匹配路由,会丢弃),然后再查找并匹配NAT规则并作地址转换。
ip nat outside source static
•Translates the source of the IP packets that travel outside to inside.
•Translates the source of the IP packets that travel outside to inside.
•Translates the destination of the IP packets that travel inside to outside.
ip nat inside source static
•Translates the source of IP packets that travel inside to outside.
ip nat inside source static
•Translates the source of IP packets that travel inside to outside.
•Translates the destination of the IP packets that travel outside to inside.
例子拓扑:
r1
interface Loopback0
ip address 172.1.1.1 255.255.255.0
!
interface Ethernet1/0
ip address 10.1.1.1 255.255.255.0
duplex half
!
!
ip classless
ip route 0.0.0.0 0.0.0.0 10.1.1.2
!
ip address 172.1.1.1 255.255.255.0
!
interface Ethernet1/0
ip address 10.1.1.1 255.255.255.0
duplex half
!
!
ip classless
ip route 0.0.0.0 0.0.0.0 10.1.1.2
!
r2
interface Ethernet1/0
ip address 10.1.1.2 255.255.255.0
ip nat inside
no ip route-cache cef
no ip route-cache
duplex half
!
interface Ethernet1/1
ip address 10.2.2.2 255.255.255.0
ip nat outside
no ip route-cache cef
no ip route-cache
duplex half
!
ip nat inside source static 172.1.1.1 100.1.1.1
ip nat outside source static 172.3.3.3 100.3.3.3
ip classless
ip route 100.3.3.3 255.255.255.255 10.2.2.3
ip route 172.1.1.1 255.255.255.255 10.1.1.1
ip address 10.1.1.2 255.255.255.0
ip nat inside
no ip route-cache cef
no ip route-cache
duplex half
!
interface Ethernet1/1
ip address 10.2.2.2 255.255.255.0
ip nat outside
no ip route-cache cef
no ip route-cache
duplex half
!
ip nat inside source static 172.1.1.1 100.1.1.1
ip nat outside source static 172.3.3.3 100.3.3.3
ip classless
ip route 100.3.3.3 255.255.255.255 10.2.2.3
ip route 172.1.1.1 255.255.255.255 10.1.1.1
r3
!
interface Loopback0
ip address 172.3.3.3 255.255.255.0
!
interface Ethernet1/1
ip address 10.2.2.3 255.255.255.0
duplex half
!
ip classless
ip route 0.0.0.0 0.0.0.0 10.2.2.2
interface Loopback0
ip address 172.3.3.3 255.255.255.0
!
interface Ethernet1/1
ip address 10.2.2.3 255.255.255.0
duplex half
!
ip classless
ip route 0.0.0.0 0.0.0.0 10.2.2.2
我们这里重点关注的就是NAT router r2的NAT配置和路由配置,根据以上所写的绿色规则,如果从r1的环回口ping r3的环回口(ping 100.3.3.3 from 172.1.1.1),
1. ping request就是从inside到outside的流量方向,
2. 首先会在r2上查找路由转发表,是否有到目的地100.3.3.3的路由,这也是为什么r2上有一条到100.3.3.3的路由的原因,如果没有这一条路由,路由器会丢弃报文并会destination unreachable差错报文。
3. 当有路由匹配的时候,接着会查询是否有匹配的NAT规则,如果有就做NAT地址转换。这里有两条NAT规则匹配,根据上面的转换原则,源地址会被转换成100.1.1.1,目的地址会被转换成172.3.3.3。
4. 转发报文出e1/1口(ping 172.3.3.3 from 100.1.1.1)
同样的情况,当r3的环回口收到ping request(from 100.1.1.1 to 172.3.3.3)的时候,ping reply(reply from 172.3.3.3 to 100.1.1.1)会发到r2的e1/1口。
1. 根据规则,流量方向是从outside到inside方向,会首先查找匹配NAT规则,并作NAT转换,这里两条NAT规则匹配,转换后的报文是(reply from 100.3.3.3 to 172.1.1.1),
2. 然后,会根据转换后的目的地址查询r2的路由转发表,如果没有到172.1.1.1的路由条目,r2会丢弃报文并回destination unreachable差错报文,所以这里要配一条到172.1.1.1的路由,
3. 转发报文出e1/0口(reply 172.1.1.1 from 100.3.3.3)
r2上debug的情况如下,
r2#debug ip pac
r2#debug ip packet
IP packet debugging is on
r2#
r2#
r2#deb
r2#debug ip na
r2#debug ip nat
IP NAT debugging is on
r2#
r2#debug ip packet
IP packet debugging is on
r2#
r2#
r2#deb
r2#debug ip na
r2#debug ip nat
IP NAT debugging is on
r2#
r2#
从inside到outside方向的流量:
从inside到outside方向的流量:
*Sep 30 10:24:12.019: IP: tableid=0, s=172.1.1.1 (Ethernet1/0), d=100.3.3.3 (Ethernet1/1), routed via FIB
*Sep 30 10:24:12.019: NAT: s=172.1.1.1->100.1.1.1, d=100.3.3.3 [10]
*Sep 30 10:24:12.019: NAT: s=100.1.1.1, d=100.3.3.3->172.3.3.3 [10]
*Sep 30 10:24:12.019: IP: s=100.1.1.1 (Ethernet1/0), d=172.3.3.3 (Ethernet1/1), g=10.2.2.3, len 100, forward
*Sep 30 10:24:12.019: NAT: s=172.1.1.1->100.1.1.1, d=100.3.3.3 [10]
*Sep 30 10:24:12.019: NAT: s=100.1.1.1, d=100.3.3.3->172.3.3.3 [10]
*Sep 30 10:24:12.019: IP: s=100.1.1.1 (Ethernet1/0), d=172.3.3.3 (Ethernet1/1), g=10.2.2.3, len 100, forward
从outside到inside方向的流量:
*Sep 30 10:24:12.127: NAT*: s=172.3.3.3->100.3.3.3, d=100.1.1.1 [10]
*Sep 30 10:24:12.127: NAT*: s=100.3.3.3, d=100.1.1.1->172.1.1.1 [10]
*Sep 30 10:24:12.127: IP: tableid=0, s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (Ethernet1/0), routed via FIB
*Sep 30 10:24:12.127: IP: s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (Ethernet1/0), g=10.1.1.1, len 100, forward
*Sep 30 10:24:12.127: NAT*: s=172.3.3.3->100.3.3.3, d=100.1.1.1 [10]
*Sep 30 10:24:12.127: NAT*: s=100.3.3.3, d=100.1.1.1->172.1.1.1 [10]
*Sep 30 10:24:12.127: IP: tableid=0, s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (Ethernet1/0), routed via FIB
*Sep 30 10:24:12.127: IP: s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (Ethernet1/0), g=10.1.1.1, len 100, forward
*Sep 30 10:24:12.203: IP: tableid=0, s=172.1.1.1 (Ethernet1/0), d=100.3.3.3 (Ethernet1/1), routed via FIB
*Sep 30 10:24:12.203: NAT: s=172.1.1.1->100.1.1.1, d=100.3.3.3 [11]
*Sep 30 10:24:12.203: NAT: s=100.1.1.1, d=100.3.3.3->172.3.3.3 [11]
*Sep 30 10:24:12.203: IP: s=100.1.1.1 (E
r2#thernet1/0), d=172.3.3.3 (Ethernet1/1), g=10.2.2.3, len 100, forward
*Sep 30 10:24:12.251: NAT*: s=172.3.3.3->100.3.3.3, d=100.1.1.1 [11]
*Sep 30 10:24:12.251: NAT*: s=100.3.3.3, d=100.1.1.1->172.1.1.1 [11]
*Sep 30 10:24:12.251: IP: tableid=0, s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (Ethernet1/0), routed via FIB
*Sep 30 10:24:12.251: IP: s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (Ethernet1/0), g=10.1.1.1, len 100, forward
*Sep 30 10:24:12.299: IP: tableid=0, s=172.1.1.1 (Ethernet1/0), d=100.3.3.3 (Ethernet1/1), routed via FIB
*Sep 30 10:24:12.299: NAT: s=172.1.1.1->100.1.1.1, d=100.3.3.3 [12]
*Sep 30 10:24:12.299: NAT: s=100.1.1.1, d=100.3.3.3->172.3.3.3 [12]
*Sep 30 10:24:12.299: IP: s=100.1.1.1 (Ethernet1/0), d=172.3.3.3 (Ethernet1/1), g=10.2.2.3, len 100, forward
*Sep 30 10:24:12.347: NAT*: s=172.3.3.3->100.3.3.3, d=100.1.1.1 [12]
*Sep 30 10:24:12.347: NAT*: s=100.3.3.3, d=100.1.1.1->172.1.1.1 [12]
*Sep 30 10:24:12.347: IP: tableid=0, s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (
r2#Ethernet1/0), routed via FIB
*Sep 30 10:24:12.347: IP: s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (Ethernet1/0), g=10.1.1.1, len 100, forward
*Sep 30 10:24:12.407: IP: tableid=0, s=172.1.1.1 (Ethernet1/0), d=100.3.3.3 (Ethernet1/1), routed via FIB
*Sep 30 10:24:12.407: NAT: s=172.1.1.1->100.1.1.1, d=100.3.3.3 [13]
*Sep 30 10:24:12.407: NAT: s=100.1.1.1, d=100.3.3.3->172.3.3.3 [13]
*Sep 30 10:24:12.407: IP: s=100.1.1.1 (Ethernet1/0), d=172.3.3.3 (Ethernet1/1), g=10.2.2.3, len 100, forward
*Sep 30 10:24:12.547: NAT*: s=172.3.3.3->100.3.3.3, d=100.1.1.1 [13]
*Sep 30 10:24:12.547: NAT*: s=100.3.3.3, d=100.1.1.1->172.1.1.1 [13]
*Sep 30 10:24:12.547: IP: tableid=0, s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (Ethernet1/0), routed via FIB
*Sep 30 10:24:12.547: IP: s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (Ethernet1/0), g=10.1.1.1, len 100, forward
*Sep 30 10:24:12.595: IP: tableid=0, s=172.1.1.1 (Ethernet1/0), d=100.3.3.3 (Ethernet1/1), routed via FIB
*Sep 30 10:24:12.595: NAT: s=172.1.1.1->
r2#100.1.1.1, d=100.3.3.3 [14]
*Sep 30 10:24:12.595: NAT: s=100.1.1.1, d=100.3.3.3->172.3.3.3 [14]
*Sep 30 10:24:12.595: IP: s=100.1.1.1 (Ethernet1/0), d=172.3.3.3 (Ethernet1/1), g=10.2.2.3, len 100, forward
*Sep 30 10:24:12.611: NAT*: s=172.3.3.3->100.3.3.3, d=100.1.1.1 [14]
*Sep 30 10:24:12.611: NAT*: s=100.3.3.3, d=100.1.1.1->172.1.1.1 [14]
*Sep 30 10:24:12.611: IP: tableid=0, s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (Ethernet1/0), routed via FIB
*Sep 30 10:24:12.611: IP: s=100.3.3.3 (Ethernet1/1), d=172.1.1.1 (Ethernet1/0), g=10.1.1.1, len 100, forward
!所以,再设计NAT的时候,不但要考虑地址转换,还要考虑路由!
下面,我们再看一种更复杂的情况,就是在有配置访问控制列表,并有IPSec报文穿越NAT的情况下,IPSec报文在ACL/NAT/Routing的处理顺序。
请参考博客 Cisco IOS Unicast NAT 工作原理 [二]
本文转自jasonccier 51CTO博客,原文链接:http://blog.51cto.com/jasonccie/398815,如需转载请自行联系原作者