NAT(Network Address Translation,网络地址转换),是一种把内部私有地址转换成外部公有地址的技术,简单来理解,NAT技术在局域网是使用内部私有地址通信的,但是当局域网的主机想要和外部互联网进行通信时,会在网关设备处将主机的局域网私有地址翻转成互联网的公有地址,可以使主机接入互联网从而进行网络通信。
特别是就国内目前的环境来说,普遍都是使用NAT技术来访问互联网的,NAT技术在一定程度上可以解决公有地址不足所带来的的问题。
NAT技术通常是应用在路由器,防火墙等设备,NAT主要有三种类型:
动态NAT(Dynamic NAT,简称DAT)在把内部网络的私有IP地址转换成公有IP地址时,采用动态的方法随机分配一个公有IP地址。也就是说,当内部网络的主机需要接入互联网时,动态NAT就会随机分配一个公有的IP地址,另外,动态NAT还需要指定哪些内部地址是可以转换的,哪些地址可以作为合法的公有地址使用的。
NAT技术通常应用在局域网内的主机要接入互联网的场景,下面通过实验来深入学习动态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地址已经枯竭的情况下并不能节省地址的使用,因为每个私有地址必须要映射到一个公有地址。
端口NAT跟动态NAT的原理是相同的,不同的是,端口NAT是将内网的ip地址转换成公网的一个公有ip地址的不同端口上,也就是说在这个公有ip地址加上一个由端口NAT技术选定的一个TCP端口号。通过不同的端口号来区分不同的内网ip地址。
一般部署端口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
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地址的使用。