33-NAT技术详解

1. NAT技术原理

NAT(Network Address Translation,网络地址转换),是一种把内部私有地址转换成外部公有地址的技术,简单来理解,NAT技术在局域网是使用内部私有地址通信的,但是当局域网的主机想要和外部互联网进行通信时,会在网关设备处将主机的局域网私有地址翻转成互联网的公有地址,可以使主机接入互联网从而进行网络通信。

 

特别是就国内目前的环境来说,普遍都是使用NAT技术来访问互联网的,NAT技术在一定程度上可以解决公有地址不足所带来的的问题。

 

NAT技术通常是应用在路由器,防火墙等设备,NAT主要有三种类型:

  1. 静态NAT
  2. 端口NAT
  3. 动态NAT

2. 动态NAT原理

动态NAT(Dynamic NAT,简称DAT)在把内部网络的私有IP地址转换成公有IP地址时,采用动态的方法随机分配一个公有IP地址。也就是说,当内部网络的主机需要接入互联网时,动态NAT就会随机分配一个公有的IP地址,另外,动态NAT还需要指定哪些内部地址是可以转换的,哪些地址可以作为合法的公有地址使用的。

 

NAT技术通常应用在局域网内的主机要接入互联网的场景,下面通过实验来深入学习动态NAT的原理。

 

3. 动态NAT部署

动态NAT实验部署如下图所示:

首先配置R1,R2,R3设备的ip地址信息,这里略过......

 

然后配置R1,R2等设备的静态路由:

R1(config)#ip route 0.0.0.0 0.0.0.0 12.1.1.2
R1(config)#
R2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R2(config)#ip route 192.168.1.0 255.255.255.0 12.1.1.1
R2(config)#ip route 192.168.2.0 255.255.255.0 12.1.1.1
R2(config)#ip route 0.0.0.0 0.0.0.0 23.1.1.3
R2(config)#

 

 

测试网络连通性:

R2#ping 3.3.3.3

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 52/61/64 ms
R2#

可以看到,边缘设备是可以访问外网的。

 

R1#ping 8.8.8.8 source 192.168.1.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
Packet sent with a source address of 192.168.1.1 
.....
Success rate is 0 percent (0/5)
R1#

R1作为一个内网设备,是无法访问外网的。因为互联网中的设备是没有内网设备的路由信息,这意味着如果内网想要访问外网的话就需要通过NAT技术实现内网和外网的网络通信。

注:这里可能会有同学疑惑R3设备没有配置静态路由?因为R3作为一个外网设备,通常无法直接和内网设备进行通信,所以无需配置静态路由。

 

现在R2设备上部署NAT技术实现内网和互联网的通信,配置如下:

R2#
R2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
//配置公网访问流量
R2(config)#access-list 1 permit 192.168.1.0 0.0.0.255
R2(config)#access-list 1 permit 192.168.2.0 0.0.0.255
//定义公有地址池,设置地址池的名字为DNAT
R2(config)#ip nat pool DNAT 23.1.1.10 23.1.1.20 netmask 255.255.255.0
R2(config)#
*Mar  1 00:05:21.203: %LINEPROTO-5-UPDOWN: Line protocol on Interface NVI0, changed state to up
R2(config)#

通过ACL配置允许内网192.168.1.0和192.168.2.0网段可以访问公网的流量,还配置了动态NAT的公有地址池,这里分配了10个公有地址。

 

 

//定义内外接口
R2(config)#int f0/0
//内网
R2(config-if)#ip nat inside

*Mar  1 00:09:10.147: %SYS-3-CPUHOG: Task is running for (2028)msecs, more than (2000)msecs (0/0),process = Exec.
-Traceback= 0x61388000 0x61386C28 0x61387318 0x61387DF8 0x61387EA4 0x6134931C 0x613494DC 0x613495E4 0x613495E4 0x6134A538 0x613830FC 0x613933CC 0x613786EC 0x6137927C 0x6137A268 0x60F9A778 
R2(config-if)#
R2(config-if)#exit
R2(config)#int f1/0
//外网
R2(config-if)#ip nat outside
R2(config-if)#

然后在出口设备定义内网接口,相当于告诉路由器哪边的接口是内网,哪边的接口是公网。

 

 

//执行动态NAT
R2(config)#ip nat inside source list 1 pool DNAT
R2(config)#

执行动态NAT,这一步会将内网ip转换成公网ip地址,根据之前的配置将会匹配源列表,将内网的192.168.1.0和192.168.2.0网段的地址转换成公网地址。

 

然后开启nat调试功能:

R2#debug ip nat
IP NAT debugging is on
R2#

 

 

测试网络连通性:

R1#ping 3.3.3.3 source 192.168.2.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 192.168.2.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 96/99/108 ms
R1#
R1#
R1#ping 3.3.3.3 source 192.168.1.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 192.168.1.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 96/100/112 ms
R1#

从上面的结果来看,说明内网是可以访问外网的。

 

 

在R3设备上开启ICMP协议调试功能并查看ICMP调试信息:

R3#
*Mar  1 00:33:13.927: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.10
*Mar  1 00:33:14.023: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.10
*Mar  1 00:33:14.103: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.10
*Mar  1 00:33:14.195: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.10
*Mar  1 00:33:14.275: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.10
R3#
R3#
*Mar  1 00:32:32.711: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.11
*Mar  1 00:32:32.807: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.11
*Mar  1 00:32:32.891: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.11
*Mar  1 00:32:32.987: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.11
*Mar  1 00:32:33.083: ICMP: echo reply sent, src 3.3.3.3, dst 23.1.1.11
R3#

从上面的调试信息来看,R3的icmp响应包封装的目的ip地址并不是内网的196.168网段,因为R3作为一个外网设备,它是无法知晓内网的路由信息的,它只知道出口设备的路由信息,所以R3设备会将出口设备的ip地址封装为目的地址。然后R2设备收到ICMP响应包后,会查找NAT映射表并将公网地址转换成对应的内网地址。

 

查看R2设备上的nat映射表信息:

R2#
R2#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
icmp 23.1.1.11:7       192.168.1.1:7      3.3.3.3:7          3.3.3.3:7
--- 23.1.1.11          192.168.1.1        ---                ---
icmp 23.1.1.10:6       192.168.2.1:6      3.3.3.3:6          3.3.3.3:6
--- 23.1.1.10          192.168.2.1        ---                ---
R2#

从这张NAT映射表可以看到,内网地址被一一映射到公网地址了。

 

 

对于这点我们可以在R2设备上开启NAT调试验证这一点,在R2设备上查看NAT调试信息:

R2#
*Mar  1 00:26:56.803: NAT*: s=192.168.2.1->23.1.1.10, d=3.3.3.3 [5]
*Mar  1 00:26:56.867: NAT*: s=3.3.3.3, d=23.1.1.10->192.168.2.1 [5]
*Mar  1 00:26:56.931: NAT*: s=192.168.2.1->23.1.1.10, d=3.3.3.3 [6]
*Mar  1 00:26:56.995: NAT*: s=3.3.3.3, d=23.1.1.10->192.168.2.1 [6]
*Mar  1 00:26:57.059: NAT*: s=192.168.2.1->23.1.1.10, d=3.3.3.3 [7]
*Mar  1 00:26:57.123: NAT*: s=3.3.3.3, d=23.1.1.10->192.168.2.1 [7]
*Mar  1 00:26:57.187: NAT*: s=192.168.2.1->23.1.1.10, d=3.3.3.3 [8]
*Mar  1 00:26:57.251: NAT*: s=3.3.3.3, d=23.1.1.10->192.168.2.1 [8]
*Mar  1 00:26:57.323: NAT*: s=192.168.2.1->23.1.1.10, d=3.3.3.3 [9]
*Mar  1 00:26:57.387: NAT*: s=3.3.3.3, d=23.1.1.10->192.168.2.1 [9]
R2#
*Mar  1 00:31:16.607: NAT*: s=192.168.1.1->23.1.1.11, d=3.3.3.3 [15]
*Mar  1 00:31:16.675: NAT*: s=3.3.3.3, d=23.1.1.11->192.168.1.1 [15]
*Mar  1 00:31:16.739: NAT*: s=192.168.1.1->23.1.1.11, d=3.3.3.3 [16]
*Mar  1 00:31:16.803: NAT*: s=3.3.3.3, d=23.1.1.11->192.168.1.1 [16]
*Mar  1 00:31:16.867: NAT*: s=192.168.1.1->23.1.1.11, d=3.3.3.3 [17]
*Mar  1 00:31:16.931: NAT*: s=3.3.3.3, d=23.1.1.11->192.168.1.1 [17]
*Mar  1 00:31:16.995: NAT*: s=192.168.1.1->23.1.1.11, d=3.3.3.3 [18]
*Mar  1 00:31:17.059: NAT*: s=3.3.3.3, d=23.1.1.11->192.168.1.1 [18]
*Mar  1 00:31:17.123: NAT*: s=192.168.1.1->23.1.1.11, d=3.3.3.3 [19]
R2#

从R2设备的NAT调试信息来看,不同的内网地址会转换成不同的公网地址。

 

 

查看NAT转换状态:

R2#show ip nat statistics 
Total active translations: 2 (0 static, 2 dynamic; 0 extended)
Outside interfaces:
  FastEthernet1/0
Inside interfaces: 
  FastEthernet0/0
Hits: 68  Misses: 7
CEF Translated packets: 74, CEF Punted packets: 0
Expired translations: 8
Dynamic mappings:
-- Inside Source
[Id: 1] access-list 1 pool DNAT refcount 2
 pool DNAT: netmask 255.255.255.0
        start 23.1.1.10 end 23.1.1.20
        type generic, total addresses 11, allocated 2 (18%), misses 0
Queued Packets: 0
R2#

这条命令的作用是查看nat转换状态,即公网地址的分配情况。

对于动态NAT技术来说,在IPv4地址已经枯竭的情况下并不能节省地址的使用,因为每个私有地址必须要映射到一个公有地址。

 

4. 端口NAT

端口NAT跟动态NAT的原理是相同的,不同的是,端口NAT是将内网的ip地址转换成公网的一个公有ip地址的不同端口上,也就是说在这个公有ip地址加上一个由端口NAT技术选定的一个TCP端口号。通过不同的端口号来区分不同的内网ip地址。

 

5. 端口NAT部署

一般部署端口NAT的话,是在出口设备上通过接口部署端口NAT,配置如下:

R2#conf t
R2(config)#access-list 1 permit 192.168.1.0 0.0.0.255
R2(config)#access-list 1 permit 192.168.2.0 0.0.0.255
R2(config)#int f0/0
R2(config-if)#ip nat inside
R2(config-if)#exit
R2(config)#int f1/0
R2(config-if)#ip nat outside
R2(config-if)#exit
//执行端口NAT
R2(config)#ip nat inside source list 1 interface f1/0 ?        
  overload    Overload an address translation
  reversible  Allow out->in traffic
  vrf         Specify vrf
  <cr>
R2(config)#ip nat inside source list 1 interface f1/0 overload 
R2(config)#exit
R2#

ip nat inside source list 1 interface f1/0 overload 这条命令的作用就是开启端口NAT的接口进行地址复用。

 

 

 

测试端口NAT:

R1#ping 3.3.3.3 source 192.168.1.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 192.168.1.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/36/44 ms
R1#
R1#ping 3.3.3.3 source 192.168.2.1 

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 3.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 192.168.2.1 
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 16/35/40 ms
R1#

 

 

查看R2设备上的端口NAT调试信息:

R2#
*Mar  1 00:09:25.415: NAT*: s=192.168.1.1->23.1.1.2, d=3.3.3.3 [15]
*Mar  1 00:09:25.479: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.1.1 [15]
*Mar  1 00:09:25.543: NAT*: s=192.168.1.1->23.1.1.2, d=3.3.3.3 [16]
*Mar  1 00:09:25.607: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.1.1 [16]
*Mar  1 00:09:25.671: NAT*: s=192.168.1.1->23.1.1.2, d=3.3.3.3 [17]
*Mar  1 00:09:25.735: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.1.1 [17]
*Mar  1 00:09:25.787: NAT*: s=192.168.1.1->23.1.1.2, d=3.3.3.3 [18]
*Mar  1 00:09:25.807: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.1.1 [18]
*Mar  1 00:09:25.827: NAT*: s=192.168.1.1->23.1.1.2, d=3.3.3.3 [19]
*Mar  1 00:09:25.847: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.1.1 [19]
R2#
*Mar  1 00:09:28.151: NAT*: s=192.168.2.1->23.1.1.2, d=3.3.3.3 [20]
*Mar  1 00:09:28.199: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.2.1 [20]
*Mar  1 00:09:28.219: NAT*: s=192.168.2.1->23.1.1.2, d=3.3.3.3 [21]
*Mar  1 00:09:28.239: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.2.1 [21]
*Mar  1 00:09:28.259: NAT*: s=192.168.2.1->23.1.1.2, d=3.3.3.3 [22]
*Mar  1 00:09:28.279: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.2.1 [22]
*Mar  1 00:09:28.299: NAT*: s=192.168.2.1->23.1.1.2, d=3.3.3.3 [23]
*Mar  1 00:09:28.319: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.2.1 [23]
*Mar  1 00:09:28.343: NAT*: s=192.168.2.1->23.1.1.2, d=3.3.3.3 [24]
*Mar  1 00:09:28.359: NAT*: s=3.3.3.3, d=23.1.1.2->192.168.2.1 [24]
R2#

从R2的nat调试信息来看,多个内网的ip地址被映射成了同一个公网ip地址,但是端口NAT会通过不同的端口号来区分不同的内网IP地址,这点可以从nat的转换表中验证。

 

 

查看NAT转换表:

R2#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
icmp 23.1.1.2:3        192.168.1.1:3      3.3.3.3:3          3.3.3.3:3
icmp 23.1.1.2:4        192.168.2.1:4      3.3.3.3:4          3.3.3.3:4
R2#

在NAT转换表中确实通过不同的端口号来映射到不同的内网地址,相对于动态NAT来说,在公网地址不足的情况下,端口NAT比动态NAT要更加节省ip地址的使用。

 

原创文章 317 获赞 280 访问量 24万+

猜你喜欢

转载自blog.csdn.net/qq_35733751/article/details/103174566
今日推荐