随着Internet的发展和网络应用的增多,IPv4地址枯竭已经成为制约网络发展的瓶颈。尽管IPv6可以从根本上解决IPv4地址空间不足的问题,但目前众多的网络设备和网络应用仍是基于IPv4的,因此在IPv6广泛应用之前,一些过渡技术的使用是解决这个问题的主要技术手段。
网络地址转换技术NAT(Network Address Translation)主要用于实现位于内部网络的主机访问外部网络的功能。当局域网内的主机需要访问外部网络时,通过NAT技术可以将其私网地址转换为公网地址,并且多个私网用户可以共用一个公网地址,这样既可保证网络互通,又节省了公网地址。
随着网络设备的数量不断增长,对IPv4地址的需求也不断增加,导致可用IPv4地址空间逐渐耗尽。解决IPv4地址枯竭问题的权宜之计是分配可重复使用的各类私网地址段给企业内部或家庭使用。但是,私有地址不能在公网中路由,即私网主机不能与公网通信,也不能通过公网与另外一个私网通信。
NAT是将IP数据报报头中的IP地址转换为另一个IP地址的过程,主要用于实现内部网络(私有IP地址)访问外部网络(公有IP地址)的功能。NAT一般部署在连接内网和外网的网关设备上。当收到的报文源地址为私网地址、目的地址为公网地址时,NAT可以将源私网地址转换成一个公网地址。这样公网目的地就能够收到报文,并做出响应。此外,网关上还会创建一个NAT映射表,以便判断从公网收到的报文应该发往的私网目的地址。
NAT的实现方式有多种,适用于不同的场景。
静态NAT实现了私有地址和公有地址的一对一映射。如果希望一台主机优先使用某个关联地址,或者想要外部网络使用一个指定的公网地址访问内部服务器时,可以使用静态NAT。但是在大型网络中,这种一对一的IP地址映射无法缓解公用地址短缺的问题。
在本示例中,源地址为192.168.1.1的报文需要发往公网地址100.1.1.1。在网关RTA上配置了一个私网地址192.168.1.1到公网地址200.10.10.1的映射。当网关收到主机A发送的数据包后,会先将报文中的源地址192.168.1.1转换为200.10.10.1,然后转发报文到目的设备。目的设备回复的报文目的地址是200.10.10.1。当网关收到回复报文后,也会执行静态地址转换,将200.10.10.1转换成192.168.1.1,然后转发报文到主机A。和主机A在同一个网络中其他主机,如主机B,访问公网的过程也需要网关RTA做静态NAT转换。
动态NAT通过使用地址池来实现。
本示例中,当内部主机A和主机B需要与公网中的目的主机通信时,网关RTA会从配置的公网地址池中选择一个未使用的公网地址与之做映射。每台主机都会分配到地址池中的一个唯一地址。当不需要此连接时,对应的地址映射将会被删除,公网地址也会被恢复到地址池中待用。当网关收到回复报文后,会根据之前的映射再次进行转换之后转发给对应主机。
动态NAT地址池中的地址用尽以后,只能等待被占用的公用IP被释放后,其他主机才能使用它来访问公网。
网络地址端口转换NAPT(Network Address Port Translation)允许多个内部地址映射到同一个公有地址的不同端口。
本例中,RTA收到一个私网主机发送的报文,源IP地址是192.168.1.1,源端口号是1025,目的IP地址是100.1.1.1,目的端口是80。RTA会从配置的公网地址池中选择一个空闲的公网IP地址和端口号,并建立相应的NAPT表项。这些NAPT表项指定了报文的私网IP地址和端口号与公网IP地址和端口号的映射关系。之后,RTA将报文的源IP地址和端口号转换成公网地址200.10.10.1和端口号2843,并转发报文到公网。当网关RTA收到回复报文后,会根据之前的映射表再次进行转换之后转发给主机A。主机B同理。
Easy IP适用于小规模局域网中的主机访问Internet的场景。小规模局域网通常部署在小型的网吧或者办公室中,这些地方内部主机不多,出接口可以通过拨号方式获取一个临时公网IP地址。Easy IP可以实现内部主机使用这个临时公网IP地址访问Internet。
本示例说明了Easy IP的实现过程。RTA收到一个主机A访问公网的请求报文,报文的源IP地址是192.168.1.1,源端口号是1025。RTA会建立Easy IP表项,这些表项指定了源IP地址和端口号与出接口的公网IP地址和端口号的映射关系。之后,根据匹配的Easy IP表项,将报文的源IP地址和端口号转换成出接口的IP地址和端口号,并转发报文到公网。报文的源IP地址转换成200.10.10.10/24,相应的端口号是2843。
路由器收到回复报文后,会根据报文的目的IP地址和端口号,查询Easy IP表项。路由器根据匹配的Easy IP表项,将报文的目的IP地址和端口号转换成私网主机的IP地址和端口号,并转发报文到主机。
NAT在使内网用户访问公网的同时,也屏蔽了公网用户访问私网主机的需求。当一个私网需要向公网用户提供Web和FTP服务时,私网中的服务器必须随时可供公网用户访问。
NAT服务器可以实现这个需求,但是需要配置服务器私网IP地址和端口号转换为公网IP地址和端口号并发布出去。路由器在收到一个公网主机的请求报文后,根据报文的目的IP地址和端口号查询地址转换表项。路由器根据匹配的地址转换表项,将报文的目的IP地址和端口号转换成私网IP地址和端口号,并转发报文到私网中的服务器。
本例中,主机C需要访问私网服务器,发送报文的目的IP地址是200.10.10.1,目的端口号是80。RTA收到此报文后会查找地址转换表项,并将目的IP地址转换成192.168.1.1,目的端口号保持不变。服务器收到报文后会进行响应,RTA收到私网服务器发来的响应报文后,根据报文的源IP地址192.168.1.1和端口号80查询地址转换表项。然后,路由器根据匹配的地址转换表项,将报文的源IP地址和端口号转换成公网IP地址200.10.10.1和端口号80,并转发报文到目的公网主机。
nat static global { global-address} inside {host-address } 命令用于创建静态NAT。
- global参数用于配置外部公网地址。
- inside参数用于配置内部私有地址。
命令display nat static
用于查看静态NAT的配置。
- Global IP/Port表示公网地址和服务端口号。
- Inside IP/Port表示私有地址和服务端口号。
nat outbound
命令用来将一个访问控制列表ACL和一个地址池关联起来,表示ACL中规定的地址可以使用地址池进行地址转换。ACL用于指定一个规则,用来过滤特定流量。后续将会介绍有关ACL的详细信息。
nat address-group
命令用来配置NAT地址池。
本示例中使用nat outbound命令将ACL 2000与待转换的192.168.1.0/24网段的流量关联起来,并使用地址池1(address-group 1)中的地址进行地址转换。no-pat表示只转换数据报文的地址而不转换端口信息。
display nat address-group group-index
命令用来查看NAT地址池配置信息。
命令display nat outbound
用来查看动态NAT配置信息。
可以用这两条命令验证动态NAT的详细配置。在本示例中,指定接口Serial 1/0/0与ACL关联在一起,并定义了用于地址转换的地址池1。参数no-pat说明没有进行端口地址转换。
nat outbound acl-number
命令用来配置Easy-IP地址转换。Easy IP的配置与动态NAT的配置类似,需要定义ACL和nat outbound命令,主要区别是Easy IP不需要配置地址池,所以nat outbound命令中不需要配置参数address-group。
在本示例中,命令nat outbound 2000表示对ACL 2000定义的地址段进行地址转换,并且直接使用Serial1/0/0接口的IP地址作为NAT转换后的地址。
命令display nat outbound
用于查看命令nat outbound的配置结果。
Address-group/IP/Interface表项表明接口和ACL已经关联成功,type表项表明Easy IP已经配置成功。
nat server [ protocol protocol-number icmp | tcp | udp global global-address current-interface global-port inside {host-address host-port } vpn-instance vpn-instance-name acl acl-number description description ]命令用来定义一个内部服务器的映射表,外部用户可以通过公网地址和端口来访问内部服务器。
- 参数protocol指定一个需要地址转换的协议;
- 参数global-address指定需要转换的公网地址;
- 参数inside指定内网服务器的地址。
display nat server
命令用于查看详细的NAT服务器配置结果。
可以通过此命令验证地址转换的接口、全局和内部IP地址以及关联的端口号。在本示例中,全局地址202.10.10.1和关联的端口号80(www)分别被转换成内部服务器地址192.168.1.1和端口号8080。
NAT ALG
NAT和NAPT只能对IP报文的头部地址和TCP/UDP头部的端口信息进行转换。对于一些特殊协议,例如FTP等,它们报文的数据部分可能包含IP地址信息或者端口信息,这些内容不能被NAT有效的转换。解决这些特殊协议的NAT转换问题的方法就是在NAT实现中使用应用层网关ALG(Application Level Gateway)功能。ALG是对特定的应用层协议进行转换,在对这些特定的应用层协议进行NAT转换过程中,通过NAT的状态信息来改变封装在IP报文数据部分中的特定数据,最终使应用层协议可以跨越不同范围运行。
例如,一个使用内部IP地址的FTP服务器可能在和外部网络主机建立会话的过程中需要将自己的IP地址发送给对方。而这个地址信息是放到IP报文的数据部分,NAT无法对它进行转换。当外部网络主机接收了这个私有地址并使用它,这时FTP服务器将表现为不可达。
目前支持ALG功能的协议包括:DNS、FTP、SIP、PPTP和RTSP。不同协议支持的NAT转换字段如表1所示。
静态NAT配置:
代码语言:javascript复制 nat static global 12.1.1.3 inside 192.168.1.1 netmask 255.255.255.255
nat static global 12.1.1.4 inside 192.168.1.2 netmask 255.255.255.255
代码语言:javascript复制[AR1]dis nat static
Static Nat Information:
Interface : GigabitEthernet0/0/1
Global IP/Port : 12.1.1.3/----
Inside IP/Port : 192.168.1.1/----
Protocol : ----
VPN instance-name : ----
Acl number : ----
Netmask : 255.255.255.255
Description : ----
Global IP/Port : 12.1.1.4/----
Inside IP/Port : 192.168.1.2/----
Protocol : ----
VPN instance-name : ----
Acl number : ----
Netmask : 255.255.255.255
Description : ----
Total : 2
动态NAT配置:
代码语言:javascript复制acl number 2000 \利用ACL匹配流量
rule 1 permit source 192.168.1.0 0.0.0.255
代码语言:javascript复制[AR1]dis acl all
Total quantity of nonempty ACL number is 1
Basic ACL 2000, 1 rule
Acl's step is 5
rule 1 permit source 192.168.1.0 0.0.0.255
nat address-group 1 11.1.1.1 11.1.1.2 \配置公网地址池
[AR1]dis nat address-group
NAT Address-Group Information:
--------------------------------------
Index Start-address End-address
--------------------------------------
1 11.1.1.1 11.1.1.2
--------------------------------------
interface GigabitEthernet0/0/1
ip address 12.1.1.1 255.255.255.0
nat outbound 2000 address-group 1 no-pat
代码语言:javascript复制[AR1]dis nat outbound
NAT Outbound Information:
--------------------------------------------------------------------------
Interface Acl Address-group/IP/Interface Type
--------------------------------------------------------------------------
GigabitEthernet0/0/1 2000 1 no-pat
--------------------------------------------------------------------------
Total : 1
EASY IP配置:
代码语言:javascript复制acl number 2000 \利用ACL匹配流量
rule 1 permit source 192.168.1.0 0.0.0.255
代码语言:javascript复制interface GigabitEthernet0/0/1
ip address 12.1.1.1 255.255.255.0
nat outbound 2000
NAT SERVER配置:
代码语言:javascript复制interface GigabitEthernet0/0/1
ip address 12.1.1.1 255.255.255.0
nat server protocol tcp global 12.1.1.3 www inside 192.168.1.2 www \映射内网服务器
nat outbound 2000
dns server 172.16.1.2
dns proxy enable
dns relay enable
ip host www.baidu.com 192.168.1.2
代码语言:javascript复制[AR1-GigabitEthernet0/0/1]nat server protocol tcp global ? \static和nat server中可以使用本地接口地址作为global地址使用
X.X.X.X Global IP address of NAT
current-interface Address of current interface
interface Specify the interface