IP : 网络地址转换 (NAT)

NAT 运行顺序

2015 年 8 月 28 日 - 机器翻译
其他版本: PDFpdf | 英语 (2015 年 4 月 22 日) | 反馈


目录


简介

本文档说明使用网络地址转换 (NAT) 处理交易的顺序是基于数据包从内部网进入外部网还是基于从外部网进入内部网的。

先决条件

要求

本文档读者应了解以下主题的知识:

使用的组件

本文档不限于特定的软件和硬件版本。

注意: 本文档中的信息根据软件版本, Cisco IOS�软件版本12.2(27)

规则

有关文档规则的详细信息,请参阅 Cisco 技术提示规则

NAT 概述

在此表中,当 NAT 执行全局到本地或本地到全局转换时,每个数据流中的转换各不相同。

内部到外部 外部到内部
  • 如果使用的是 IPsec,则检查输入访问列表
  • 解密 — 对于 CET(Cisco 加密技术)或 IPsec
  • 检查输入访问列表
  • 检查输入速率限制
  • 输入记账
  • 重定向到 Web 缓存
  • 策略路由
  • 路由
  • NAT 内部到外部(本地到全局的转换)
  • 加密(检查映射和标记是否加密)
  • 检查输出访问列表
  • 检查(基于上下文的访问控制 (CBAC))
  • TCP 拦截
  • 加密
  • 排队
  • 如果使用的是 IPsec,则检查输入访问列表
  • 解密 - 对于 CET 或 IPSec
  • 检查输入访问列表
  • 检查输入速率限制
  • 输入记账
  • 重定向到 Web 缓存
  • NAT 外部到内部(全局到本地的转换)
  • 策略路由
  • 路由
  • 加密(检查映射和标记是否加密)
  • 检查输出访问列表
  • 检查 CBAC
  • TCP 拦截
  • 加密
  • 排队

NAT 配置和输出

此示例说明运算顺序对 NAT 有何影响。在这种情况下,只会显示 NAT 和路由。

5a-1.gif

在上个示例中,路由器 A 配置为将内部本地地址 171.68.200.48 转换为 172.16.47.150,如此配置中所示。

!
version 11.2
no service udp-small-servers
no service tcp-small-servers
!
hostname Router-A
!
enable password ww
!
ip nat inside source static 171.68.200.48 172.16.47.150

!--- This command creates a static NAT translation   
!--- between 171.68.200.48 and 172.16.47.150 

ip domain-name cisco.com
ip name-server 171.69.2.132
!
interface Ethernet0
 no ip address
 shutdown
!
interface Serial0
 ip address 172.16.47.161 255.255.255.240
 ip nat inside

!--- Configures Serial0 as the NAT inside interface

 no ip mroute-cache
 no ip route-cache
 no fair-queue
!
interface Serial1
 ip address 172.16.47.146 255.255.255.240
 ip nat outside

!--- Configures Serial1 as the NAT outside interface

 no ip mroute-cache
 no ip route-cache
!
no ip classless
ip route 0.0.0.0 0.0.0.0 172.16.47.145

!--- Configures a default route to 172.16.47.145


ip route 171.68.200.0 255.255.255.0 172.16.47.162
!
!
line con 0
 exec-timeout 0 0
line aux 0
line vty 0 4
 password ww
 login
!
end

转换表表明所需转换存在。

Router-A#show ip nat translation
Pro Inside global      Inside local       Outside local      Outside global
--- 172.16.47.150      171.68.200.48      ---                ---

此输出来自路由器 A,此时 debug ip packet detaildebug ip nat 启用,且从设备 171.68.200.48 发出的 ping 的目的地为 172.16.47.142。

注意: Debug 命令会生成大量输出。只有 IP 网络上的流量较低时才能使用此类命令,以避免系统上的其他活动受到负面影响。在发出 debug 命令之前,请参见关于 Debug 命令的重要信息

IP: s=171.68.200.48 (Serial0), d=172.16.47.142, len 100, unroutable
    ICMP type=8, code=0
IP: s=172.16.47.161 (local), d=171.68.200.48 (Serial0), len 56, sending
    ICMP type=3, code=1
IP: s=171.68.200.48 (Serial0), d=172.16.47.142, len 100, unroutable
    ICMP type=8, code=0
IP: s=171.68.200.48 (Serial0), d=172.16.47.142, len 100, unroutable
    ICMP type=8, code=0
IP: s=172.16.47.161 (local), d=171.68.200.48 (Serial0), len 56, sending
    ICMP type=3, code=1
IP: s=171.68.200.48 (Serial0), d=172.16.47.142, len 100, unroutable
    ICMP type=8, code=0
IP: s=171.68.200.48 (Serial0), d=172.16.47.142, len 100, unroutable
    ICMP type=8, code=0
IP: s=172.16.47.161 (local), d=171.68.200.48 (Serial0), len 56, sending
    ICMP type=3, code=1

由于上一次的输出中没有 NAT 调试消息,因此知道未使用现有的静态转换,并且路由器的路由选择表中没有对应于目标地址 (172.16.47.142) 的路由。不可路由数据包的结果是一个 ICMP 不可达消息,该消息将发送至内部设备。leavingcisco.com

但是,路由器 A 的默认路由为 172.16.47.145,那么,为什么该路由被视为不可路由的路由呢?

路由器 A 已配置 no ip classless,这意味着如果数据包的目的地是子网存在于路由选择表中的“主要”网络地址(在这种情况下为 172.16.0.0),那么该路由器不依靠默认路由。也就是说,如果发出 no ip classless 命令,则会关闭路由器使用最长的位匹配寻找路由的功能。为了更改此行为,您必须在路由器 A 上配置 ip classless。默认情况下,在安装有 Cisco IOS 软件版本 11.3 及更高版本的 Cisco 路由器上,ip classless 命令处于启用状态。

Router-A#configure terminal
Enter configuration commands, one per line.  End with CTRL/Z.
Router-A(config)#ip classless
Router-A(config)#end

Router-A#show ip nat translation
%SYS-5-CONFIG_I: Configured from console by console nat tr
Pro Inside global      Inside local       Outside local      Outside global
--- 172.16.47.150      171.68.200.48      ---                ---

当您像之前一样重复相同的 ping 测试时,您看到数据包被转换,ping 成功。


Ping Response on device 171.68.200.48

D:\>ping 172.16.47.142
Pinging 172.16.47.142 with 32 bytes of data:

Reply from 172.16.47.142: bytes=32 time=10ms TTL=255
Reply from 172.16.47.142: bytes=32 time<10ms TTL=255
Reply from 172.16.47.142: bytes=32 time<10ms TTL=255
Reply from 172.16.47.142: bytes=32 time<10ms TTL=255

Ping statistics for 172.16.47.142:
    Packets: Sent = 4, Received = 4, Lost = 0 (0%)
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum =  10ms, Average =  2ms

Debug messages on Router A indicating that the packets generated by device 
171.68.200.48 are getting translated by NAT. 

Router-A#
*Mar 28 03:34:28: IP: tableid=0, s=171.68.200.48 (Serial0), d=172.16.47.142 
(Serial1), routed via RIB
*Mar 28 03:34:28: NAT: s=171.68.200.48->172.16.47.150, d=172.16.47.142 [160]
*Mar 28 03:34:28: IP: s=172.16.47.150 (Serial0), d=172.16.47.142 (Serial1),
 g=172.16.47.145, len 100, forward
*Mar 28 03:34:28: ICMP type=8, code=0
*Mar 28 03:34:28: NAT*: s=172.16.47.142, d=172.16.47.150->171.68.200.48 [160]
*Mar 28 03:34:28: IP: tableid=0, s=172.16.47.142 (Serial1), d=171.68.200.48 
(Serial0), routed via RIB
*Mar 28 03:34:28: IP: s=172.16.47.142 (Serial1), d=171.68.200.48 (Serial0), 
g=172.16.47.162, len 100, forward
*Mar 28 03:34:28: ICMP type=0, code=0
*Mar 28 03:34:28: NAT*: s=171.68.200.48->172.16.47.150, d=172.16.47.142 [161]
*Mar 28 03:34:28: NAT*: s=172.16.47.142, d=172.16.47.150->171.68.200.48 [161]
*Mar 28 03:34:28: IP: tableid=0, s=172.16.47.142 (Serial1), d=171.68.200.48 
(Serial0), routed via RIB
*Mar 28 03:34:28: IP: s=172.16.47.142 (Serial1), d=171.68.200.48 (Serial0), 
g=172.16.47.162, len 100, forward
*Mar 28 03:34:28: ICMP type=0, code=0
*Mar 28 03:34:28: NAT*: s=171.68.200.48->172.16.47.150, d=172.16.47.142 [162]
*Mar 28 03:34:28: NAT*: s=172.16.47.142, d=172.16.47.150->171.68.200.48 [162]
*Mar 28 03:34:28: IP: tableid=0, s=172.16.47.142 (Serial1), d=171.68.200.48 
(Serial0), routed via RIB
*Mar 28 03:34:28: IP: s=172.16.47.142 (Serial1), d=171.68.200.48 (Serial0), 
g=172.16.47.162, len 100, forward
*Mar 28 03:34:28: ICMP type=0, code=0
*Mar 28 03:34:28: NAT*: s=171.68.200.48->172.16.47.150, d=172.16.47.142 [163]
*Mar 28 03:34:28: NAT*: s=172.16.47.142, d=172.16.47.150->171.68.200.48 [163]
*Mar 28 03:34:28: IP: tableid=0, s=172.16.47.142 (Serial1), d=171.68.200.48 
(Serial0), routed via RIB
*Mar 28 03:34:28: IP: s=172.16.47.142 (Serial1), d=171.68.200.48 (Serial0), 
g=172.16.47.162, len 100, forward
*Mar 28 03:34:28: ICMP type=0, code=0
*Mar 28 03:34:28: NAT*: s=171.68.200.48->172.16.47.150, d=172.16.47.142 [164]
*Mar 28 03:34:28: NAT*: s=172.16.47.142, d=172.16.47.150->171.68.200.48 [164]
*Mar 28 03:34:28: IP: tableid=0, s=172.16.47.142 (Serial1), d=171.68.200.48 
(Serial0), routed via RIB
*Mar 28 03:34:28: IP: s=172.16.47.142 (Serial1), d=171.68.200.48 (Serial0), 
g=172.16.47.162, len 100, forward
*Mar 28 03:34:28: ICMP type=0, code=0

Router-A#undebug all
All possible debugging has been turned off

上例说明,当信息包从内向外传输时,NAT 路由器会在继续转换数据包之前,先检查其路由选择表是否有通往外部地址的路由。因此,NAT 路由器对于外部网络具有有效路由至关重要。必须通过在路由器配置中被定义为 NAT 外部的接口来了解通向目标网络的路由。

特别需要指出的是,在返回数据包路由之前,它们已经过转换。因此,NAT 路由器的路由选择表中还必须对内部本地地址具有有效路由。

相关的思科支持社区讨论

思科支持社区是您提问、解答问题、分享建议以及与工作伙伴协作的论坛。


相关信息


Document ID: 6209