简单的来说,NAT是将私有IP地址通过边界路由转换成外网IP地址,在边界路由的NAT地址转换表中记录下这个转换,当外部数据返回时,路由使用NAT技术查询NAT转换表,再将目标地址替换成内网用户IP地址。
RFC1918规定了三块专有的地址,作为私有的内部组网使用:
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
这三块私有地址本身是可路由的,只是公网上的路由器不会转发这三块私有地址的流量;当一个公司内部配置了这些私有地址后,内部的计算机在和外网通信时,公司的边界路由会通过NAT或者PAT技术,将内部的私有地址转换成外网IP,外部看到的源地址是公司边界路由转换过的公网IP地址,这在某种意义上也增加了内部网络的安全性。
这里介绍三种常用的NAT技术:
静态NAT:静态NAT就是一对一的NAT,内部有多少私有地址需要和外部通信,就要配置多少外网IP地址与其对应。
动态NAT:动态NAT是在路由器上配置一个外网IP地址池,当内部有计算机需要和外部通信时,就从地址池里动态的取出一个外网IP,并将他们的对应关系绑定到NAT表中,通信结束后,这个外网地址被释放,可供其他内部IP转换使用,这和DHCP租约IP有相似之处。
PAT(Port address Translation,端口地址转换,也叫端口地址复用):这是最常用的NAT技术,也是IPv4能维持到今天的最重要原因之一,它提供了一种多对一的方式,针对多个内网IP地址,边界路由可以给他们分配一个外网IP,利用这个外网IP的不同端口(不同的端口对应不同的内网IP)和外部进行通信。
内部本地地址(Inside Local Address):内部网络主机使用的IP地址。这些地址一般为私有IP地址,它们不能直接在Internet上路由,因而就不能直接用于对Internet的访问,必须通过网络地址转换,以合法的IP地址的身份来访问Internet。
内部全局地址(Inside Global Address):内部网络使用的公有IP地址,这些地址是向ICANN申请才可取得的公有IP地址。当使用内部本地地址的主机要与Internet通信时,NAT转换时使用的地址。
外部本地地址(Outside Local Address):外部网络主机使用的IP地址,这些地址不一定是公有IP地址。
外部全局地址(Outside Global Address):外部网络主机使用的IP地址。这些地址是全局可路由的公有IP地址。
****1例子说明原理
1.此时当PC 1访问PC 2时,它需要发送数据包,以Y.Y.Y.Y为目的,以10.0.0.1为源。
2.到达gateway,gateway会转发数据包给外部网络,并把数据包修改为以Y.Y.Y.Y为目的,以X.X.X.X为源。
3.PC 2接收到此数据包,会以X.X.X.X为目的,以Y.Y.Y.Y为源,发送返回数据包。
4.到达gateway,gateway会转发数据包给内部网络,并把数据包修改为以10.0.0.1为目的,以Y.Y.Y.Y为源。
10.0.0.0就是PC 1的内部本地地址。
X.X.X.X是PC 1的内部全局地址。
Y.Y.Y.Y是PC 2的外部全局地址。
10.0.0.2是PC 2的外部本地地址
****2在Cisco路由器上配置静态NAT
拓扑图如下
它们处于一个内网环境,R3是这个内网的边界路由,R4是公网上的一台路由器(可以看做是ISP的路由器),各设备IP配置如图所示:
Server1和Server2是两台服务器,一般的我们在做静态NAT的时候,是将服务器的IP地址做成静态的NAT,其他的普通的PC机不会这么做。那么在上述拓扑搭建好,ping通的情况下,我们进行在R3上配置静态的NAT
/*这个接口是内网接口,需要配置成NAT对内接口*/
/*配置成NAT对外接口*/
/*配置静态转换条目,每个内网IP需要和一个外网IP对应*/
R3(config)#interface e0/0 R3(config-if)#ip nat inside R3(config-if)#int s1/0 R3(config-if)#ip nat outside R3(config)#ip nat inside source static 192.168.1.2 12.1.1.100 R3(config)#ip nat inside source static 192.168.1.3 12.1.1.200
我们来查看NAT地址转换表
只有在进行了通信之后,才可以看到如下的结果 R3#show ip nat translations Pro Inside global Inside local Outside local Outside global icmp 12.1.1.100:2 192.168.1.2:2 12.1.1.2:2 12.1.1.2:2 --- 12.1.1.100 192.168.1.2 --- --- --- 12.1.1.200 192.168.1.3 --- ---
****3在Cisco路由器上配置动态NAT
配置动态NAT
R3(config)#interface f0/0 R3(config-if)#ip add 192.168.1.1 255.255.255.0 R3(config-if)#ip nat inside R3(config-if)#no shutdown R3(config-if)#int s1/0 R3(config-if)#ip add 12.1.1.1 255.255.255.0 R3(config-if)#no shutdown R3(config-if)#ip nat outside /* * 配置外网地址池,CCNA是这个地址池的名称, * 外网地址池范围从12.1.1.200-12.1.1.205,6个可用于转换的IP地址, * 子网掩码24位。 */ R3(config)#ip nat pool CCNA 12.1.1.200 12.1.1.205 netmask 255.255.255.0 /* * 设置一个ACL来允许那些内网IP被转换, * 这里是192.168.1.0/24网段都允许被转换。 */ R3(config)#access-list 1 permit 192.168.1.0 0.0.0.255 /*开启动态NAT,允许ACL 1中的私有地址转换成CCNA中的外网IP*/ R3(config)#ip nat inside source list 1 pool CCNA
测试:
Server1(192.168.1.2)----------ping-----------R4(12.1.1.2) /*R4给Server1回送echo reply的时候的源地址是12.1.1.200,而不是192.168.1.2,那么可想而知NAT已经将内网的192.168.1.2转换成了12.1.1.200,**/ R4#debug ip icmp ICMP packet debugging is on R4# *Nov 18 20:24:14.295: ICMP: echo reply sent, src 12.1.1.2, dst 12.1.1.200, topology BASE, dscp 0 topoid 0 /查看NAT的转换表/ R3#show ip nat translations Pro Inside global Inside local Outside local Outside global --- 12.1.1.200 192.168.1.2 --- ---
注意:只有当内网访问了外网之后,外网才可以访问内网,因为在NAT被创建的时候是空的,只有当内网的IP访问外网之后才有相应的转换表项
如上图所示的拓扑
配置PAT
R3#configure terminal R3(config)#interface f0/0 R3(config-if)#ip nat inside R3(config-if)#int s1/0 R3(config-if)#ip nat outside R3(config-if)#exit //这里定义了一个IP地址的NAT地址池,因为有时候我们或许只能申请到一个IPv4地址// R3(config)#ip nat pool PAT 12.1.1.254 12.1.1.254 prefix-length 24 //定义访问控制列表允许内网进行访问// R3(config)#access-list 20 permit 192.168.1.0 0.0.0.255 //实行IP地址的端口复用// R3(config)#ip nat inside source list 20 pool PAT overload
测试
Server1---------------ping-------------R4 查看NAT表,有对应的IP地址和端口号 R3#show ip nat translations Pro Inside global Inside local Outside local Outside global icmp 12.1.1.254:8 192.168.1.2:8 12.1.1.2:8 12.1.1.2:8
也就是说,我们可以将公网的IP地址配置在R3的S1/0 接口上吗????
配置
R3(config)#interface f0/0 R3(config-if)#ip nat inside R3(config-if)#int s1/0 R3(config-if)#ip nat outside R3(config-if)#exit //定义如下的访问控制列表允许内网NAT// R3(config)#access-list 50 permit 192.168.1.0 0.0.0.255 //直接将内网的IP地址转换成R3上的s1/0的接口IP地址// R3(config)#ip nat inside source list 50 interface s1/0 overload
测试
Server1--------ping-------R4 Server2--------ping-------R4 //查看R3上的NAT转换表项,R3上的S1/0接口IP地址是12.1.1.1,server1和server2访问外网的时候都被转换成了12.1.1.1// R3#show ip nat translations Pro Inside global Inside local Outside local Outside global icmp 12.1.1.1:11 192.168.1.2:11 12.1.1.2:11 12.1.1.2:11 icmp 12.1.1.1:3 192.168.1.3:3 12.1.1.2:3 12.1.1.2:3 //但是我们来想一想,如果我们从外网来访问内网12.1.1.1呢,我们就永远都不可能访问内网了,因为R3不知道这个数据是发给那个内网的IP地址的//
我们内网1向ISP申请IP地址是200.1.1.200,内网2向ISP申请的IP地址是201.1.1.201,这个IP地址不在10 .1.1.0/24网段,那么这个时候,我们应该怎么办呢?
解决方法是:在R1和R2上创建换回口地址分别为200.1.1.254和201.1.1.254,然后将这两个网段通过路由协议通告出去。
///如下是在R1上做的NAT和路由协议发布/// R1(config)#interface f0/0 R1(config-if)#ip nat inside R1(config-if)#int s1/0 R1(config-if)#ip nat outside R1(config)#access-list 1 permit 192.168.1.0 0.0.0.255 R1(config)#ip nat pool PAT 200.1.1.200 200.1.1.200 netmask 255.255.255.0 R1(config)#ip nat inside source list 1 pool PAT overload R1(config)#interface loopback 0 R1(config-if)#ip add 200.1.1.254 255.255.255.0 R1(config-if)#no shutdown //通过EIGRP将网段发布出去// R1(config)#router eigrp 100 R1(config-router)#no auto-summary R1(config-router)#network 10.1.1.0 0.0.0.255 R1(config-router)#network 200.1.1.0 0.0.0.255 ///如下是在R2上做的NAT和路由协议发布/// R2(config)#interface f0/0 R2(config-if)#ip nat inside R2(config-if)#int s1/0 R2(config-if)#ip nat outside R2(config)#interface loopback 0 R2(config-if)#ip add 201.1.1.254 255.255.255.0 R2(config-if)#no shutdown R2(config)#access-list 1 permit 192.168.0.0 0.0.0.255 R2(config)#ip nat pool PAT 201.1.1.201 201.1.1.201 netmask 255.255.255.0 R2(config)#ip nat inside source list 1 pool PAT overload ////通过EIGRP将网段发布出去//// R2(config)#router eigrp 100 R2(config-router)#no auto-summary R2(config-router)#network 10.1.1.0 0.0.0.255 R2(config-router)#network 201.1.1.0 0.0.0.255
本文出自 “好好活着” 博客,转载请与作者联系!