NAT地址转换

NAT基本概念

图例描述了一个简单的NAT功能。设备A拥有一个属于私有地址空间的IP地址,而设备B拥有一个公有IP地址,当设备A向设备B发送数据包时,数据包需要穿越一个运行了NAT功能的路由器,由NAT路由器将数据包源地址字段中设备的私有IP地址(192.168.2.23)替换成可在Internet进行路由的公有IP地址(203.10.5.23),并转发数据包。当设备B向设备A发送数应答数据包时,数据包的目的地址将是203.10.5.23,因而该数据包仍要经过NAT路由器,由SSNAT路由器将目的地址替换成设备A的私有地址。

NAT操作中所涉及的端系统来说,NAT操作是完全透明的。设备A仅知道其IP地址是192.168.2.23,而不知道203.10.5.23。另一方面,设备B认为设备A的地址就是203.10.5.23,根本不知道地址192.168.2.23,该私有四肢对设备B来说是隐而不见的。

NAT可以进行双向地址隐藏。如图所示,在设备A和设备B上同时执行了NAT,设备A认为设备B的地址是172.16.80.91,而实际上设备B的真实地址是92.31.7.130。为支持此方案,NAT路由器需要在双向转换源地址和目的地址。

Cisco NAT设备将NAT世界划分为内部(inside)和外部(outside)两个部分,内部网络通常是私有企业或ISP,外部网络是公共Internet或面向Internet的服务提供商。可以将地址归入以下四类:

IL(Inside Local,内部本地地址)分配给内部设备的地址,这些地址不会被宣告到外部网络。

IG(Inside Global,内部全局地址)内部设备被外部网络所知晓的地址。

OG(Outside Global,外部全局地址)分配外部设备的地址,这些地址不会被宣告到内部网络。

OL(Outside Local,外部本地地址)外部设备内部地址网络所知晓的地址。

 当表项第一次进入NAT表时,同时启动了一个定时器,该定时器的周期被称为转换超时时间(translation timeout)。每当该表项被用转换数据包的源地址或是目的地址后,该计时器就被重置。如果定时器到期则将从NAT表中删除该表项,而动态分配的地址也将回收到地址池中。Cisco的默认转换超时时间为86400(24小时),可以利用命令ip nat translation timeout来更改默认时间。如果在命令ip nat translation timeout中使用0秒或关键字never,该映射表项将永远不会从NAT表中被删除。

当来自内部全局地址池的地址被映射到内部本地地址时,在第一次映射清除之前,这些IG地址将不能被映射到其他地址。不过,NAT有一个特定功能,可以将多个地址同时映射到单个地址,Cisco将这种功能称为PAT(port address translation,端口地址转换),某些场合也将这种功能称为NAPT(network address and port translation,网络地址和端口转换)IP伪装(IP masquerading),有时也被称为地址超载(address overloading)

TCP/IP会话并不是两个IP地址之间的包交换,而是两个IP套接字之间的包交换。所谓套接字就是(地址,端口)二元组,如Telnet会话可以由(192.168.5.2 23)(172.16.100.6 1026)之间的包交换组成。PAT会同时转换IP地址和端口号,来自不同地址的数据包可以被转换为同一个地址,但是相应的端口号不同,这样就可以共享一个地址了。图例解释了PAT的工作原理。

通过转换端口号,大约可以将32000个不同的内部本地套接字转换到同一个全局地址。

NATTCP负载分发

利用NAT可以将多台相同的服务器表示为单个地址。例如,外部网络设备到达的服务器的地址都是相同的,但实际上内部网络中存在4台镜像服务器,NAT路由器采用轮询(round-robin)方式在这4台服务器之间分发会话,即来自不同源地址的数据包的目的地址将被转换为服务器1~4。很明显,这4台服务器必须提供相同的可访问内容,这是因为,访问服务器集群的主机可能这次选中的是服务器2,而下一次可能是服务器4,只有这样才能保证然主机在任何时刻到觉得访问的是同一台服务器。

NAT与虚拟服务器

NAT技术不仅可以让外部通过通过同一个地址访问所有服务,还可以将多种服务分发到不同的地址。

如图所示,企业拥有邮件服务器(本地地址为192.168.50.1)和一台HTTP服务器(本地地址为192.168.50.2),这两台服务器的全局地址均为206.35.91.10。当外部主机向内部网络发送数据包时,NAT路由器除了要检查目的地址之外,还要检查目的端口号。当主机向206.35.91.10发送一个目的端口号为25(表示邮件)的数据包,由NAT路由器将该数据包的目的地址转换为邮件服务器的地址192.168.50.1;同一台主机发出的目的端口号为80(表示HTTP)的数据包,则被NAT路由器将该数据包的目的地址转换为web服务器的地址192.168.50.2

NAT存在的问题:

需要全面处理IPTCP头部;

某些特定协议和应用程序的特性。

更改IP地或TCP端口号的内容可以更改其他字段的含义,尤其是校验和。许多协议和应用程序都是根据数据字段中的IP地址来携带IP地址或信息,因而修改头部中的IP地址可能会更改被封装数据的含义,从而可能会破坏该应用。

CiscoNAT机制可以更该许多应用程序在数据字段中携带的IP地址信息。但是,如果数据字段被加密了,NAT将无法读取这些数据。因而,为了保证NAT操作正常进行,即不能加密IP地址也不能加密某衍自特定内容的相关信息。

对于特定IPSsc来说,如果更改了IPSec包中的IP地址,IPSec将变得毫无意义,从而破坏了×××应用。无论采用了何种形式的加密操作,都需要将NAT放置在安全侧,而不能将其放在被加密路径上。

在应用DNSNAT时应用应记住以下两点。

DNS APTR查询可以穿越Cisco NAT设备,因而NAT一侧中的主机可以向NAT另一侧的DNS服务器提出查询请求;

DNS区域传输进程无法穿越Cisco NAT设备,因而同一区域的主用和备用DNS服务器不能放置在NAT两侧。 

由于SNMP协议拥有大量的消息、格式及变量,NAT设备无法检查SNMP消息内容中的IP地址,因而,NAT不支持对SNMP消息中的IP地址进行转换操作。

IP路由协议与SNMP一样存在类似的问题。IP路由协议的种类非常多,每种协议都有自己的包格式和操作特性,因而NAT路由器无法转换IP路由协议包中的IP地址。NAT路由器在内部接口上运行路由协议的同时,还可以在外部接口上运行路由协议,当无论是通过单一路由协议,还是利用重分发机制,路由协议包都无法穿越宣告地址变化的NAT边界。由于NAT路由器位于路由域的边界,可以使用默认地址或少量汇总地址,因而这种限制也不会带来太多的问题。

NAT配置

静态NAT

示例:

Router(config)#ip nat inside source static 10.1.2.2 204.15.87.2

Router(config)#interface Ethernet 0/0

Router(config-if)#ip nat inside

Router(config)#interface Serial 0/0

Router(config-if)#ip nat outside

路由器的E0/0接口被命令ip nat inside指定为内部接口,串行接口S0/0被命令ip nat outside指定为外部接口。内部本地地址被命令ip nat inside source static映射到内部全局地址。

外部地址也可以被静态转换为外部本地地址。

示例:

Router(config)#ip nat outside source static 204.114.37.5 10.1.2.2

动态NAT

示例:

Router(config)#ip nat pool pool1 204.15.86.1 204.15.86.254 netmask 255.255.255.0

Router(config)#access-list 1 permit 10.1.1.0 0.0.0.255

Router(config)#ip nat inside source list 1 pool pool1

命令ip nat pool将创建一个地址池并为该地址命名,之后该地址被指定为IG地址池,并被命令ip nat inside source list连接到IL地址段。上述地址段中不包含网络地址和广播地址,命令中netmask负责进行合规性检查,以确保不会映射到204.15.86.255这样的地址。Netmask的一个可替换关键字是prefix-length,例如,ip nat pool pool1 204.15.86.1 204.15.86.254 prefix-length 24与带有关键字netmask 255.255.255.0的命令的效果完全相同。

如果希望IG地址的主机不封与被映射IL地址的主机部分相匹配,这是就需要在定义地址池的语句最后增加关键字type match-host

示例:

Router(config)#ip nat pool pool1 204.15.86.1 204.15.86.254 netmask 255.255.255.0 type match-host

命令show ip nat translations verbose显示了映射表项进入NAT中的时间、该表项最后一次被用来转换地址的时间以及超时周期前的剩余时间。可以使用Flags(标志)字段来标识动态转换之外的转换类型。

示例:

Router(config)#ip nat inside source static 10.5.1.2 207.36.76.100 extendable

Router(config)#ip nat inside source static 10.5.1.2 205.113.50.1 extendable 

命令Extendable能将一个地址静态映射为多个地址。也能将多个地址静态映射到多个地址。

示例:

Router(config)#ip nat pool pool1 netmask 255.255.255.0

Router(config-ipnat-pool)#address 207.36.76.1 207.36.76.99

Router(config-ipnat-pool)#address 207.36.76.150 207.36.76.250

为不连续的地址段配置NAT地址池。

端口地址转换

示例:

Router(config)#ip nat inside source list 1 interface Serial0/0 overload

利用关键字overload就可以启动PAT机制,虽然命令ip nat instde source可以引用一个地址池,但是本例中仅引用了配置了IG地址的接口。与以前一样,访问列表用于标识IL地址。

TCP负载均衡

示例:

Router(config)#ip nat pool pool1 192.168.1.2 192.168.1.4 netmask 255.255.255.0 type rotary

Router(config)#ip nat inside destination list 1 pool1

Router(config)#access-list 1 permit 199.198.5.1

需要注意的是,前面大多数示例是转换IL地址,而本示例中是转换IG地址。地址池中pool1包含了一个可用IL地址列表,关键字type rotary的作用是以轮询方式分配地址池中的地址。与往常一样,访问列表的作用需要转换的地址,对本例就是单个目的地址199.198.5.1

虚拟服务器

示例:

Router(config)#ip nat inside source static tcp 192.168.1.4 25 199.198.5.1 25 extendable

Router(config)#ip nat inside source static udp 192.168.1.3 514 199.198.5.1 514 extendable

Router(config)#ip nat inside source static tcp 192.168.1.4 80 199.198.5.1 80 extendable

由于多个语句中都出现了相同的IP地址(本次是IG地址),因而必须使用关键字extendable。由于Cisco IOS能自动加入本关键字,因而无需手工输入。

除了命令ip nat translation timeout之外,还可以更改其他默认超时周期。下表列出了命令ip nat translation可用的全部关键字及相应的默认超时周期值,可以将默认更改为0~2 147 483 647秒之间的任何值。

Ip nat translation

默认超时周期()

描述

Timeout

86400

所有与端口无关的动态转换超时值

Dns-timeout

60

DNS连接超时值

Finrst-timeout

60

看见TCP FINRST标记(关闭ICP会话)之后的超时值

Icmp

60

ICMP转换超时值

Port-timeout tcp

60

TCP端口转换超时值

Port-timeout udp

60

UDP端口转换超时值

Syn-timeout

60

看见TCP SYN标记且没有后继会话包的超时值

Tcp-timeout

86400

TCP转换超时值(与端口无关)

Udp-timeout

300

UDP转换超时值(与端口无关)

命令总结

命令

描述

Clear ip nat translations *

清除NAT表中的映射项

Ip nat {inside|outside}

指定内部和外部接口。源自这些接口或发往这些接口的流量都要经过NAT的检查

Ip nat inside destination list {access-list-number|name} pool name 

启用内部目的地址转换

Ip nat inside source {list {access-list-number|name} pool name [overload] | static local-ip|golbal-ip}

启用内部源地址的转换

Ip nat outisde source {list {access-list-number|name}pool name|static global-ip|local-ip}

启用外部源地址的转换

Ip nai pool name start-ip end-ip {netmask netmask|prefix-lendgth prefix-length}type {rotary|match-host}

定义一个用于地址转换的地址池

Ip nat translation max-entries entries

设置NAT表中最大能允许的映射表项数

Ip nat translation {timeout|udp-timeout|dns-timeout|tcp-timeout|finrst-timeout|icmp-timeout}syn-timeout|port-time{tcp|udp}} seconds

更改默认超时周期

Show ip nat statistics

显示NAT配置的统计汇总信息

Show ip nat translations [verbose]

显示NAT