Cisco IOS Unicast NAT 工作原理 [一]

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介:
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 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.
•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
!
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
 
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
 
 
我们这里重点关注的就是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#
从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
 
从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.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,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
6月前
|
存储 运维 安全
iOS加固原理与常见措施:保护移动应用程序安全的利器
iOS加固原理与常见措施:保护移动应用程序安全的利器
90 0
|
6月前
|
存储 运维 安全
iOS加固原理与常见措施:保护移动应用程序安全的利器
iOS加固原理与常见措施:保护移动应用程序安全的利器
144 0
|
15天前
|
网络协议 安全 网络架构
NAT穿透技术、穿透原理和方法
【10月更文挑战第19天】 NAT穿透技术、穿透原理和方法
50 7
|
27天前
|
网络协议 安全 网络安全
Cisco-网络端口地址转换NAPT配置
Cisco-网络端口地址转换NAPT配置
|
27天前
|
安全 网络安全 数据安全/隐私保护
Cisco-网络地址转换动态NAT
Cisco-网络地址转换动态NAT
|
27天前
|
安全 网络安全 数据安全/隐私保护
Cisco-网络地址转换静态NAT
Cisco-网络地址转换静态NAT
|
3月前
|
负载均衡 算法 Linux
在Linux中,LVS-NAT模式的原理是什么?
在Linux中,LVS-NAT模式的原理是什么?
|
6月前
|
网络协议 网络架构
NAT 原理与实验操作
NAT 原理与实验操作
|
6月前
|
安全 前端开发 数据安全/隐私保护
【教程】 iOS混淆加固原理篇
本文介绍了iOS应用程序混淆加固的缘由,编译过程以及常见的加固类型和逆向工具。详细讨论了字符串混淆、类名、方法名混淆、程序结构混淆加密等加固类型,并介绍了常见的逆向工具和代码虚拟化技术。
|
6月前
|
安全 算法 前端开发
【完整版教程】iOS混淆加固原理篇
在iOS开发中,应用程序的安全性和保护显得尤为重要。由于iOS系统的开放性,一些逆向工具可以轻松地对应用程序进行反编译和分析,从而导致应用程序源代码、算法和敏感信息的泄露。为了保护应用程序的安全性,我们需要对应用程序进行混淆加固。本文将介绍iOS混淆加固的原理和常见的加固类型。