随着网络的发展,公用IP地址的需求与日俱增。为了缓解公用IP地址的不足,并且保护公司内部服务器的私网地址,可以使用NAT(Network Address Translation,网络地址转换)技术将私网地址转化成为公网地址,缓解IP地址的不足,并且隐藏内部服务器的私网地址。
NAT的概述与现实方式
1. NAT概念
网络地址转换(NAT)通过将内部网络的私有IP地址翻译成全球唯一的公网IP地址,使内部网络可以连接到互联网等外部网络上,广泛应用于各种类型的互联网接入方式和各种类型的网络中。原因很简单,NAT不仅解决了IP地址不足的问题,而且还能够隐藏内部网络的细节,避免来自网络外部的攻击,起到一定的安全作用。
借助于NAT,私有保留地址的内部网络通过路由器发送数据包时,私有地址被转换成合法的IP地址,这样一个局域网只需要少量地址(甚至是一个),即可实现使私有地址网络中的所有计算机与互联网的通信需求。
2. NAT的实现方式
NAT的实现方式有以下三种:
* 静态转换(Static Translation)
* 动态转换(Dynamic Translation)
* 端口多路复用(Port Address Translation,PAT)
静态转换IP地址的对应关系是一对一且不变的,并没有节约公用IP地址,只是隐藏了主机的真实地址。动态转换虽然在一定情况下节约了公用IP地址,但是当内部网络同时访问Internet的主机数大于合法地址池中的IP地址数时就不适用了。端口多路复用可以使所有的内部网络主机共享一个合法的外部IP地址,从而最大限度的节约IP地址资源。
由于动态转换形成的IP地址的对应关系是不确定的、随机的;端口多路复用使用的是端口号的转换,也是不确定的,所以内网服务器不能使用这两种转换方式,这是由于外网用户无法确定服务器合法的公网IP地址,导致无法访问服务器。这时使用静态转换将私有IP地址转换为固定的合法的IP地址,这样服务器有了固定的合法的公网IP地址,才能实现外网的访问。
NAT的术语与转换表
内部局部IP地址(Inside Local IP Address):在内部网络中分配给主机的私有IP地址。该地址是从RFC1918(私有互联网空间地址分配)所定义的私有地址空间中分配的,或者随机挑选的。
内部全局IP地址(Inside Global IP Address):一个合法的IP地址(由NIC或网络服务提供商分配)。它对外代表一个或多个内部局部IP地址。该地址通常是从全球统一可寻址的地址空间中分配的,一般由互联网服务提供商(ISP)提供。
外部局部IP地址(Outside Global IP Address):由其所有者给外部网络上的主机分配的IP地址。该地址通常也是从全球统一可寻址的地址空间中分配的。
外部局部IP地址(Outside Local IP Address):外部主机表现在内部网络的IP地址。这一地址是从内部可寻址的地址空间中分配的,很可能是从诸如RFC1918中所定义的保留地址空间分配的。
简单转换条目(Simple Translation Entry):将一个IP地址映射到另一IP地址的转换条目。
扩展转换条目(Extended Translation Entry):映射IP地址和端口到另一对IP地址和端口的条目。
NAT的特性
NAT的典型优势如下:
1.NAT允许企业内部网使用私有地址,并通过设置合法的地址集,使内部网可以与互联网进行通信,从而达到节省合法注册地址的目的。
2.NAT可以减少规划地址时发生的地址重叠情况。
3.NAT增强了内部网络与公用网络连接时的灵活性。
4.NAT支持地址重叠。
当然,NAT也不是没有缺点。用于地址转换的处理过程会带来功能和性能上的一些损失,特别是在IP报文承载的数据中包含发送IP地址信息的情况下。
NAT的典型缺点如下:
1.NAT会使延迟增大。
2.NAT增加了配置和排错的复杂性。
3.NAT也可能会使某些需要使用内嵌IP地址的应用不能正常工作,因为它隐藏了端到端的IP地址。
NAT的配置
1.静态NAT配置
一个私有地址对应一个公有地址,向外网发布服务器。
(1) 在内部局部地址和内部全局地址之间建立静态地址转换。
1
|
Router(config)
#ip nat inside source static local-ip global-ip [extendable]
|
其中,参数“extendable”(可选)表示允许同一个内部局部地址映射到多个内部全局地址。“inside”表示从inside口进入的流量将源地址(source)进行静态转换。
例如:将内部局部地址192.168.100.2转换为内部全局地址61.159.62.130
Router(config)# ip nat inside source static 192.168.100.2 61.159.62.130
(2) 在内部和外部端口上启用NAT。
设置NAT功能的路由器需要有一个内部端口(inside)和一个外部端口(outside)。内部端口连接的网络用户使用的是内部IP地址,外部端口连接的是外部的网络,如互联网。要NAT发挥作用,必须在这两个端口上启用NAT。
1
2
3
4
|
Router(config)
# int f0/0
Router(config-
if
)
# ip nat inside
Router(config)
# int f1/0
Router(config-
if
)
# ip nat outside
|
NAT端口映射
需要使用NAT的端口映射功能,在内部局部地址和内部全局地址之间建立NAT端口映射的语法如下:
1
|
Router(config)
# ip nat inside source static protocol local-ip UDP/TCP-port global-ip UDP/TCP-port [extendable]
|
此命令是将TCP或UDP协议中内部局部地址需要转换的端口号转换成为内部全局地址的端口号。
例如:希望外网通过80端口访问公司内部的Web服务器192.168.100.2
Router(config)# ip nat inside source static tcp 192.168.100.2 80 61.159.62.131 80 extendable
NAT端口映射还可以将不同服务器的不同服务(端口)映射到同一公网地址的不同端口,给人的感觉是通过一个地址访问了所有的服务。
2.动态NAT配置
多个私有地址对应多个公有地址,负责上网。
(1) 定义内部网络中允许访问外部网络的访问控制列表
(2) 定义合法IP地址池
1
|
Router(config)
# ip nat pool pool-name start-ip end-ip { netmask netmask | prefix-length prefix-length} [type rotary]
|
下面是对该命令相关参数的说明:
pool-name:放置转换后地址的地址池名称。
start-ip/end-ip:地址池内起始和终止ip地址。
netmask netmask:子网掩码,以点分十进制数表示。
prefix-length prefix-length:子网掩码,以掩码中1的数量表示(如:prefix-length 24 等同于netmask 255.255.255.0)。两种掩码的表示方式等价,任意使用一个即可。
type rotary(可选):地址池中的地址为循环使用。
如果有多个地址池,可以重复使用此命令添加地址池。
注意:配置访问控制列表时,可以将其配置为标准访问控制列表,也可以将其配置为扩展访问控制列表。
(3) 实现网络地址转换
在全局配置模式中,将由access-list指定的内部局部地址与指定的内部全局地址池进行地址转换。命令语法如下:
1
|
Router(config)
# ip nat inside source list access-list-name pool pool-name [overload]
|
其中,“overload”(可选)表示使用地址复用,用于PAT。
例如:将访问控制列表1中的局部地址转换为test0地址池中定义为全局IP地址。
Router(config)# ip nat inside source list 1 pool test0
如果有多个地址池,可以一一添加,以增加合法地址池的数量范围。命令如下:
Router(config)# ip nat inside source list 1 pool test1
Router(config)# ip nat inside source list 1 pool test2
4) 在内部和外部接口上启用NAT。
PAT
1. 使用外部全局地址
如图所示,按以下配置说明使用外部全局地址的方法配置PAT
(1) 配置内部访问控制列表
1
|
Router(config)
# access-list 1 permit 10.1.1.0 0.0.0.255
|
(2) 定义合法的IP地址池
1
|
Router(config)
# ip nat pool ysf 61.159.62.131 61.159.62.131 netmask 255.255.255.0
|
(3) 设置复用动态IP地址转换
在全局配置模式中,设置在内部局部地址与内部全局地址之间建立动态地址转换。
Router(config)# ip nat inside source list access-list-name pool pool-name [overload]
例如:下面的命令表示,以端口复用方式,将访问控制列表1中的局部地址转换为onlyone地址中定义的全局IP地址。
1
|
Router(config)
# ip nat inside source list 1 pool ysf overload
|
(4) 在内部和外部端口上启用NAT。
1
2
3
4
|
Router(config)
# int f0/0
Router(config-
if
)
# ip nat outside
Router(config)
# int f1/0
Router(config-
if
)
# ip nat inside
|
(5) 配置默认路由,使数据包可以正常选路
1
|
Router(config)
# ip route 0.0.0.0 0.0.0.0 61.159.62.129
|
注意:以上NAT配置使用的是一段合法IP地址。有时ISP分配的是两端IP地址,一段子网掩码为30的接口地址和一段公网地址,其中接口地址可以是公网地址也可以是私网地址。如果ISP分配两端IP地址,则配置广域网接口时使用接口地址,配置NAT时使用公网地址,其配置与上述示例相同。
2. 复用路由器外部接口地址
有时,只有一个外部IP地址,并且已被路由器外部接口使用,也可以直接使用接口的IP地址作为转接后的源地址
(1)定义内部访问控制列表
1
|
Router(config)
# access-list 1 permit 10.1.1.0 0.0.0.255
|
(2)定义合法的IP地址池
由于直接使用接口IP地址,所以不需定义IP地址池
(2)设置复用动态IP地址转换
在全局配置模式下,设置在内部的本地地址与内部合法地址之间建立动态转换。命令如下:
Router(config)# ip nat inside source list 1 int f0/0 overload
上述命令表示,以端口复用方式,将访问控制列表1中的私有地址转换为路由器外部接口的合法IP地址。
(3)在内部和外部端口上启用NAT
1
2
3
4
|
Router(config)
# int f0/0
Router(config-
if
)
# ip nat outside
Router(config)
# int f1/0
Router(config-
if
)
# ip nat inside
|
验证NAT配置
可以使用show ip nat translation命令显示当前存在的转换。
可以使用下面的命令对NAT进行监控
1
|
Router(config)
# show ip nat translations [verbose]
|
该命令用来检查当前存在的转换,关键字verbose与该命令一起使用能够显示更多的信息,包括一个动态条目的保存时间。显示的详细信息中,create、use、timeout、left分别显示NAT转换条目的创建时间、使用时间、超时时间值、剩余时间,而静态NAT形成的转换条目的timeout为0,表示永远存在。
默认情况下,如果在一定时间内没有使用动态地址转换条目,就会因超时而被取消。在没有配置地址复用的情况下,简单转换条目的超时时间为24小时。
如果配置了地址复用,又因为每个条目都包含了使用它的数据流的更多内容,那么就可以对转换条目的超时值实施较细致的控制,下面是采用地址复用时默认的NAT超时值。
* UDP超时值:5分钟
* DNS超时值:1分钟
* TCP超时值:24小时
* 结束和复位值:1小时
注意:“结束”和“复位”指的是TCP连接的结束包和复位包。
如果必要,用户可以改变超时的默认值,使用的命令如下:
1
|
Router(config)
# ip nat translation { dns-timeout | icmp-timeout | tcp-timeout | udp-timeout | finrst-timeout | syn-timeout} {seconds | never}
|
可以对不同的协议设置NAT转换超时时间,也可以设置为永远不超时。例如,命令ip nat translation icmp-timeout 120 表示,将ICMP协议的NAT转换超时时间设置为120秒。
注意:每个NAT条目大概要占用160字节的内存,所以,65535条条目会占用多余10MB的内存和相当多的CPU资源。在实际工作中,若发现路由器的CPU和内存资源紧张,可以查看NAT配置和转换条目。
有时因为NAT转换条目过多导致设备性能下降,可以使用clear ip nat translation * 命令来清除NAT转换表中的所有条目。*是一个通配符,代表任意值。首先使用show ip nat translations查看当前活跃的转换条目,然后,输入clear ip nat translation *命令来清除所有的转换。再次输入show ip nat translations命令进行查看,NAT转换条目中只剩下静态转换条目。
使用clear ip nat translation inside local-ip global-ip,可以清除包含一个内部转换的一个简单转换条目。
使用clear ip nat translation outside local-ip global-ip,可以清除包含一个外部转换的一个简单转换条目。