目录
名词解释
静态转换 (Static Nat) 是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
动态转换 (Dynamic Nat) 是指将内部网络的私有IP地址转换为公用IP地址时,IP地址对是不确定的,而是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
内部本地地址 转换前的源主机内部地址
内部全局地址 在外网中源主机的地址。是真实的Internet地址
外部本地地址 外网中主机的内部本地地址。
外部全局地址 外部主机地址,同样是真实的Internet地址
网段分布
在如下范围内的地址可以作为内网地址分配
网段类型 | 网段范围 |
---|---|
A类地址 | 10.0.0.0–10.255.255.255 |
B类地址 | 172.16.0.0–172.31.255.255 |
C类地址 | 192.168.0.0–192.168.255.255 |
网络拓扑
样例组网如图所示,由2台MSR3020(RTA、RTB)路由器、2台S3610(SW1、SW2)交换机、3台PC(Client_A、Client_B、Server)组成。
Client_A、Client_B位于私网,网关为RTA,RTA同时为NAT设备,有1个私网接口(G0/0)和1个公网接口(G0/1),公网接口与公网路由器RTB互连。Server位于公网,网关为RTB。
本组网模拟了实际组网中涉及的几种NAT主要应用。Easy IP配置最为简单,一般用于拨号接入互联网的场合;Basic NAT不如NAPT普及;NAPT可以提高公网IP的利用效率,适用于私网作为客户端访问公网服务器的场合;NAT Server则用于私网需要对公网提供服务的场合。
配置Basic NAT
搭建环境
首先,依照图示搭建环境,完成路由器RTA与RTB的接口IP地址的配置。为了对去往Server的数据包提供路由,在私网出口路由器RTA上需要配置一条静态路由,指向公网路由器RTB,下一跳为RTB的接口G0/0。这时RTA应该能ping 通Server。配置主机Client_A的IP地址为10.0.0.1/24,网关为10.0.0.254;配置主机Client_B的IP地址为10.0.0.2/24,网关为10.0.0.254。
基本配置
完成IP地址、路由等基本配置。
[RTA]interface G0/0
[RTA-GigabitEthernet0/0]ip address 10.0.0.254 24
[RTA-GigabitEthernet0/0]interface G 0/1
[RTA-GigabitEthernet0/1]ip address 198.76.28.1 24
[RTA-GigabitEthernet0/1]ip route-static 0.0.0.0 0 198.76.28.2
[RTB]interface G0/0
[RTB-GigabitEthernet0/0]ip address 198.76.28.2 24
[RTB-GigabitEthernet0/0]interface G 0/1
[RTB-GigabitEthernet0/1]ip address 198.76.29.1 24
检查连通性
分别在Client_A和Client_B上ping Server(IP地址为198.76.29.4)。显示如下:
C:\>ping 198.76.29.4
Pinging 198.76.29.4 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 198.76.29.4:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
结果显示,从Client_A、Client_B无法ping通Server。这是因为在公网路由器上不可能有私网的路由,从Server回应的ping 响应报文到RTB的路由表上无法找到10.0.0.0网段的路由。
配置Basic NAT
Basic NAT是一种1:1映射的NAT,其基本原理如下:私网是一个单出口网络(stub network),与公网的接口处做地址转换。NAT的公网一侧分配有一个地址段的“合法”IP,私网一侧则分配保留IP。地址映射关系可以静态配置,也可以动态绑定。私网访问公网的数据报文经过NAT时,源IP地址被改写成所映射的公网IP地址;公网到私网的数据报文经NAT时,目的IP地址被改写成映射的私网IP地址。也就是说,通过Basic NAT 内网和外网的IP地址能够被自动地转换,对用户透明。
采用静态配置的方式,必须保证公网IP数目与私网IP数目一样多,否则没有被配置的私网IP地址将不能访问公网。动态绑定方式则要灵活得多,公网IP的数量可以少于私网IP的数量,当有较多用户同时访问公网时,公网IP可能不足,会导致部分访问的请求失败。管理员可以根据私网中对公网访问的最大并发数来配置公网IP地址数。此外,其它的一些管理措施也能增加对公网IP地址的使用率,比如:限制用户对公网IP的绑定时间,以及解除长期为使用的IP绑定。
在RTA上配置Basic NAT:
#通过acl定义一条源地址属于10.0.0.0/24网段的流
[RTA]acl basic 2000
[RTA-acl-basic-2000]rule 0 permit source 10.0.0.0 0.0.0.255
#配置NAT地址池1,地址池中的用于地址转换的地址从198.76.28.11到198.76.28.20共十个
[RTA]nat address-group 1
address 198.76.28.11 198.76.28.20
#进入接口模式视图
[RTA]interface G0/1
#将地址池1与ACL 2000关联,并在接口上下发,方向为出方向
[RTA-GigabitEthernet0/1]nat outbound 2000 address-group 1 no-pat
由配置可见,在RTA上配置了公网地址池address-group 1,地址范围为198.76.28.11~198.76.28.20。参数no-pat表示使用一对一的地址转换,只转换数据包的地址而不转换端口信息。此时路由器RTA会对该接口上出方向并且匹配acl 2000的流量做地址转换。
检查连通性
从Client_A、Client_B分别ping Server,能够ping通:
C:\>ping 198.76.29.4
Pinging 198.76.29.4 with 32 bytes of data:
Reply from 198.76.29.4: bytes=32 time<1ms TTL=126
Reply from 198.76.29.4: bytes=32 time<1ms TTL=126
Reply from 198.76.29.4: bytes=32 time=1ms TTL=126
Reply from 198.76.29.4: bytes=32 time<1ms TTL=126
Ping statistics for 198.76.29.4:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 1ms, Average = 0ms
检查NAT表项
完成上一步骤后,立即在RTA上检查NAT表项:
<RTA>display nat session
There are currently 4 NAT sessions:
Protocol GlobalAddr Port InsideAddr Port DestAddr Port
- 198.76.28.11 --- 10.0.0.2 --- --- ---
VPN: 0, status: NOPAT, TTL: 00:04:00, Left: 00:04:00
- 198.76.28.12 --- 10.0.0.1 --- --- ---
VPN: 0, status: NOPAT, TTL: 00:04:00, Left: 00:03:59
1 198.76.28.12 1024 10.0.0.1 1024 198.76.29.4 1024
VPN: 0, status: NOPAT, TTL: 00:01:00, Left: 00:00:59
1 198.76.28.11 512 10.0.0.2 512 198.76.29.4 512
VPN: 0, status: NOPAT, TTL: 00:01:00, Left: 00:01:00
从显示信息中可以看出,该ICMP报文的源地址10.0.0.1已经转换成公网地址198.76.28.12,目的端口号和源端口号均为1024。源地址10.0.0.2已经转换成公网地址198.76.28.11,目的端口号和源端口号均为512。一分钟以后再次观察此表项,发现表中后两项消失了,四分钟以后再次观察,发现表项全部消失,显示如下:
<RTA>display nat session
No NAT sessions are currently active!
这是因为NAT表项具有一定的老化时间(aging-time),一旦超过老化时间,NAT会删除表项。前两条由系统为配置建立的NAT表项,老化时间为4分钟,后两项五元组表项由流触发而建立的,老化时间为1分钟。
可以通过命令display nat aging-time查看路由器的NAT默认老化时间:
<RTA>display nat aging-time 无此命令
NAT aging-time value information:
tcp ---- aging-time value is 86400 (seconds)
udp ---- aging-time value is 300 (seconds)
icmp ---- aging-time value is 60 (seconds)
pptp ---- aging-time value is 86400 (seconds)
dns ---- aging-time value is 60 (seconds)
tcp-fin ---- aging-time value is 60 (seconds)
tcp-syn ---- aging-time value is 3600 (seconds)
ftp-ctrl ---- aging-time value is 7200 (seconds)
ftp-data ---- aging-time value is 300 (seconds)
如有必要,还可以通过命令nat aging-time对NAT老化时间进行修改。
除此之外,还可以观察NAT的调试信息,显示如下:
<RTA>terminal monitor
% Current terminal monitor is on.
<RTA>terminal debugging
% Current terminal debugging is on.
<RTA>debugging nat packet
NAT packet debugging is enabled
<RTA>
*May 16 08:56:47:713 2009 RTA NAT/7/debug:
(GigabitEthernet0/1-out :)Pro : ICMP
( 10.0.0.1: 1024 - 198.76.29.4: 1024) ------>
( 198.76.28.12: 1024 - 198.76.29.4: 1024)
*May 16 08:56:47:714 2009 RTA NAT/7/debug:
(GigabitEthernet0/1-in :)Pro : ICMP
( 198.76.29.4: 1024 - 198.76.28.12: 1024) ------>
( 198.76.29.4: 1024 - 10.0.0.1: 1024)
*May 16 08:56:47:746 2009 RTA NAT/7/debug:
(GigabitEthernet0/1-out :)Pro : ICMP
( 10.0.0.2: 512 - 198.76.29.4: 512) ------>
( 198.76.28.11: 512 - 198.76.29.4: 512)
*May 16 08:56:47:746 2009 RTA NAT/7/debug:
(GigabitEthernet0/1-in :)Pro : ICMP
( 198.76.29.4: 512 - 198.76.28.11: 512) ------>
( 198.76.29.4: 512 - 10.0.0.2: 512)
*May 16 08:56:48:715 2009 RTA NAT/7/debug:
(GigabitEthernet0/1-out :)Pro : ICMP
( 10.0.0.1: 1024 - 198.76.29.4: 1024) ------>
( 198.76.28.12: 1024 - 198.76.29.4: 1024)
*May 16 08:56:48:715 2009 RTA NAT/7/debug:
(GigabitEthernet0/1-in :)Pro : ICMP
( 198.76.29.4: 1024 - 198.76.28.12: 1024) ------>
( 198.76.29.4: 1024 - 10.0.0.1: 1024)
*May 16 08:56:48:743 2009 RTA NAT/7/debug:
(GigabitEthernet0/1-out :)Pro : ICMP
( 10.0.0.2: 512 - 198.76.29.4: 512) ------>
( 198.76.28.11: 512 - 198.76.29.4: 512)
*May 16 08:56:48:743 2009 RTA NAT/7/debug:
(GigabitEthernet0/1-in :)Pro : ICMP
( 198.76.29.4: 512 - 198.76.28.11: 512) ------>
( 198.76.29.4: 512 - 10.0.0.2: 512)
上述调试信息中的前两个转换信息表明:在GigabitEthernet0/1-out 方向,ICMP报文的源地址10.0.0.1转换成198.76.28.12且端口都为1024;同时在GigabitEthernet0/1-in方向,ICMP报文源地址198.76.29.4转换成10.0.0.1且端口都为1024。
恢复配置
在RTA上删除Basic NAT相关配置。
#删除NAT地址池
[RTA]undo nat address-group 1
#在接口下删除NAT绑定
[RTA]interface G0/1
[RTA-GigabitEthernet0/1]undo nat outbound 2000 address-group 1 no-pat
NAPT配置
NAPT是一种“一对多”的地址映射方法,公网IP只有一个,与之映射的私网IP若干,因此只得把传输层的TCP/UDP端口或者ICMP的Identifier也加入进来,以(私网地址, 本地传输层端口号)——(公网地址, 分配的传输层端口号)。
私网客户端Client_A、 Client_B需要访问公网服务器Server,但由于公网地址有限,在RTA上配置的公网地址池范围为198.76.28.11~198.76.28.11,因此配置NAPT,动态地为Client_A、Client_B分配公网地址和协议端口。
搭建环境
[RTA]interface G0/0
[RTA-GigabitEthernet0/0]ip address 10.0.0.254 24
[RTA-GigabitEthernet0/0]interface G 0/1
[RTA-GigabitEthernet0/1]ip address 198.76.28.1 24
[RTA-GigabitEthernet0/1]ip route-static 0.0.0.0 0 198.76.28.2
[RTB]interface G0/0
[RTB-GigabitEthernet0/0]ip address 198.76.28.2 24
[RTB-GigabitEthernet0/0]interface G 0/1
[RTB-GigabitEthernet0/1]ip address 198.76.29.1 24
检查连通性
从Client_A、Client_B ping Server(IP地址为198.76.29.4),显示如下:
C:\>ping 198.76.29.4
Pinging 198.76.29.4 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 198.76.29.4:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss)
结果显示,从Client_A、Client_B无法ping通Server。
配置NAPT
在RTA上完成NAPT相关配置:
#通过acl定义一条源地址属于10.0.0.0/24网段的流
[RTA]acl number basic2000
[RTA-acl-basic-2000]rule 0 permit 10.0.0.0 0.0.0.255
#配置NAT地址池1,地址池中只放入一个地址198.76.28.11
[RTA-acl-basic-2000]nat address-group 1 198.76.28.11 198.76.28.11
[RTA]nat address-group 1
address 198.76.28.11 198.76.28.11
#在接口视图下将NAT地址池与acl 2000绑定并下发
[RTA]interface G0/1
[RTA-GigabitEthernet0/1]nat outbound 2000 address-group 1
此时未携带no-pat关键字( 配置Basic NAT 的命令为[RTA-GigabitEthernet0/1]nat outbound 2000 address-group 1 no-pat
),意味着NAT要对数据包进行端口的转换。
检查连通性
从Client_A、Client_B上分别ping Server,能够ping通:
C:\>ping 198.76.29.4
Pinging 198.76.29.4 with 32 bytes of data:
Reply from 198.76.29.4: bytes=32 time=12ms TTL=126
Reply from 198.76.29.4: bytes=32 time=1ms TTL=126
Reply from 198.76.29.4: bytes=32 time=1ms TTL=126
Reply from 198.76.29.4: bytes=32 time=1ms TTL=126
Ping statistics for 198.76.29.4:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 1ms, Maximum = 12ms, Average = 3ms
检查NAT表项
完成上一步骤后,立即在RTA上检查NAT表项:
<RTA>display nat session
There are currently 2 NAT sessions:
Protocol GlobalAddr Port InsideAddr Port DestAddr Port
1 198.76.28.11 12289 10.0.0.1 1024 198.76.29.4 1024
VPN: 0, status: 11, TTL: 00:01:00, Left: 00:00:59
1 198.76.28.11 12288 10.0.0.2 512 198.76.29.4 512
VPN: 0, status: 11, TTL: 00:01:00, Left: 00:00:51
从表项中可以看到源地址10.0.0.1和10.0.0.2都转换成同一个公网地址198.76.28.11,所不同的是转换后的端口,10.0.0.1转换后的端口为12289,10.0.0.2转换后的端口为12288。当RTA出接口收到目的地址为198.76.28.11的回程流量时,正是用当初转换时赋予的不同的端口来分辩该流量是转发给10.0.0.1还是10.0.0.2。NAPT正是靠这种方式,对数据包的IP层和传输层信息同时进行转换,显著地提高公有IP地址的利用效率。
恢复配置
在RTA上删除 NAPT相关配置:
[RTA]undo nat address-group 1
[RTA]interface G0/1
[RTA-GigabitEthernet0/1]undo nat outbound 2000 address-group 1
Easy IP配置
Easy IP是指进行地址转换时直接使用NAT路由器的出口(外部网络接口)的公有IP地址作为转换后的源地址,能够最大程度的节省IP地址资源。它同样也可以利用ACL控制哪些内部地址可以进行地址转换,但无需配置NAT地址池。
私网客户端Client_A、Client_B需要访问公网服务器Server,使用公网接口IP地址动态为Client_A、Client_B分配公网地址和协议端口。
搭建环境
[RTA]interface G0/0
[RTA-GigabitEthernet0/0]ip address 10.0.0.254 24
[RTA-GigabitEthernet0/0]interface G 0/1
[RTA-GigabitEthernet0/1]ip address 198.76.28.1 24
[RTA-GigabitEthernet0/1]ip route-static 0.0.0.0 0 198.76.28.2
[RTB]interface G0/0
[RTB-GigabitEthernet0/0]ip address 198.76.28.2 24
[RTB-GigabitEthernet0/0]interface G 0/1
[RTB-GigabitEthernet0/1]ip address 198.76.29.1 24
检查连通性
从Client_A、Client_B ping Server(IP地址为198.76.29.4),显示如下:
C:\>ping 198.76.29.4
Pinging 198.76.29.4 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 198.76.29.4:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss)
结果显示,从Client_A、Client_B无法ping通Server。
配置Easy IP
在RTA上完成Easy IP相关配置:
#通过acl定义一条源地址属于10.0.0.0/24网段的流
[RTA]acl number basic 2000
[RTA-acl-basic-2000]rule 0 permit 10.0.0.0 0.0.0.255
#在接口视图下将acl 2000与接口关联下发NAT
[RTA]interface G0/1
[RTA-GigabitEthernet0/1]nat outbound 2000
检查连通性
从Client_A、Client_B分别ping Server,能够ping通。
检查NAT表项
完成上一步骤后,立即在RTA上检查NAT表项。
<RTA>display nat session
There are currently 2 NAT sessions:
Protocol GlobalAddr Port InsideAddr Port DestAddr Port
1 198.76.28.1 12290 10.0.0.1 1024 198.76.29.4 1024
VPN: 0, status: 11, TTL: 00:01:00, Left: 00:00:29
1 198.76.28.1 12289 10.0.0.2 512 198.76.29.4 512
VPN: 0, status: 11, TTL: 00:01:00, Left: 00:00:26
从显示信息中可以看到,源地址10.0.0.1和10.0.0.2都转换为RTA的出接口地址198.76.28.1。
请思考一个问题:完成NAT配置后,从Client_A能够ping通Server,但是如果从Server端ping Client_A呢?ping命令结果显示如下:
C:\Documents and Settings\user>ping 10.0.0.1
Pinging 10.0.0.1 with 32 bytes of data:
Reply from 198.76.29.1: Destination host unreachable.
Reply from 198.76.29.1: Destination host unreachable.
Reply from 198.76.29.1: Destination host unreachable.
Reply from 198.76.29.1: Destination host unreachable.
Ping statistics for 10.0.0.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
结果显示Server不能ping通Client_A。为什么呢?
仔细思考,不难发现在RTA上始终没有10.0.0.0/24网段的路由,所以Server直接ping Client_A是不可达的。而Client_A能ping通Server是因为,由Server回应的ICMP回程报文源地址是Server的地址198.76.29.4,但是目的地址是RTA的出接口地址198.76.28.1,而不是Client_A的实际源地址10.0.0.1。也就是说这个ICMP连接必须是由Client端来发起连接,触发RTA做地址转换后转发。还记得我们在RTA出接口Eth 0/1下发NAT配置时的那个outbound吗?NAT操作是在出方向使能有效。所以,如果从Server端始发ICMP报文ping Client端,是无法触发RTA做地址转换的。
那么,要想让Server端能够ping通Client_A,应该怎么做呢?在NAT Server的配置中,可以找到答案。
NAT Server配置
Client_A需要对外提供ICMP服务,在RTA上为Client_A静态映射公网地址和协议端口,公网地址为198.76.28.11。
检查连通性
从Server ping Client_A的私网地址10.0.0.1,无法ping通。
配置NAT Server
在RTA上完成NAT Server相关配置。
[RTB]interface G0/1
#在出接口上将私网服务器地址和公网地址做一对一NAT映射
[RTB-GigabitEthernet0/1]nat server protocol icmp global 198.76.28.11 inside 10.0.0.1
检查连通性
从Server主动ping Client_A的公网地址198.76.28.11,能够ping通。
C:\Documents and Settings\user>ping 198.76.28.11
Pinging 198.76.28.11 with 32 bytes of data:
Reply from 198.76.28.11: bytes=32 time=1ms TTL=126
Reply from 198.76.28.11: bytes=32 time=1ms TTL=126
Reply from 198.76.28.11: bytes=32 time=1ms TTL=126
Reply from 198.76.28.11: bytes=32 time=1ms TTL=126
Ping statistics for 198.76.28.11:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 1ms, Maximum = 1ms, Average = 1ms
检查NAT表项
在RTA上检查NAT Server表项。
[RTA]display nat server
Server in private network information:
There are currently 1 internal servers
Interface:GigabitEthernet0/1, Protocol:1(icmp),
[global] 198.76.28.11: ---- [local] 10.0.0.1: ----
表项信息中显示出公网地址和私网地址的一对一的映射关系。
恢复配置
在RTA上删除 NAT Server相关配置。
[RTA]interface G0/1
[RTA-GigabitEthernet0/1]undo nat server protocol icmp global 198.76.28.11 inside 10.0.0.1
NAT Server特性就是为了满足公网客户端访问私网内部服务器的需求,将私网地址/端口静态映射成公网地址/端口,以供公网客户端访问。比如在实际应用中,客户的私有网络中的一台WEB或FTP服务器需要对公网客户提供服务,这时需要使用NAT Server特性对外映射一个公网地址给自己的私网服务器。请思考,这时如果Client_A主动ping Server能否ping通?Client_B能否ping通Server?为什么?
按照上面RTA中的NAT Server的配置命令,如果Client_A是一台FTP服务器,能否对外提供FTP服务?当然可以,只要修改NAT Server的相关配置。NAT Server相关配置如下所示:
[RTB]interface G0/1
[RTB-GigabitEthernet0/1]nat server protocol tcp global 198.76.28.11 ftp inside 10.0.0.1 ftp
四种NAT模式的比较
NAT模式 | 配置方式 | 特点 |
---|---|---|
Basic NAT | [RTB-GigabitEthernet0/1] nat outbound 2000 address-group 1 no-pat | 一对一映射,内网IP自动分配一个外网IP |
NAPT | [RTA-GigabitEthernet0/1] nat outbound 2000 address-group 1 | 多对一映射,多个内网I分配一个外网IP,通过端号对应内网IP |
Easy NAT | [RTA-GigabitEthernet0/1] nat outbound 2000 | 多对一映射,直接使用NAT路由器的出口作为外网IP,但Server端无法ping通Client端 |
NAT Server | [RTB-GigabitEthernet0/1] nat server protocol icmp global 198.76.28.11 inside 10.0.0.1 | 将内网地址映射成外网地址外网客户端使用,解决了Easy NAT Server端无法ping通Client端的问题 |
引用文献
华为Easy IP和NAT Server实现原理
192.168.和10.0.开头的IP、内网IP段、IP简介、分类——(IP观止)
网络基本功(十九):细说NAT原理与配置
华为Easy-IP配置指南
静态NAT、动态NAT、PAT(端口多路复用)的配置